【问题标题】:How to get file_get_contents() to work with HTTPS?如何让 file_get_contents() 使用 HTTPS?
【发布时间】:2010-12-30 20:00:59
【问题描述】:

我正在设置信用卡处理,需要使用 CURL 的解决方法。以下代码在我使用测试服务器(未调用 SSL URL)时运行良好,但现在当我在使用 HTTPS 的工作服务器上对其进行测试时,它失败并显示错误消息“无法打开流”。

function send($packet, $url) {
  $ctx = stream_context_create(
    array(
      'http'=>array(
        'header'=>"Content-type: application/x-www-form-urlencoded",
        'method'=>'POST',
        'content'=>$packet
      )
    )
  );
  return file_get_contents($url, 0, $ctx);
}

【问题讨论】:

    标签: php curl https file-get-contents


    【解决方案1】:

    这可能是由于您的目标服务器没有有效的 SSL 证书。

    【讨论】:

    • 请求服务器不需要 SSL 证书。
    • 我没有说请求服务器,我说的是目标服务器。
    • 那会教我略读。呵!请接受我的道歉并投票。
    • 目标服务器确实有一个有效的 SSL 证书。
    • @James,如果您尝试使用 cURL 连接,您会收到错误消息吗?或者这绝对不可能尝试?
    【解决方案2】:

    如果您编译时支持 OpenSSL,则从 PHP 4.3.0 开始支持 HTTPS。 另外,请确保目标服务器具有有效的证书,防火墙允许出站连接,并且 php.ini 中的 allow_url_fopen 设置为 true。

    【讨论】:

    • 我有支持 OpenSSL 的 PHP 5.2.8。我遇到了同样的错误,并且目标服务器有一个有效的证书。
    • 防火墙是否配置为允许出站 https 连接?通常,运行 https 的网络服务器不会在端口 80 上运行。除了“无法打开流”之外,错误中还有其他内容吗?
    • 据我所知,这是整个错误:警告:fopen(https://...)[function.fopen]:无法打开流:没有这样的文件或目录在 /home/user/public_html/test.php 第 993 行
    • 和 php.ini 中的 allow_url_fopen 设置为什么?
    • 这很奇怪。你能在 HTTP 和 HTTPS 网址上执行 GET 以查看是否有效吗?没有流上下文?
    【解决方案3】:

    尝试以下脚本,看看是否有可用于您的 php 脚本的 https 包装器。

    $w = stream_get_wrappers();
    echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
    echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
    echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
    echo 'wrappers: ', var_export($w);
    

    输出应该是这样的

    openssl: yes
    http wrapper: yes
    https wrapper: yes
    wrappers: array(11) {
      [...]
    }
    

    【讨论】:

    • @volker 这就是我要求 allow_url_fopen 的原因
    • 奇怪的是它说 openssl 是关闭的,但是根据 phpinfo() 它是用它编译的,除非我看错了。
    • phpinfo() 在配置行中告诉你,还是有一个名为“OpenSSL”的整个部分?
    • 好的,它只是在配置行中,而不是它的部分。我想这就是问题所在?
    • 我拥有了所有这些,但它仍然无法正常工作。和allow_url_fopen。只有非 https url 可以从 localhost 工作。
    【解决方案4】:

    有时,服务器会根据它在 http 请求标头中看到或未看到的内容(例如适当的用户代理)选择不响应。如果您可以连接浏览器,请获取它发送的标头并在您的流上下文中模仿它们。

    【讨论】:

      【解决方案5】:

      我有同样的错误。在php.ini 中设置allow_url_include = On 为我修复了它。

      【讨论】:

        【解决方案6】:

        要允许 https 包装器:

        • php_openssl 扩展必须存在并启用
        • allow_url_fopen 必须设置为 on

        在 php.ini 文件中,如果不存在,则应添加以下行:

        extension=php_openssl.dll
        
        allow_url_fopen = On
        

        【讨论】:

        • 在我的安装中两者都设置为开启,但我仍然收到 SSL 错误“警告:file_get_contents(): SSL: Handshake timed out in”
        【解决方案7】:

        试试下面的。

        function getSslPage($url) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_REFERER, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            $result = curl_exec($ch);
            curl_close($ch);
            return $result;
        }
        

        注意:这会禁用 SSL 验证,这意味着 提供的安全性 通过 HTTPS 丢失。仅将此代码用于测试/本地 开发,从未在互联网上或其他面向公众的 网络。如果此代码有效,则表示 SSL 证书无效 受信任或无法验证,您应该考虑将其修复为 单独的问题。

        【讨论】:

        • 在处理信用卡时为什么要禁用 ssl 验证?
        • 谢谢,诀窍就在这里:curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        【解决方案8】:

        在我的情况下,问题是由于 WAMP 为 CLI 使用的 php.ini 与 Apache 不同,因此您通过 WAMP 菜单进行的设置不适用于 CLI。只需修改 CLI php.ini 即可。

        【讨论】:

          【解决方案9】:

          只需在 php.ini 文件中添加两行。

          extension=php_openssl.dll

          allow_url_include = On

          它对我有用。

          【讨论】:

          • 您的意思可能是allow_url_fopen,因为问题涉及网址打开,不包括。
          【解决方案10】:
          $url= 'https://example.com';
          
          $arrContextOptions=array(
                "ssl"=>array(
                      "verify_peer"=>false,
                      "verify_peer_name"=>false,
                  ),
              );  
          
          $response = file_get_contents($url, false, stream_context_create($arrContextOptions));
          

          这将允许您从 url 获取内容,无论它是否是 HTTPS

          【讨论】:

          • 谢谢!这对我有用。一直在尝试调用 FB Open Graph API :)
          • 出于测试目的,我试图使用无效证书访问我的域,即使这会禁用 SSL 验证,这也是我所需要的。
          • 太棒了!我一直在尝试使用 file_get_contents 在我的 XAMPP 测试站点上下载 airbnb 日历 5 天,这解决了问题,谢谢。
          • 为我工作,试图在没有有效 HTTP 证书的情况下通过 https 连接到 Vagrant 测试框。链接到此处设置的 PHP SSL 上下文选项:php.net/manual/en/context.ssl.php; verify peer = 需要验证使用的 SSL 证书; verify_peer_name=需要验证对等体名称。
          • 这不是破坏 SSL 认证,是一个安全漏洞吗?
          【解决方案11】:

          检查网址是否正常

          您问题中的代码可以重写为工作版本:

          function send($packet=NULL, $url) {
          // Do whatever you wanted to do with $packet
          // The below two lines of code will let you know if https url is up or not
          $command = 'curl -k '.$url;
          return exec($command, $output, $retValue);
          }
          

          【讨论】:

            【解决方案12】:

            我被 IIS 上的非功能性 https 卡住了。解决方法:

            file_get_contents('https..) 不会加载。

            • 下载https://curl.haxx.se/docs/caextract.html
            • 安装在 ..phpN.N/extras/ssl 下
            • 编辑 php.ini :

              curl.cainfo = "C:\Program Files\PHP\v7.3\extras\ssl\cacert.pem" openssl.cafile="C:\Program Files\PHP\v7.3\extras\ssl\cacert.pem"

            终于!

            【讨论】:

              【解决方案13】:

              使用以下代码:

              $homepage = file_get_contents("https://www.google.com",false,
                                           stream_context_create([
                                              'ssl'  => [
                                                  'verify_peer'      => false,
                                                  'verify_peer_name' => false,
                                              ]
                                          ])
                          );
                  
               echo $homepage;
              

              【讨论】:

                猜你喜欢
                • 2015-05-01
                • 1970-01-01
                • 2012-07-12
                • 2016-05-29
                • 2013-01-23
                • 2020-08-02
                • 1970-01-01
                相关资源
                最近更新 更多