TLS 1.2 在 cURL 中不起作用

Posted

技术标签:

【中文标题】TLS 1.2 在 cURL 中不起作用【英文标题】:TLS 1.2 not working in cURL 【发布时间】:2015-07-20 14:59:22 【问题描述】:

我在卷曲使用 TLS1.2 的 HTTPS url 时遇到问题,在我的 curl 操作中,我将登录数据发布到网站并将其保存在 cookiefile 中。 我得到的错误信息是这样的

 error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error

我尝试将 VERIFYPEERVERIFYHOST 设置为 0,但这似乎不起作用,有什么建议吗?

这是我正在使用的版本:

OpenSSL 版本为 0.9.8b CURL 版本为 7.24.0 php 是 5.3

代码如下:

$setuplogin = curl_init(); 
curl_setopt ($setuploginurl, CURLOPT_URL, $url); 
curl_setopt ($setuploginurl, CURLOPT_SSL_VERIFYPEER, 1); 
curl_setopt ($setuploginurl, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt ($setuploginurl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1_2');
curl_setopt ($setuploginurl, CURLOPT_POSTFIELDS, 'username=uname&password=pword&act=login&submit=Login');
curl_setopt ($setuploginurl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/42.0.2311.135 Safari/537.36"); 
curl_setopt (setuploginurl, CURLOPT_TIMEOUT, 60); 
curl_setopt ($setuploginurl, CURLOPT_COOKIESESSION, TRUE); 
curl_setopt ($setuploginurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($setuploginurl,  CURLOPT_HEADER, 1);
curl_setopt ($setuploginurl,CURLOPT_ENCODING,"gzip");
curl_setopt ($setuploginurl, CURLOPT_POST, true);
curl_setopt ($setuploginurl, CURLOPT_COOKIEJAR, 'cookies.txt'); 
curl_setopt ($setuploginurl, CURLOPT_FRESH_CONNECT , 1);

$loginp= curl_exec($setuploginurl); 
if ($loginp === FALSE) 
    die(curl_error($setuploginurl));


curl_close ($setuploginurl); 
var_dump ($loginp);

【问题讨论】:

CURLOPT_SSL_VERIFYHOST 应该使用 2,而不是 1。 我不知道这是否是自动的,但切换到 PHP v 5.6.33 解决了我的问题。 【参考方案1】:

自 OpenSSL 1.0.1 起支持 TLS 1.1 和 TLS 1.2

自 curl 7.34.0 起才支持强制 TLS 1.1 和 1.2

您应该考虑升级。

【讨论】:

Curl 也只添加到版本 7.34.0 的 TLS 1.2 中 升级到 OpenSSL 1.0.1 为我解决了类似的问题。 必须 yum 更新 nss openssl curl 才能在 Centos 6.4 上运行。 @LPPapillon 非常感谢! :) 这也为我解决了错误:) @hannele 您指定的文档用于强制 tls 1.2。 Libcurl 在早期版本中支持此协议。【参考方案2】:

CURLOPT_SSLVERSION 值必须使用整数值,不是上面列出的字符串

试试这个:

curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); // constant NOT string value

http://php.net/manual/en/function.curl-setopt.php

value 应该是选项参数的以下值的整数: CURLOPT_SSLVERSION

其中之一:

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_SSLVERSION_TLSv1_2 - 只需要是一个常量,即,不在引号中。 curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); 为我工作。 CURL_SSLVERSION_TLSv1_2 这可从 php 5.5.19 获得,在 php 5.3 中它不起作用。 TX 这么多发布这个...帮助我! @KavinD 该常量首次添加到 PHP 的版本是 5.5.19 和 5.6.3。【参考方案3】:

替换关注

curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1_2');

curl_setopt ($ch, CURLOPT_SSLVERSION, 6);

应该完美无缺。

【讨论】:

不要这样做。您正在硬编码一个对阅读您的代码的人来说毫无意义的整数。相反...只需删除撇号并使用常量。【参考方案4】:

我在 Stripe 的上下文中有类似的问题:

错误:Stripe 不再支持使用 TLS 1.0 发出的 API 请求。 请使用 TLS 1.2 或更高版本启动 HTTPS 连接。你可以学习 更多信息请访问https://stripe.com/blog/upgrading-tls。

使用 CURL 参数强制 TLS 1.2 是临时解决方案,甚至由于缺少放置更新的空间而无法应用。默认情况下 TLS 测试函数https://gist.github.com/olivierbellone/9f93efe9bd68de33e9b3a3afbd3835cf 显示如下配置:

SSL version: NSS/3.21 Basic ECC
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000105f
TLS test (default): TLS 1.0
TLS test (TLS_v1): TLS 1.2
TLS test (TLS_v1_2): TLS 1.2

我使用以下命令更新了库:

yum update nss curl openssl

然后看到了这个:

SSL version: NSS/3.21 Basic ECC
SSL version number: 0
OPENSSL_VERSION_NUMBER: 1000105f
TLS test (default): TLS 1.2
TLS test (TLS_v1): TLS 1.2
TLS test (TLS_v1_2): TLS 1.2

请注意默认 TLS 版本已更改为 1.2!全球解决的问题。这也将帮助 PayPal 用户:https://www.paypal.com/au/webapps/mpp/tls-http-upgrade(2017 年 6 月底前更新)

【讨论】:

只是想补充一点,在此之后您需要重新启动 apache。谢谢【参考方案5】:

TLS 1.2 仅支持自 OpenSSL 1.0.1(参见 Major version releases section),您必须更新您的 OpenSSL

没有必要设置CURLOPT_SSLVERSION 选项。该请求涉及握手,它将应用服务器和客户端支持的最新TLS 版本。您请求的服务器正在使用TLS 1.2,因此如果您的OpenSSL 版本是(或更新于)1.0.1,那么您的php_curl 也将使用TLS 1.2(默认情况下)。

【讨论】:

以上是关于TLS 1.2 在 cURL 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

php curl在本地主机中不起作用

echo在PhpStorm中的Curl中不起作用

Bash:将变量插入到 curl 调用中不起作用[重复]

百分号 % 在 crontab 中不起作用

CURLOPT_TIMEOUT 在 php / windows 中不起作用?

环聊api json在批处理脚本中不起作用