2014-10-19 12 views
10

Sto utilizzando la libreria di arricciatura (con NSS) in PHP per connettersi al mio altro server. Tutto andava bene fino alla scorsa settimana, quando il server di destinazione ha smesso di supportare SSLv3 a causa della vulnerabilità dei barboncini (CloudFlare tra l'altro). Ora, sto cercando di effettuare la connessione utilizzando TLS, ma sto ancora ricevendo "Errore di connessione SSL".PHP Curl (con NSS) sta probabilmente utilizzando SSLv3 insted di TLS durante la connessione a https

C'è codice di esempio, sto usando:

$ch = curl_init(); 
curl_setopt_array($ch, array(
    CURLOPT_URL => 'https://www.lumiart.cz', 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_SSLVERSION => 1, 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_VERBOSE => true 
)); 
$output = curl_exec($ch); 
echo $output; 

print_r(curl_getinfo($ch)); 

echo 'error:' . curl_error($ch); 

curl_close($ch); 

Dalla mia comprensione, l'impostazione CURLOPT_SSLVERSION a 1 dovrebbe forzare la connessione tramite TLS.

Nota: ho il CURLOPT_SSL_VERIFYPEER => false solo per il debug e non intendo lasciarlo lì, una volta risolto questo problema.

Questo è uscita:

Array 
(
    [url] => https://www.lumiart.cz 
    [content_type] => 
    [http_code] => 0 
    [header_size] => 0 
    [request_size] => 0 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 0 
    [total_time] => 0 
    [namelookup_time] => 2.3E-5 
    [connect_time] => 0.005777 
    [pretransfer_time] => 0 
    [size_upload] => 0 
    [size_download] => 0 
    [speed_download] => 0 
    [speed_upload] => 0 
    [download_content_length] => -1 
    [upload_content_length] => -1 
    [starttransfer_time] => 0 
    [redirect_time] => 0 
    [certinfo] => Array 
     (
     ) 

    [primary_ip] => 2400:cb00:2048:1::681c:86f 
    [redirect_url] => 
) 
error:SSL connect error 

Ho tutto questo a provider di hosting condiviso, quindi non posso modificare alcuna configurazione php.ini o aggiornare qualsiasi componente. Tutto quello che ho è phpinfo(). Ho controllato il supporto TLS per la versione di questi componenti e dovrebbe andare bene. Ecco stralcio di phpinfo:

PHP Version 5.4.32 
System Linux wl42-f262 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64 

curl: 
cURL support enabled 
cURL Information 7.19.7 
Age 3 
Features 
AsynchDNS No 
Debug No 
GSS-Negotiate Yes 
IDN Yes 
IPv6 Yes 
Largefile Yes 
NTLM Yes 
SPNEGO No 
SSL Yes 
SSPI No 
krb4 No 
libz Yes 
CharConv No 
Protocols tftp, ftp, telnet, dict, ldap, ldaps, http, file, https, ftps, scp, sftp 
Host x86_64-redhat-linux-gnu 
SSL Version NSS/3.15.3 
ZLib Version 1.2.3 
libSSH Version libssh2/1.4.2 

penso, che il problema è l'utilizzo di SSLv3, invece di TLS, ma non sono sicuro al 100%. Tutto quello che sto ottenendo è "Errore di connessione SSL" e non so, come scoprirlo, quale versione SSL è stata utilizzata per connettersi.

C'è un modo, come verificare, quale versione SSL viene utilizzata per la connessione? O mi sta sfuggendo qualcosa?

Grazie per qualsiasi consiglio!

+0

"Non posso cambiare qualsiasi configurazione php.ini o aggiornare qualsiasi componente" - ma il vostro ospite può, e sono più o meno obbligato a problemi di sicurezza come questo, quindi dovresti parlare anche con loro. Ho avuto un problema simile in Java un po 'di tempo fa, quando usava l'handshake SSLv3, anche se era consentito usarlo solo per negoziare TLSv1 +, e il server con cui stavo parlando rifiutava di accettare SSLv3 anche per l'handshake, quindi potrebbe essere il problema qui, ma non saprei come dire scusa. – Rup

+0

Grazie, ho controllato la versione di quei componenti (php, curl, NSS), e tutti dovrebbero andare bene con il supporto TLS. Non sono così obsoleti, quindi non so, se l'aggiornamento farebbe la differenza anche se convincessi il mio ospite a farlo. – Lapak

+0

@Lapak l'hai capito? Sto provando a connettermi a un server con TLS poiché ha disabilitato SSL, ma non mi sembra che mi consenta. – LefterisL

risposta

20

Questo è un problema interessante.

Se si interroga SSLLabs per questo sito, si vedrà che supporta solo diversi cifrari ECDHE-ECDSA- * e nessun'altra cifra. Ma nello version history of curl troverai un bug con i codici ECC e la libreria NSS (che usi), che è stata risolta solo nella versione arricciata 7.36 "nss: allow to use ECC ciphers if NSS implements them".

Poiché si utilizza curl 7.19.7, il ricciolo è troppo vecchio per utilizzare i codici necessari insieme alla libreria NSS. Ciò significa che è necessario aggiornare la libreria di arricciatura.

+1

Non collegerei mai tutto insieme :) Grazie! Proverò a infastidire il mio ospite a riguardo. – Lapak

+0

Questo sta diventando un grosso problema con così tanti fornitori di servizi che uccidono SSL e richiedono di passare a TLS. Ricevo molte richieste di supporto dagli utenti di strumenti in cui il loro host web ha una versione precedente cURL e non è disposto ad aggiornarlo (per qualsiasi ragione). –

+0

Ho pensato di averlo capito quando ho trovato la tua risposta qui, ma ora ho persone che eseguono CURL 7.38.0 che ottengono questo errore quando ho impostato TLSv1 in modo specifico: "Elenco cifrario sconosciuto nella lista: TLSv1". Come posso ottenere questo lavoro per tutti indipendentemente dalla loro versione cURL? Molto confuso in questo momento. –

12

ho Curl 7.21.7 e PHP 5.4.34, e questo sembrava per fare il trucco per me:

curl_setopt($curl_request, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);

Maggiori informazioni here, anche se non dice quando CURL_SSLVERSION_TLSv1 era introdotto.

+0

Grazie, ma questo non funziona nel mio setup. Sto ancora ricevendo l'errore "Errore di connessione SSL". Ho provato anche CURL_SSLVERSION_TLSv1_0 e così via, ma non funzionano neanche, come previsto (dato che sono stati aggiunti nelle versioni successive) – Lapak

2

risposta Duplicate SSL error can not change to TLS proposto:

Prova ad aggiungere CURLOPT_SSL_CIPHER_LIST => 'TLSv1' al vostro PPHttpConfig.php.

(e discusso qui anche Update PHP cURL request from SSLv3 to TLS..?).

Come utilmente commentato, questa si applica a OpenSSL biblioteca ricciolo, per non NSS.

+0

L'ho provato, ma non è il mio caso. Questa impostazione esatta funziona solo per OpenSSL.Per NSS l'elenco dei cyphers può essere trovato qui: https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html ma nessuno dei cyphers ECDHE non funziona per me. Molto probabilmente è dovuto alla versione di curl/NNS che il mio host ha, come menzionato prima. Grazie per la revisione! – Lapak

2

La risposta per me è stato quello di utilizzare un valore intero invece di una stringa .. cioè: Cambio:

curl_setopt($ch, CURLOPT_SSLVERSION_TLSv1_2); 

A:

curl_setopt($ch, CURLOPT_SSLVERSION, 6); 

O per tlsv1_1:

curl_setopt($ch, CURLOPT_SSLVERSION, 5); 

Ecco l'elenco completo:

CURL_SSLVERSION_DEFAULT (0) 
CURL_SSLVERSION_TLSv1 (1) 
CURL_SSLVERSION_SSLv2 (2) 
CURL_SSLVERSION_SSLv3 (3) 
CURL_SSLVERSION_TLSv1_0 (4) 
CURL_SSLVERSION_TLSv1_1 (5) 
CURL_SSLVERSION_TLSv1_2 (6) 

sto correndo il seguente proposito:

curl-7.19.7-46.el6.x86_64 
nss-3.21.0-0.3.el6_7.x86_64 
Problemi correlati