TLS 1.2不在cURL中工作

Sam*_*Ash 24 php ssl openssl php-curl

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

 error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error
Run Code Online (Sandbox Code Playgroud)

我试过设置VERIFYPEER并且VERIFYHOST为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);
Run Code Online (Sandbox Code Playgroud)

小智 53

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

试试这个:

curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 6); //Integer NOT string TLS v1.2
Run Code Online (Sandbox Code Playgroud)

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

value应该是option参数的以下值的整数: 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);`对我有用. (6认同)
  • CURL_SSLVERSION_TLSv1_2这可以从php 5.5.19获得,在php 5.3中它无效. (3认同)

小智 24

OpenSSL 1.0.1以来,支持TLS 1.1和TLS 1.2

强制TLS 1.1和1.2仅在卷曲7.34.0后得到支持

你应该考虑升级.

  • Curl 也仅在版本 [7.34.0](http://curl.haxx.se/docs/manpage.html#--tlsv12) 中添加了对 TLS 1.2 的支持 (2认同)
  • 必须 yum 更新 nss openssl curl 才能让它在 Centos 6.4 上运行。 (2认同)
  • @hannele 您指定的文档用于**强制** tls 1.2。Libcurl 在早期版本中支持该协议。 (2认同)

小智 13

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

错误: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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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