Depuis 3 jours, je ne peux plus me connecter à la sandbox Paypal. J'ai découvert qu'ils ont peut-être désactivé le support de SSLv3. J'ai donc essayé de changer la version SSL dans ma requête curl en définissant:
curl_setopt($curl, CURLOPT_SSLVERSION,1); # 1 = TLSv1
Mais cela me donne toujours la même erreur:
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Avez-vous une idée pourquoi le script utilise toujours SSLv3?
J'utilise PHP 5.5 et la version suivante (demande actuellement à mon hébergeur [hébergement géré à 1 & 1] de passer à une version plus récente)
curl 7.21.0 (i486-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8/zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6 Protocoles: fichier dict ftp ftps http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp Caractéristiques: Négociation ID-GSS avec IDN IPv6 Largefile NTLM SSL libz
Le problème est que Paypal a abandonné la prise en charge de SSLv3, TLS 1.0 et TLS 1.1 et prend désormais uniquement en charge TLS 1.2, mais la version OpenSSL cURL est construite avec (0.9.8o
) ne prend pas en charge TLS.
À ce stade, tout ce que vous pouvez faire, c'est espérer que l'hôte puisse mettre à jour OpenSSL, cURL et PHP vers une version plus récente (1.0+) d'OpenSSL.
À l'heure actuelle, votre client cURL ne parle pas TLS, ce qui est requis par Paypal, et il n'y a pas d'autre moyen de le contourner que de mettre à jour OpenSSL.
J'ai eu le même problème.
<?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;
réponse:
bool(false)
et pas de journaux d'erreur!
Alors j'ai fait un petit script:
<?php
error_reporting(E_ALL);
var_dump(file_get_contents('https://api-3t.sandbox.Paypal.com/nvp'));
et voici ce que j'ai dans les journaux:
[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
Ma solution était:
Version SSL OpenSSL/1.0.1e - Bonne
Version SSL NSS/3.13.6.0 - Mauvais
Je cours sur CentOS. Voici ce que j'ai fait pour mettre à jour:
Mettre à jour OpenSSL:
version openssl
si en dessous de 1.0, exécutez: yum update openssl assurez-vous qu'il est réellement mis à jour
Conservez une liste de tous les PHP modules installés via:
yum liste installée | grep php
enregistrer la sortie!
miam installer php-curl
redémarrez Apache ou fpm et si vous êtes chanceux, vous obtiendrez des résultats
Toutefois, si vos référentiels de paquets sont obsolètes ou si vous avez une bibliothèque Curl installée avec des liaisons SSL NSS, vous pouvez télécharger et compiler la bibliothèque Curl manuellement. J'ai utilisé phpize tool fourni avec le paquet php-devel. Donc, mon problème que j'ai eu:
cURL Information 7.19.7
SSL Version NSS/3.13.6.0
et voici comment je l'ai changé pour:
cURL Information 7.22.0
SSL Version OpenSSL/1.0.1e
Mettre à jour OpenSSL:
version openssl
si en dessous de 1.0, exécutez: yum update openssl assurez-vous qu'il est réellement mis à jour
Conservez une liste de tous les PHP modules installés via:
yum liste installée | grep php
enregistrer la sortie!
<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>
Parfait, je voulais que LibCurl utilise OpenSSL au lieu de NSS, cela m’a aidé à résoudre ce problème en modifiant le php libcurl pour qu’il utilise OpenSSL.
Mon Centos7 PHP 5.6 utilisait
php -r "print_r(curl_version());" | grep ssl_version
[ssl_version_number] => 0
[ssl_version] => NSS/3.19.1 Basic ECC
et après le correctif ci-dessus, ça se voit, c'est ce que je voulais.
php -r "print_r(curl_version());" | grep ssl_version
[ssl_version_number] => 0
[ssl_version] => OpenSSL/1.0.1f
Voici le script révisé que j'ai utilisé sur Centos7 avec 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}*