Php curl set versione ssl

Da 3 giorni non riesco a collegarmi alla sandbox paypal. Ho scoperto che forse hanno distriggersto il supporto per SSLv3. Così ho provato a cambiare la versione SSL nella mia richiesta di arricciatura impostando:

curl_setopt($curl, CURLOPT_SSLVERSION,1); # 1 = TLSv1 

Ma mi dà ancora lo stesso errore:

 error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure 

Qualche idea sul perché lo script sta ancora usando SSLv3?

Sto usando php 5.5 e la seguente versione di arricciatura (attualmente chiedo al mio hoster [hosting gestito a 1 & 1] di aggiornare a una versione più recente)

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 Protocolli: file dict ftp ftps http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp Caratteristiche: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

Il problema è che PayPal ha abbandonato il supporto per SSLv3, TLS 1.0 e TLS 1.1 e ora support solo TLS 1.2 ma la versione di OpenSSL cURL è costruita con ( 0.9.8o ) non support TLS.

A questo punto tutto quello che puoi fare è sperare che l'host possa aggiornare OpenSSL, cURL e PHP a una versione più recente (1.0+) di OpenSSL.

Allo stato attuale, il tuo client cURL non parla TLS, che è richiesto da PayPal e non ci sono modi per aggirarlo a parte l'aggiornamento di OpenSSL.

Aveva lo stesso problema.

  <?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; 

risposta:

 bool(false) 

e nessun registro errori!

Quindi ho realizzato una piccola sceneggiatura:

 <?php error_reporting(E_ALL); var_dump(file_get_contents('https://api-3t.sandbox.paypal.com/nvp')); 

e qui quello che ho nei registri:

 [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 

La mia soluzione era:

  1. Versione di aggiornamento (1.0+) di OpenSSL.
  2. Ricompilare il ricciolo
  3. Ricompila PHP con nuovo CURL
  4. Assicurati che la versione di Curl SSL sia OpenSSL / (1.0+)

Versione SSL OpenSSL / 1.0.1e – Buono

Versione SSL NSS / 3.13.6.0 – Scarsa

Sono in esecuzione su CentOS. Ecco cosa ho fatto per aggiornare:

  1. Aggiorna OpenSSL:

    versione openssl

se inferiore a 1.0 eseguire: yum update openssl assicurarsi che sia effettivamente aggiornato

  1. Reinstallare PHP. Quindi salva il file php.ini
  2. Mantieni una list di tutti i moduli PHP installati tramite:

    list yum installata | grep php

salva l'output!

  1. yum cancella php
  2. yum cancella php-curl
  3. yum installa php
  4. yum installa php-curl

  5. riavvia apache o fpm e se sei fortunato farai funzionare le cose

  6. ripristinare le configurazioni php.ini e i moduli PHP: yum install php-pgsql; yum installa php-gd; eccetera

Tuttavia, se i repository dei pacchetti sono obsoleti o se la libreria di arricciatura è installata con i binding NSS SSL, è ansible scaricare e compilare manualmente la libreria di arricciatura. Ho usato lo strumento phpize in bundle con il pacchetto php-devel. Quindi il mio problema ho avuto:

 cURL Information 7.19.7 SSL Version NSS/3.13.6.0 

ed ecco come l'ho cambiato in:

 cURL Information 7.22.0 SSL Version OpenSSL/1.0.1e 
  1. Aggiorna OpenSSL:

    versione openssl

se inferiore a 1.0 eseguire: yum update openssl assicurarsi che sia effettivamente aggiornato

  1. Reinstallare PHP. Quindi salva il file php.ini
  2. Mantieni una list di tutti i moduli PHP installati tramite:

    list yum installata | grep php

salva l'output!

  1. yum cancella php
  2. yum cancella php-curl
  3. yum installa php-devel
  4. printing la versione PHP con rpm -qa –queryformat '% {version}' php e trova where puoi scaricare esattamente le stesse fonti PHP
  5. Seguendo lo script di bash verrà installata la libreria di arricciatura specifica:
 <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> 

Perfetto, volevo che LibCurl usasse OpenSSL invece di NSS, questo mi ha aiutato a sistemare il php libcurl per usare OpenSSL.

Il mio Centos7 PHP 5.6 stava usando

 php -r "print_r(curl_version());" | grep ssl_version [ssl_version_number] => 0 [ssl_version] => NSS/3.19.1 Basic ECC 

e dopo la correzione sopra, mostra, questo è quello che volevo.

 php -r "print_r(curl_version());" | grep ssl_version [ssl_version_number] => 0 [ssl_version] => OpenSSL/1.0.1f 

Ecco lo script revisionato che ho usato su Centos7 con 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}*