25

我无法卷曲使用 TLS1.2 的 HTTPS url,在我的 curl 操作中,我将登录数据发布到网站并将其保存在 cookiefile 中。我收到的错误消息是这样的

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

我尝试将VERIFYPEERand设置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);
4

5 回答 5

54

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

尝试这个:

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

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

对于 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)
于 2015-10-03T19:50:12.217 回答
27

自OpenSSL 1.0.1起支持 TLS 1.1 和 TLS 1.2

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

你应该考虑升级。

于 2015-05-09T21:30:53.577 回答
14

我在 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

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

百胜更新 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 月结束前更新)

于 2017-03-08T23:09:42.983 回答
2

TLS 1.2仅受支持,因为OpenSSL 1.0.1(请参阅主要版本发布部分),您必须更新您的OpenSSL.

无需设置CURLOPT_SSLVERSION选项。该请求涉及握手,它将应用TLS服务器和客户端支持的最新版本。您请求的服务器正在使用TLS 1.2,因此如果您的版本是(或更新) ,您php_curl也将使用TLS 1.2(默认情况下) 。OpenSSL1.0.1

于 2018-04-27T09:16:11.053 回答
0

替换以下

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

curl_setopt ($ch, CURLOPT_SSLVERSION, 6);

应该完美无缺地工作。

于 2016-11-04T11:00:38.787 回答