Php curl set ssl version


Php curl set ssl version

从 3 天开始,我无法连接到PayPal沙盒。我发现他们可能禁用了对SSLv3的支持。所以我尝试通过设置来更改我的 curl 请求中的 SSL 版本:

curl_setopt($curl, CURLOPT_SSLVERSION,1); # 1 = TLSv1

但它仍然给我同样的错误:

error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

知道为什么脚本仍在使用 SSLv3 吗?

我正在使用php 5.5和以下curl版本(目前正在我的托管商[1&1的托管主机]要求升级到较新版本(

curl 7.21.0

(i486-pc-linux-gnu( libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6Protocols: dict file ftp ftps http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp特点: GSS-协商 IDN IPv6 大文件 NTLM SSL libz

问题是PayPal放弃了对SSLv3,TLS 1.0和TLS 1.1的支持,现在只支持TLS 1.2,但OpenSSL版本cURL是用(0.9.8o(构建的,不支持TLS。

此时,您所能做的就是希望主机可以将OpenSSL,cURL和PHP更新到较新的(1.0+(版本的OpenSSL。

就目前而言,您的cURL客户端不会使用PayPal所需的TLS,除了更新OpenSSL之外,没有其他解决方法。

有同样的问题。

    <?php
error_reporting(E_ALL);
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_URL, 'https://api-3t.sandbox.paypal.com/nvp');
$response =    curl_exec($curl);
var_dump($response);
exit;

响应:

bool(false)

并且没有错误日志!

所以我做了一个小脚本:

<?php
error_reporting(E_ALL);
var_dump(file_get_contents('https://api-3t.sandbox.paypal.com/nvp'));

这是我在日志中得到的内容:

[12-Feb-2016 15:56:19] PHP Warning:  file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure in /xxx/yyy.php on line 3
[12-Feb-2016 15:56:19] PHP Warning:  file_get_contents(): Failed to enable crypto in /xxx/yyy.php on line 3
[12-Feb-2016 15:56:19] PHP Warning:  file_get_contents(https://api-3t.sandbox.paypal.com/nvp): failed to open stream: operation failed in /xxx/yyy.php on line 3

我的解决方案是:

  1. 更新 (1.0+( 版本的 OpenSSL。
  2. 重新编译卷曲
  3. 使用新的 CURL 重新编译 PHP
  4. 确保 Curl SSL 版本为 OpenSSL/(1.0+(

SSL 版本 OpenSSL/1.0.1e – 良好

SSL 版本 NSS/3.13.6.0 – 坏

我运行在 CentOS 上。这是我做了什么来更新:

  1. 更新开放SSL:

    开放SSL版本

如果低于 1.0 运行:yum 更新打开确保它实际已更新

  1. 重新安装 PHP。所以保存php.ini文件
  2. 保留通过以下方式安装的所有 PHP 模块的列表:

    已安装的 yum list | grep php

保存输出!

  1. 百胜擦除 php
  2. yum erase php-curl
  3. 百胜安装PHP
  4. yum install php-curl

  5. 重新启动Apache或FPM,如果幸运的话,你会让事情正常工作

  6. 恢复PHP.ini配置和PHP模块:yum安装php-pgsql;yum安装php-gd;等等

但是,如果您的软件包存储库已过时,或者您安装了带有 NSS SSL 绑定的 curl 库,您可以手动下载和编译 curl 库。我使用了与php-devel软件包捆绑在一起的phpize工具。所以我的问题我遇到了:

cURL Information    7.19.7 
SSL Version     NSS/3.13.6.0

这是我将其更改为以下方法:

cURL Information    7.22.0 
SSL Version     OpenSSL/1.0.1e 
  1. 更新开放SSL:

    开放SSL版本

如果低于 1.0 运行:yum 更新打开确保它实际已更新

  1. 重新安装 PHP。所以保存php.ini文件
  2. 保留通过以下方式安装的所有 PHP 模块的列表:

    已安装的 yum list | grep php

保存输出!

  1. 百胜擦除 php
  2. yum erase php-curl
  3. yum install php-devel
  4. 使用 rpm -qa --queryformat '%{version}' php 打印 PHP 版本,并找到可以下载完全相同的 PHP 源代码的位置
  5. 以下 bash 脚本将安装特定的 curl 库:

<pre>
#!/bin/bash
PHP_VERSION=$(rpm -qa --queryformat '%{version}' php)
CURL_VERSION=7.22.0
#echo $CURL_VERSION
#exit
#wget --no-check-certificate http://mirror.cogentco.com/pub/php/php-${PHP_VERSION}.tar.gz -O /tmp/php-${PHP_VERSION}.tar.gz
wget --no-check-certificate http://museum.php.net/php5/php-${PHP_VERSION}.tar.gz -O /tmp/php-${PHP_VERSION}.tar.gz
wget --no-check-certificate http://curl.haxx.se/download/curl-${CURL_VERSION}.tar.gz -O /tmp/curl-${CURL_VERSION}.tar.gz
cd /tmp; tar xzf php-${PHP_VERSION}.tar.gz
cd /tmp; tar xzf curl-${CURL_VERSION}.tar.gz
cd curl-${CURL_VERSION}
./configure
make
make install
cd /tmp; rm -rf curl-${CURL_VERSION}*
sleep 2
cd /tmp/php-${PHP_VERSION}/ext/curl/
phpize
./configure
make
make install
cd /tmp; rm -rf php-${PHP_VERSION}*
</pre>

  1. 重新启动Apache或FPM,如果幸运的话,你会让事情正常工作
  2. 恢复PHP.ini配置和PHP模块:yum安装php-pgsql;yum安装php-gd;等等

完美,我希望 LibCurl 使用 OpenSSL 而不是 NSS,这有助于我修复它以调整 php libcurl 以使用 OpenSSL。

我的 Centos7 PHP 5.6 正在使用

php -r "print_r(curl_version());" | grep ssl_version
[ssl_version_number] => 0
[ssl_version] => NSS/3.19.1 Basic ECC

在上述修复之后,它表明,这就是我想要的。

php -r "print_r(curl_version());" | grep ssl_version
[ssl_version_number] => 0
[ssl_version] => OpenSSL/1.0.1f

这是我在 Centos7 上使用的修改脚本,PHP 5.6.17

#!/bin/bash
PHP_VERSION=$(rpm -qa --queryformat '%{version}' php56)
CURL_VERSION=$(curl -V|head -1|awk '{print $2}')
wget --no-check-certificate http://mirror.cogentco.com/pub/php/php-5.6.17.tar.bz2 -O /tmp/php-${PHP_VERSION}.tar.bz2
wget --no-check-certificate http://curl.haxx.se/download/curl-${CURL_VERSION}.tar.gz -O /tmp/curl-${CURL_VERSION}.tar.gz
cd /tmp; tar xjf php-${PHP_VERSION}.tar.bz2
cd /tmp; tar xzf curl-${CURL_VERSION}.tar.gz
cd curl-${CURL_VERSION}
./configure
make
make install
cd /tmp; rm -rf curl-${CURL_VERSION}*
sleep 2
cd /tmp/php-${PHP_VERSION}/ext/curl/
phpize
./configure
make
make install
cd /tmp; rm -rf php-${PHP_VERSION}*