web-dev-qa-db-ja.com

PHPカールセットSSLバージョン

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をネゴシエートします

7
Ephenodrom

問題は、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を更新する以外にそれを回避する方法はありません。

5
drew010

同じ問題がありました。

    <?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. OpenSSLの更新(1.0+)バージョン。
  2. カールを再コンパイルする
  3. 再コンパイルPHP新しいCURLで
  4. CurlSSLバージョンがOpenSSL /(1.0+)であることを確認してください

SSLバージョンOpenSSL/1.0.1e –良い

SSLバージョンNSS/3.13.6.0 –悪い

CentOSで実行しています。ここで私が更新したこと:

  1. OpenSSLの更新:

    opensslバージョン

1.0未満の場合、実行:yum update opensslは、実際に更新されていることを確認します

  1. PHPを再インストールします。したがって、php.iniファイルを保存します
  2. 以下を介してインストールされたすべてのPHPモジュールのリストを保持します:

    yumリストがインストールされました| grep php

出力を保存してください!

  1. yum destroy php
  2. yum小消去php-curl
  3. yum install php
  4. yum install php-curl

  5. apacheまたはfpmを再起動すると、運が良ければ問題なく動作するようになります。

  6. php.ini構成とPHPモジュール:yum install php-pgsql; yum installphp-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. OpenSSLの更新:

    opensslバージョン

1.0未満の場合、実行:yum update opensslは、実際に更新されていることを確認します

  1. PHPを再インストールします。したがって、php.iniファイルを保存します
  2. 以下を介してインストールされたすべてのPHPモジュールのリストを保持します:

    yumリストがインストールされました| grep php

出力を保存してください!

  1. yum destroy php
  2. yum小消去php-curl
  3. yum install php-devel
  4. print PHP version with rpm -qa --queryformat '%{version}' 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 install php-pgsql; yum installphp-Gd;などを復元します。
4
Alex Shulak

完璧です。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}*
1
Sree