我遇到了同样的问题。
<?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。
- 重新编译PHP并使用新的CURL。
- 确保Curl SSL版本是OpenSSL/(1.0+)。
SSL版本 OpenSSL/1.0.1e - 良好
SSL版本 NSS/3.13.6.0 - 不好
我正在运行CentOS,以下是我的更新步骤:
更新OpenSSL:
openssl version
如果低于1.0,则运行:yum update openssl
确保已经更新
- 重新安装PHP。因此,请保存php.ini文件
通过以下命令列出所有已安装的PHP模块:
yum list installed | grep php
保存输出!
- yum erase php
- yum erase php-curl
- yum install php
yum install php-curl
重新启动apache或fpm,如果你很幸运,一切都会正常工作
- 还原php.ini配置和PHP模块:yum install php-pgsql;yum install 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
更新OpenSSL:
openssl version
如果版本低于1.0,请运行yum update openssl确保已经更新。
- 重新安装PHP,请保存php.ini文件。
通过以下命令列出所有已安装的PHP模块:
yum list installed | grep php
保存输出结果!
- yum erase php
- yum erase php-curl
- yum install 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 install php-gd; 等等。