我使用PHP中的curl库(带有NSS)连接到我的另一台服务器。直到上周,由于贵宾犬漏洞(顺便说一下CloudFlare),目标服务器停止支持SSLv3,一切都很好。现在,我正在尝试使用TLS进行连接,但仍然收到"SSL连接错误"。
有一个示例代码,我正在使用:
$ch = curl_init();
curl_setopt_array( $ch, array(
CURLOPT_URL => 'https://www.lumiart.cz',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSLVERSION => 1,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_VERBOSE => true
) );
$output = curl_exec( $ch );
echo $output;
print_r( curl_getinfo( $ch ) );
echo 'error:' . curl_error( $ch );
curl_close($ch);
根据我的理解,将CURLOPT_SSLVERSION
设置为1
应该强制通过TLS进行连接。
注意:我有CURLOPT_SSL_VERIFYPEER => false
只是为了调试,一旦我解决了这个问题,我就不想把它留在那里。
这是输出:
Array
(
[url] => https://www.lumiart.cz
[content_type] =>
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0
[namelookup_time] => 2.3E-5
[connect_time] => 0.005777
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0
[redirect_time] => 0
[certinfo] => Array
(
)
[primary_ip] => 2400:cb00:2048:1::681c:86f
[redirect_url] =>
)
error:SSL connect error
我在共享主机提供商那里有所有这些,所以我不能更改任何php.ini配置或更新任何组件。我只有phpinfo()。我已经检查了这些组件版本上的TLS支持,应该没问题。以下是phpinfo:的摘录
PHP Version 5.4.32
System Linux wl42-f262 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64
curl:
cURL support enabled
cURL Information 7.19.7
Age 3
Features
AsynchDNS No
Debug No
GSS-Negotiate Yes
IDN Yes
IPv6 Yes
Largefile Yes
NTLM Yes
SPNEGO No
SSL Yes
SSPI No
krb4 No
libz Yes
CharConv No
Protocols tftp, ftp, telnet, dict, ldap, ldaps, http, file, https, ftps, scp, sftp
Host x86_64-redhat-linux-gnu
SSL Version NSS/3.15.3
ZLib Version 1.2.3
libSSH Version libssh2/1.4.2
我认为,这个问题是使用SSLv3而不是TLS,但我不能100%确定。我得到的只是"SSL连接错误",我不知道如何找出连接使用的SSL版本。
有没有办法,如何检查,哪个SSL版本用于连接?还是我错过了什么?
这是一个有趣的问题。
如果你查询这个网站的SSLAbs,你会发现它只支持各种ECDHE-ECDSA-*密码,而不支持其他密码。但是,在curl的版本历史中,您会发现ECC密码和NSS库(您使用的)的错误,该错误仅在curl 7.36版本中修复"NSS:allow to use ECC ciphers if NSS implemented they"。
由于您使用的是curl 7.19.7,您的curl太旧了,无法将必要的密码与NSS库一起使用。这意味着您需要升级您的curl库。
我有Curl 7.21.7和PHP 5.4.34,这个似乎对我来说很有用:
curl_setopt($curl_request, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
这里有更多信息,但没有说明CURL_SSLVERSION_TLSv1是何时引入的。
我的答案是使用整数值而不是字符串。。即:更改:
curl_setopt($ch, CURLOPT_SSLVERSION_TLSv1_2);
收件人:
curl_setopt($ch, CURLOPT_SSLVERSION, 6);
或者对于tlsv1_1:
curl_setopt($ch, CURLOPT_SSLVERSION, 5);
以下是完整列表:
CURL_SSLVERSION_DEFAULT (0)
CURL_SSLVERSION_TLSv1 (1)
CURL_SSLVERSION_SSLv2 (2)
CURL_SSLVERSION_SSLv3 (3)
CURL_SSLVERSION_TLSv1_0 (4)
CURL_SSLVERSION_TLSv1_1 (5)
CURL_SSLVERSION_TLSv1_2 (6)
顺便说一下,我正在运行以下内容:
curl-7.19.7-46.el6.x86_64
nss-3.21.0-0.3.el6_7.x86_64
重复应答SSL错误无法更改为TLS建议:
尝试将CURLOPT_SSL_CIPHER_LIST=>"TLSv1"添加到PPHttpConfig.php。
(并在此处讨论了将PHP cURL请求从SSLv3更新为TLS.?)。
正如有用的评论,这适用于opensslcurl库,而不是nss。