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を使用している理由はありますか?
私はphp5.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ファイルftp ftps http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp機能:GSS-IDNIPv6ラージファイルNTLMSSLlibzをネゴシエートします
問題は、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
私の解決策は:
SSLバージョンOpenSSL/1.0.1e –良い
SSLバージョンNSS/3.13.6.0 –悪い
CentOSで実行しています。ここで私が更新したこと:
OpenSSLの更新:
opensslバージョン
1.0未満の場合、実行:yum update opensslは、実際に更新されていることを確認します
以下を介してインストールされたすべてのPHPモジュールのリストを保持します:
yumリストがインストールされました| grep php
出力を保存してください!
yum install php-curl
apacheまたはfpmを再起動すると、運が良ければ問題なく動作するようになります。
ただし、パッケージリポジトリが古くなっている場合、または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バージョン
1.0未満の場合、実行:yum update opensslは、実際に更新されていることを確認します
以下を介してインストールされたすべてのPHPモジュールのリストを保持します:
yumリストがインストールされました| grep php
出力を保存してください!
<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>
完璧です。LibCurlでNSSの代わりにOpenSSLを使用したかったので、これを修正してphplibcurlを微調整して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}*