2014-11-05 11 views
7

A causa dello recent vulnerability discovered in SSLv3, molti provider di servizi Web (ad es. PayPal, Facebook, Google) lo disattivano e vogliono che usiamo TLS. Sto avendo un po 'di problemi a capire come farlo.Aggiorna la richiesta PHP cURL da SSLv3 a TLS ..?

Attualmente sto usando la seguente funzione per gestire le mie richieste cURL.

function CURLRequest($Request = "", $APIName = "", $APIOperation = "", $PrintHeaders = false) 
{ 
    $curl = curl_init(); 
      curl_setopt($curl, CURLOPT_VERBOSE, 1); 
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
      curl_setopt($curl, CURLOPT_TIMEOUT, 30); 
      curl_setopt($curl, CURLOPT_URL, $this->EndPointURL); 
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
      curl_setopt($curl, CURLOPT_POSTFIELDS, $Request); 

    if($this->APIMode == 'Certificate') 
    { 
     curl_setopt($curl, CURLOPT_SSLCERT, $this->PathToCertKeyPEM); 
    } 

    $Response = curl_exec($curl); 

    /* 
    * If a cURL error occurs, output it for review. 
    */ 
    if($this->Sandbox) 
    { 
     if(curl_error($curl)) 
     { 
      echo curl_error($curl).'<br /><br />'; 
     } 
    } 

    curl_close($curl); 
    return $Response; 
} 

quando cerco di colpire sandbox di PayPal, però, dove hanno già disabilitate questo, io alla fine con un errore di cURL: errore: 14077410: routine SSL: SSL23_GET_SERVER_HELLO: SSLv3 avviso errore di handshake

Le informazioni che ho trovato sono che ho solo bisogno di cambiare questo per usare TLS invece di SSL, e le altre risposte che ho visto dicono di farlo semplicemente aggiungendo un'opzione di arricciatura alla mia funzione ...

curl_setopt($curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); 

Ho aggiunto tha t opzione, comunque, e ottengo lo stesso identico risultato. Qualsiasi informazione su come posso ottenere questo lavoro sarebbe molto apprezzata. Grazie!

+0

Sei su una vecchia versione di Curl? Guardando [questa risposta] (http://stackoverflow.com/questions/26452755/php-curl-is-probably-using-sslv3-insted-of-tls-when-connecting-to-https) sembra almeno 7.19 ha problemi con TLS. – cOle2

+0

Sì, l'ho visto anch'io. Cercando di capire come vedere la mia versione arricciata ora. Non ho mai avuto problemi con questo prima. –

+0

Sembra che io sia su 7.36.0, quindi non dovrebbe essere il mio problema. –

risposta

2

copiato da: SSL error can not change to TLS

Cercate aggiungi curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, 'TLSv1'); al codice.

Ciò funzionerà se si CURL è OpenSSL libssl ma non se NSS basa base.

+0

Sì, sembra aver fatto il trucco. Dovremmo unirli in qualche modo .. ?? –

+0

preferisco la tua formulazione che è più generica di una risposta doppia, ma lasciare a Cesare ciò che è da cesare a questa risposta non è la mia ... –

+0

@philippelhardy, sto ottenendo l'errore di handshake sslv3 anche se ho 'CURLOPT_SSL_CIPHER_LIST' impostato su TLSv1 –

3

Una soluzione migliore fino a quando Paypal aggiorna il suo SDK principale sarebbe sostituire il CURLOPT_SSL_CIPHER_LIST direttamente nell'applicazione. In questo modo non devi interferire direttamente con il pacchetto sdk-core-php e sarai libero di aggiornarlo in futuro.

Si potrebbe aggiungere qualcosa come il seguente alla logica di bootstrap o il pagamento di elaborazione del app:

PPHttpConfig::$DEFAULT_CURL_OPTS[CURLOPT_SSL_CIPHER_LIST] = 'TLSv1'; 

Basta fare in modo di commentare a fondo e ricordarsi di tirarlo fuori più tardi, quando il problema è stato aggiornato nel nucleo .

+2

Puoi per favore entrare nei dettagli dove (percorso/file o impostazioni) devo aggiungere questa riga. Grazie! – Raffael

+0

Ehi Raffael, potresti aggiungerlo ovunque tu sia sicuro che verrà richiamato su ogni pageload. Questo dipende dal tuo framework ma di solito avrà una specie di "bootstrap"/file di configurazione dove puoi aggiungere questo tipo di cose. –

0

Ho appena risolto l'aggiornamento della libreria nss tramite terminale.

0

Se quanto sopra non aiuta, controllare la versione OPENSSL. È probabile a causa della versione OPENSSL < = 0.9.8. Aggiornamento a PHP7 aiuta, che viene fornito con la versione superiore di OPENSSL.