web-dev-qa-db-fra.com

Php curl set ssl version

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 

6
inf3ction

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.

4
drew010

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:

  1. Mettez à jour la version (1.0+) d'OpenSSL.
  2. Recompiler Curl
  3. Recompiler PHP avec le nouveau CURL
  4. Assurez-vous que Curl SSL Version est OpenSSL/(1.0+)

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:

  1. 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

  1. Réinstallez PHP. Alors sauvegardez le fichier php.ini
  2. Conservez une liste de tous les PHP modules installés via:

    yum liste installée | grep php

enregistrer la sortie!

  1. yum efface php
  2. miam efface php-curl
  3. miam installer php
  4. miam installer php-curl

  5. redémarrez Apache ou fpm et si vous êtes chanceux, vous obtiendrez des résultats

  6. restaurez les configurations php.ini et les modules PHP: yum install php-pgsql; miam installer php-Gd; etc

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 
  1. 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

  1. Réinstallez PHP. Alors sauvegardez le fichier php.ini
  2. Conservez une liste de tous les PHP modules installés via:

    yum liste installée | grep php

enregistrer la sortie!

  1. yum efface php
  2. miam efface php-curl
  3. miam installer php-devel
  4. print PHP version avec rpm -qa --queryformat '% {version}' php et trouvez où vous pouvez télécharger exactement les mêmes sources PHP
  5. Le script bash suivant installera la bibliothèque curl spécifique:

<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. redémarrez Apache ou fpm et si vous êtes chanceux, vous obtiendrez des résultats
  2. restaurez les configurations php.ini et les modules PHP: yum install php-pgsql; miam installer php-Gd; etc
3
Alex Shulak

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}*
1
Sree