无法通过HTTPS进行file_get_contents或cURL

Pro*_*irl 10 php https curl file-get-contents

我多年来一直file_get_contents用来抓住网站的内容.

最近,他们更新了他们的URL HTTPSfile_get_contents停止了工作.

我已经阅读过以前的问题并尝试过标记的解决方案,但没有任何效果.

例如,我试过这个,它返回以下内容:

openssl: yes http wrapper: yes https wrapper: yes wrappers: array ( 0 => 'https', 1 => 'ftps', 2 => 'compress.zlib', 3 => 'compress.bzip2', 4 => 'php', 5 => 'file', 6 => 'data', 7 => 'http', 8 => 'ftp', 9 => 'zip', )
Run Code Online (Sandbox Code Playgroud)

于是我尝试这个解决方案file_get_contents,但没有成功.

然后,我尝试这种解决方案具有cURL完全忽略加密,无济于事

无论我尝试哪种解决方案,都不会返回任何内容.

我还没有加入extension=php_openssl.dll,并allow_url_include = OnPHP.ini按照为这个特别的网站是一个共享主机和托管公司不允许在php.ini申请进行编辑,虽然他们可能已经默认启用.

我尝试了其他HTTPS网站,有些工作,有些没有,我不知道为什么.

我尝试在同一个Web主机上使用不同的服务器(和不同的IP),但它也无法与目标HTTPS站点一起使用.

我该如何调试和解决这个问题?

更新:

phpinfo显示:

curl cURL support enabled cURL Information libcurl/7.36.0 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5 libssh2/1.8.0

openssl OpenSSL support enabled OpenSSL Version OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008

Mis*_*ood 5

最终答案

如果您的 ISP 不会将 openSSL 升级到 TLS 1.2,您应该认真考虑另一个 ISP。您应该使用下面的“SSL SERVER TEST”链接来测试您的服务器。您的服务器可能存在 SSL 安全漏洞。

您尝试连接的服务器仅支持 TLS 1.2 和 TLS 1.1
不支持:TLS 1.0、SSL 3、SSL2。

当发出 SSL 请求时,作为 SSL 协议的一部分,curl 向主机服务器提供密码列表。然后服务器根据 curl 提供的列表选择要使用的密码协议。

您尝试连接的主机支持这些密码套件

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)  
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)  
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x9f) 
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x9e)  
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (0xc028)  
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)  
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (0x6b)  
TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x39) 
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (0xc027) 
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)  
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (0x67)  
TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x33) 
TLS_RSA_WITH_AES_256_GCM_SHA384 (0x9d) 
TLS_RSA_WITH_AES_128_GCM_SHA256 (0x9c) 
TLS_RSA_WITH_AES_256_CBC_SHA256 (0x3d) 
TLS_RSA_WITH_AES_256_CBC_SHA (0x35) 
TLS_RSA_WITH_AES_128_CBC_SHA256 (0x3c) 
TLS_RSA_WITH_AES_128_CBC_SHA (0x2f) 
Run Code Online (Sandbox Code Playgroud)

因为您的 openSSL 于 2008 年 7 月发布,而 TLSv1.2 于下个月即 2008 年 8 月发布,所以您拥有的最好的是 TLSv1.1

可能的临时修复,直到您升级

我没有高度的信心这对你有用

您应该使用类似SSL SERVER TEST 的内容来测试您自己的服务器的 SSL

如果您的服务器支持 TLS1.1,那么您可以尝试以下操作。我无法对此进行测试,因为我没有与您在旧服务器上使用您的 openSSL 版本相同的 curl 版本。

使用 curl 选项 CURLOPT_SSL_CIPHER_LIST 限制主机服务器使用 TLS 1.1 以外的任何内容

curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
curl_setopt($ch, CURL_SSLVERSION_TLSv1_1);
Run Code Online (Sandbox Code Playgroud)

如果没有,请尝试:

curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'DEFAULT');
curl_setopt($ch, CURL_SSLVERSION_TLSv1_1);
Run Code Online (Sandbox Code Playgroud)

底线

出于比这个问题更多的原因,您需要升级您的 openSSL。

-------------------------------------------------------------------------

 
 -
Run Code Online (Sandbox Code Playgroud)

以前的故障排除低于此点

我做的第一件事是关闭浏览器中的 javascript。如果我可以在没有 javascript 的情况下使用浏览器检索页面,我知道我可以使用 PHP 获取它。

我构建的请求看起来与浏览器中的完全一样。我转到检查器的网络选项卡并编辑请求标头并将其复制并粘贴到我的代码中。

在此处输入图片说明

在此处输入图片说明

$request = array();
$request[] = 'Host: example.com';
$request[] = 'Connection: keep-alive';
$request[] = 'Pragma: no-cache';
$request[] = 'Cache-Control: no-cache';
$request[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8';
$request[] = 'User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36';
$request[] = 'DNT: 1';
$request[] = 'Origin: https://example.com';
$request[] = 'Referer: https://example.com/entry/login';
$request[] = 'Accept-Encoding: gzip, deflate';
$request[] = 'Accept-Language: en-US,en;q=0.8';
Run Code Online (Sandbox Code Playgroud)

初始化卷曲

$url = 'https://example.com/entry/login';
$ch = curl_init($url);
Run Code Online (Sandbox Code Playgroud)

添加请求参数

curl_setopt($ch, CURLOPT_HTTPHEADER, $request);
Run Code Online (Sandbox Code Playgroud)

告诉 curl 包含标题

curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HEADER, true);
Run Code Online (Sandbox Code Playgroud)

返回响应

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
Run Code Online (Sandbox Code Playgroud)

按照重定向 重定向可能是一个陷阱。您可能不必跟踪和分析响应。重定向通常用于设置 cookie。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIESESSION , true );
Run Code Online (Sandbox Code Playgroud)

让 curl 处理压缩

curl_setopt($ch, CURLOPT_ENCODING,"");
Run Code Online (Sandbox Code Playgroud)

设置超时参数

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
curl_setopt($ch, CURLOPT_FAILONERROR,true);
Run Code Online (Sandbox Code Playgroud)

发出请求并得到响应

以下将获得您需要了解的有关请求的所有信息。$info 也将包含所有重定向标头。如果进行了重定向,则 $responseHeader 将包含所有响应标头。

更新:新的经过全面测试的代码

这可能无关紧要,因为这也适用于我的机器:

echo file_get_contents($url);
Run Code Online (Sandbox Code Playgroud)

如果 curl 失败,这段代码应该给你一个失败的原因。

更改网址。 这个属于一个客户。

<?php
header('content-type: text/plain');

$url = 'https://amxemr.com';
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_ENCODING,"");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
curl_setopt($ch, CURLOPT_FAILONERROR,true);
curl_setopt($ch, CURLOPT_ENCODING,"");
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HEADER, true);


$data = curl_exec($ch);
if (curl_errno($ch)){
    echo 'Retreive Base Page Error: ' . curl_error($ch);
}
else {
  $info = rawurldecode(var_export(curl_getinfo($ch),true));

 // Get the cookies:

  $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
  $responseHeader= substr($data,0,$skip);
  $data= substr($data,$skip);
  echo "HEADER: $responseHeader\n";
  echo "\n\nINFO: $info\n\nDATA: $data";
}  
?>
Run Code Online (Sandbox Code Playgroud)

如果上述方法不起作用,请运行 phpinfo()

<?php
phpinfo();
?>  
Run Code Online (Sandbox Code Playgroud)

应该有一个 curl 部分和 openSSL。

在此处输入图片说明

phpinfo openSSL

--------------------------------------------------------------------

更新二

好消息

我知道问题所在,并且能够复制您遇到的错误。

Retreive Base Page Error: 
Unknown SSL protocol error in connection to www.xxxx.com:443 
Run Code Online (Sandbox Code Playgroud)

NOTE xxx 是您给我的链接中的站点,您现在可以删除该消息。

有趣的是,我有一台我没有更新的服务器。幸运的是,它拥有与 2008 年 7 月相同版本的 openSSL。

您需要升级您的 openSSL。此外,该服务器上的 file_get_contents() 也失败了。它适用于 2013 年 2 月版本的 openSSL 以及 2014 年 6 月。

我不能说是否需要升级其他任何东西,例如使用 openSSL 的功能可能(或可能不需要)升级。

我同意这句格言,如果它没有坏就不要修理它。我确实相信一些升级实际上是降级的。我还在XP。但它坏了,你需要修理它。

至少它不是黑暗中的修复。我相信你必须升级。这是一个有条不紊的故障排除程序,能够复制您的错误。你也可以回去使用file_get_contents()