file_get_contents():SSL操作失败,代码为1.还有更多

 WYZ的小舟于SZ 发布于 2022-12-18 18:18

我一直在尝试从我在服务器上创建的PHP页面访问这个特定的REST服务.我将问题缩小到这两行.所以我的PHP页面如下所示:


该页面在第2行死亡,并出现以下错误:

警告:file_get_contents():SSL操作失败,代码为1. OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败...第2行的php

警告:file_get_contents():无法在第2行的... php中启用加密

警告:file_get_contents(https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json):无法打开流:第2行的... php操作失败

我们正在使用Gentoo服务器.我们最近升级到PHP 5.6版.升级后出现此问题.

我发现,当我一个地址替换REST服务一样https://www.google.com; 我的页面工作正常.

在我之前的一次尝试中,我将“verify_peer”=>false其作为参数传递给file_get_contents,如下所述: file_get_contents忽略verify_peer => false? 但就像作者所指出的那样; 它没有任何区别.

我问过我们的服务器管理员是否存在php.ini文件中的这些行:

延长= php_openssl.dll

allow_url_fopen =开

他告诉我,因为我们在Gentoo上,openssl是在我们构建时编译的; 并且它没有在php.ini文件中设置.

我也证实这allow_url_fopen是有效的.由于这个问题的专业性; 我没有找到很多帮助信息.有没有人遇到过这样的事情?谢谢.

9 个回答
  • 你不应该只关闭验证.相反,你应该下载一个证书包,也许curl包会做什么?

    然后你只需要把它放在你的web服务器上,给运行php权限的用户读取文件.那么这段代码应该适合你:

    $arrContextOptions=array(
        "ssl"=>array(
            "cafile" => "/path/to/bundle/cacert.pem",
            "verify_peer"=> true,
            "verify_peer_name"=> true,
        ),
    );
    
    $response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json", false, stream_context_create($arrContextOptions));
    

    希望您尝试访问的站点的根证书位于curl包中.如果不是,则在获得站点的根证书并将其放入证书文件之前,这仍然无效.

    2022-12-18 18:19 回答
  • 我通过确保在我的机器上安装了OpenSSL然后将其添加到我的php.ini来修复此问题:

    openssl.cafile=/usr/local/etc/openssl/cert.pem
    

    2022-12-18 18:19 回答
  • 您可以通过编写使用curl的自定义函数来解决此问题,如下所示:

    function file_get_contents_curl( $url ) {
    
      $ch = curl_init();
    
      curl_setopt( $ch, CURLOPT_AUTOREFERER, TRUE );
      curl_setopt( $ch, CURLOPT_HEADER, 0 );
      curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
      curl_setopt( $ch, CURLOPT_URL, $url );
      curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, TRUE );
    
      $data = curl_exec( $ch );
      curl_close( $ch );
    
      return $data;
    
    }
    

    然后只需使用file_get_contents_curl而不是file_get_contents每当您调用以https开头的网址时.

    2022-12-18 18:19 回答
  • 您基本上必须将环境变量SSL_CERT_FILE设置为从以下链接下载的ssl-certificate的PEM文件的路径:http://curl.haxx.se/ca/cacert.pem.

    我花了很多时间来解决这个问题.

    2022-12-18 18:19 回答
  • 以下步骤将解决此问题,

      从以下链接下载CA证书:https://curl.haxx.se/ca/cacert.pem

      找到并打开php.ini

      查找curl.cainfo并粘贴下载证书的绝对路径.curl.cainfo ="C:\wamp\htdocs\cert\cacert.pem"

      重启WAMP/XAMPP(apache服务器).

      有用!

    希望有所帮助!!

    2022-12-18 18:19 回答
  • 这是一个非常有用的链接,可以找到:

    http://php.net/manual/en/migration56.openssl.php

    一个官方文档描述了在PHP 5.6中打开ssl所做的更改从这里我学到了另一个我应该设置为false的参数:"verify_peer_name"=> false

    所以我的工作代码如下所示:

    <?php
    $arrContextOptions=array(
        "ssl"=>array(
            "verify_peer"=>false,
            "verify_peer_name"=>false,
        ),
    );  
    
    $response = file_get_contents("https://maps.co.weber.ut.us/arcgis/rest/services/SDE_composite_locator/GeocodeServer/findAddressCandidates?Street=&SingleLine=3042+N+1050+W&outFields=*&outSR=102100&searchExtent=&f=json", false, stream_context_create($arrContextOptions));
    
    echo $response; ?>
    

    2022-12-18 18:20 回答
  • 为我工作,我正在使用PHP 5.6。应该启用openssl扩展名,并在调用google map api verify_peer时使false以下代码对我有用。

    <?php
    $arrContextOptions=array(
        "ssl"=>array(
             "verify_peer"=>false,
             "verify_peer_name"=>false,
        ),
    );  
    $url = "https://maps.googleapis.com/maps/api/geocode/json?latlng="
          . $latitude
          . ","
          . $longitude
          . "&sensor=false&key="
          . Yii::$app->params['GOOGLE_API_KEY'];
    
    $data = file_get_contents($url, false, stream_context_create($arrContextOptions));
    
    echo $data;
    ?>
    

    2022-12-18 18:20 回答
  • 如果您的PHP版本是5,请尝试通过在终端中键入以下命令来安装cURL:

    sudo apt-get install php5-curl
    

    2022-12-18 18:20 回答
  • 由于我遇到了同样的问题,我只是想补充一下,在任何地方都找不到任何东西(例如,下载cacert.pem文件,在php.ini中设置cafile等)。

    如果您使用的是NGINX,并且SSL证书随附“中间证书”,则需要将中间证书文件与主“ mydomain.com.crt”文件组合在一起,并且文件应该可以正常工作。Apache有一个专门针对中间证书的设置,但是NGINX没有,因此它必须与常规证书位于同一文件中。

    2022-12-18 18:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有