当前位置:   article > 正文

curl php tls1.2,关于php:TLS 1.2在cURL中不起作用

curl tls1.2

我在卷曲使用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);

应该完美地工作。

不要这样做。 您正在硬编码一个整数,这对于阅读您的代码的人来说是没有意义的。 相反...只需除去撇号并使用常数。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号