12

我在 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_SSLVERSION1应该强制通过 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 版本用于连接?还是我错过了什么?

4

4 回答 4

21

这是一个有趣的问题。

如果您查询此站点的SSLLabs,您会看到它仅支持各种 ECDHE-ECDSA-* 密码,不支持其他密码。但是,在curl 的版本历史中,您会发现 ECC 密码和 NSS 库(您使用的)的错误,该错误仅在 curl 版本 7.36 "nss: allow to use ECC ciphers if NSS implements"中修复。

由于您使用的是 curl 7.19.7,因此您的 curl 太旧,无法将必要的密码与 NSS 库一起使用。这意味着您需要升级您的 curl 库。

于 2014-10-19T18:06:05.387 回答
13

我有 Curl 7.21.7 和 PHP 5.4.34,这似乎对我有用:

curl_setopt($curl_request, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);

更多信息在这里,虽然它没有说明何时引入 CURL_SSLVERSION_TLSv1。

于 2014-10-31T07:46:38.377 回答
5

我的答案是使用整数值而不是字符串.. 即:更改:

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
于 2016-04-08T20:40:54.167 回答
3

重复答案SSL 错误不能更改为 TLS建议:

尝试将 CURLOPT_SSL_CIPHER_LIST => 'TLSv1' 添加到您的 PPHttpConfig.php。

(并在此处讨论将PHP cURL 请求从 SSLv3 更新为 TLS..?也)。

正如有用的评论,这适用于openssl curl 库,而不是nss

于 2014-11-05T19:18:14.747 回答