赞
踩
我在卷曲使用TLS1.2的HTTPS URL时遇到麻烦,在卷曲操作中,我将登录数据发布到网站中并将其保存在cookiefile中。
我收到的错误消息是
error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error
我尝试将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);
您应该将2用于CURLOPT_SSL_VERIFYHOST,而不是1。
我不知道这是否是自动的,但是切换到PHP v 5.6.33解决了我的问题。
您必须为CURLOPT_SSLVERSION值使用整数值,而不是上面列出的字符串
尝试这个:
curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 6); //Integer NOT string TLS v1.2
http://php.net/manual/zh/function.curl-setopt.php
对于option参数的以下值,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常量首先在5.5.19和5.6.3版本中添加到PHP。
自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为我解决了类似的问题。
必须要更新nss openssl curl才能使其在Centos 6.4上运行。
@LPPapillon非常感谢! :)也为我修复了错误:)
我在Stripe的上下文中有类似的问题:
Error: Stripe no longer supports API requests made with TLS 1.0.
Please initiate HTTPS connections with TLS 1.2 or later. You can learn
more about this at 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。 谢谢
仅从OpenSSL 1.0.1开始支持TLS 1.2(请参见"主要版本版本"部分),您必须更新OpenSSL。
不必设置CURLOPT_SSLVERSION选项。该请求涉及一次握手,该握手将同时应用服务器和客户端支持的最新TLS版本。您请求的服务器正在使用TLS 1.2,因此,如果您的OpenSSL版本是(或高于)1.0.1,则php_curl也将使用TLS 1.2(默认情况下)。
替换以下
curl_setopt ($setuploginurl, CURLOPT_SSLVERSION, 'CURL_SSLVERSION_TLSv1_2');
用
curl_setopt ($ch, CURLOPT_SSLVERSION, 6);
应该完美地工作。
不要这样做。 您正在硬编码一个整数,这对于阅读您的代码的人来说是没有意义的。 相反...只需除去撇号并使用常数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。