我无法卷曲使用TLS1.2的HTTPS网址,在我的curl操作中,我将登录数据发布到网站并将其保存在cookiefile中。 我得到的错误信息是
error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error
我已尝试将VERIFYPEER
和VERIFYHOST
设为0,但这似乎不起作用,有什么建议吗?
以下是我使用的版本:
以下是代码:
$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);
答案 0 :(得分:49)
您必须使用CURLOPT_SSLVERSION
值的整数值,不上面列出的字符串
试试这个:
curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 6); //Integer NOT string TLS v1.2
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)。
答案 1 :(得分:24)
答案 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
我使用以下命令更新了库:
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月底之前更新)
答案 3 :(得分:1)
替换以下
curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1_2');
使用
curl_setopt ($ch, CURLOPT_SSLVERSION, 6);
应该完美无瑕地工作。
答案 4 :(得分:0)
TLS 1.2
仅在OpenSSL 1.0.1
后支持(请参阅Major version releases section),您必须更新OpenSSL
。
没有必要设置CURLOPT_SSLVERSION
选项。该请求涉及握手,它将应用最新的TLS
版本的服务器和客户端支持。您请求的服务器正在使用TLS 1.2
,因此如果您的php_curl
版本(或更新版本)TLS 1.2
,则OpenSSL
将使用1.0.1
(默认情况下) }。