Php curl 设置 ssl 版本
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.6
协议: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.0+) 版本的 OpenSSL。
- 重新编译 Curl
- 使用新的 CURL
重新编译 PHP
- 确保 Curl SSL 版本为 OpenSSL/(1.0+)
SSL Version OpenSSL/1.0.1e – Good
SSL Version NSS/3.13.6.0 – Bad
我正在 运行CentOS 上。这是我所做的更新:
更新 OpenSSL:
openssl 版本
如果低于 1.0 运行: yum update openssl
确保它确实已更新
- 重新安装 PHP。所以保存php.ini文件
保留通过以下方式安装的所有 PHP 模块的列表:
已安装 yum 列表 | grep php
保存输出!
- yum 擦除 php
- yum 擦除 php-curl
- 百胜安装php
yum 安装php-curl
重新启动 apache 或 fpm,如果你幸运的话,你会得到工作
- 恢复php.ini 配置和PHP 模块:yum install php-pgsql; yum 安装 php-gd;等等
但是,如果您的软件包存储库已过时或者您安装了带有 NSS SSL 绑定的 curl 库,您可以手动下载和编译 curl 库。我使用了 phpize 与 php-devel 包捆绑在一起的工具。所以我遇到的问题是:
cURL Information 7.19.7
SSL Version NSS/3.13.6.0
下面是我将其更改为:
cURL Information 7.22.0
SSL Version OpenSSL/1.0.1e
更新 OpenSSL:
openssl 版本
如果低于 1.0 运行: yum update openssl
确保它确实已更新
- 重新安装 PHP。所以保存php.ini文件
保留通过以下方式安装的所有 PHP 模块的列表:
已安装 yum 列表 | grep php
保存输出!
- yum 擦除 php
- yum 擦除 php-curl
- yum 安装php-devel
- 使用 rpm -qa --queryformat '%{version}' php 打印 PHP 版本并找到可以下载完全相同 PHP 来源
- 以下 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>
- 重新启动 apache 或 fpm,如果你幸运的话,你会得到工作
- 恢复php.ini 配置和PHP 模块:yum install 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 }')
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}*
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.6 协议: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.0+) 版本的 OpenSSL。
- 重新编译 Curl
- 使用新的 CURL 重新编译 PHP
- 确保 Curl SSL 版本为 OpenSSL/(1.0+)
SSL Version OpenSSL/1.0.1e – Good
SSL Version NSS/3.13.6.0 – Bad
我正在 运行CentOS 上。这是我所做的更新:
更新 OpenSSL:
openssl 版本
如果低于 1.0 运行: yum update openssl 确保它确实已更新
- 重新安装 PHP。所以保存php.ini文件
保留通过以下方式安装的所有 PHP 模块的列表:
已安装 yum 列表 | grep php
保存输出!
- yum 擦除 php
- yum 擦除 php-curl
- 百胜安装php
yum 安装php-curl
重新启动 apache 或 fpm,如果你幸运的话,你会得到工作
- 恢复php.ini 配置和PHP 模块:yum install php-pgsql; yum 安装 php-gd;等等
但是,如果您的软件包存储库已过时或者您安装了带有 NSS SSL 绑定的 curl 库,您可以手动下载和编译 curl 库。我使用了 phpize 与 php-devel 包捆绑在一起的工具。所以我遇到的问题是:
cURL Information 7.19.7
SSL Version NSS/3.13.6.0
下面是我将其更改为:
cURL Information 7.22.0
SSL Version OpenSSL/1.0.1e
更新 OpenSSL:
openssl 版本
如果低于 1.0 运行: yum update openssl 确保它确实已更新
- 重新安装 PHP。所以保存php.ini文件
保留通过以下方式安装的所有 PHP 模块的列表:
已安装 yum 列表 | grep php
保存输出!
- yum 擦除 php
- yum 擦除 php-curl
- yum 安装php-devel
- 使用 rpm -qa --queryformat '%{version}' php 打印 PHP 版本并找到可以下载完全相同 PHP 来源
- 以下 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>
- 重新启动 apache 或 fpm,如果你幸运的话,你会得到工作
- 恢复php.ini 配置和PHP 模块:yum install 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 }')
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}*