2015-01-12 4 views
24

Nella mia app PHP uso PHP CURL e openssl, per connetterti e parlare usando SOAP. Fino ad ora, il server remoto supportava SSL e TLS ma a causa del bug "poodle", l'amministratore decise di disabilitare SSL e utilizzare solo TLS. SSL è supportato fino alla fine di gennaio.Verifica se il ricciolo sta usando TLS

ho cambiato il mio codice aggiungendo:

curl_setopt($objCurl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); 

che in teoria dovrebbe forzare curl per usare TLSv1.2.

Ma questa è la teoria: devo verificare che in realtà utilizzi TLS: esiste un metodo per questo? C'è un metodo chiamato curl_getinfo(), ma informazioni restituisce non è utile per me:

[url] => https://www.example.com/soap/MessagingPort 
[content_type] => text/xml;charset=utf-8 
[http_code] => 200 
[header_size] => 293 
[request_size] => 882 
[filetime] => -1 
[ssl_verify_result] => 0 
[redirect_count] => 0 
[total_time] => 0.164487 
[namelookup_time] => 3.4E-5 
[connect_time] => 3.4E-5 
[pretransfer_time] => 0.000122 
[size_upload] => 604 
[size_download] => 178 
[speed_download] => 1082 
[speed_upload] => 3672 
[download_content_length] => 178 
[upload_content_length] => 604 
[starttransfer_time] => 0.164477 
[redirect_time] => 0 

Big Grazie in anticipo

+0

È possibile esaminare la stretta di mano con una sorta di sniffer di rete, o se è possibile, disattivare SSL e TLS 1.0 e 1.1 sul server in modo che * ha * connettersi con TLS 1.2. Lo script – vcsjones

+1

funziona su un hosting condiviso, quindi non c'è modo di annusarlo.Ho già forzato Apache sul mio server di sviluppo per utilizzare TLS e funziona, ma non ho modo di verificarlo in produzione. Dopo alcuni anni di utilizzo di php, inizi a non dare tutto per scontato. Ho ancora bisogno di un modo per ottenere "stai usando TLS" sullo schermo. Ho anche avuto un problema sul mio Debian con CURL_SSLVERSION_TLSv1_2 non in fase di definizione e ho dovuto modificare la linea in: curl_setopt ($ objCurl, CURLOPT_SSLVERSION, 6); – kayo

risposta

58

Risposta breve

Fare una richiesta con curl per https://www.howsmyssl.com/

<?php 
$ch = curl_init('https://www.howsmyssl.com/a/check'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$data = curl_exec($ch); 
curl_close($ch); 

$json = json_decode($data); 
echo $json->tls_version; 

che dovrebbe fornire quale versione TLS è stata utilizzata per la connessione.

Digging Deeper

Curl si basa sulla libreria OpenSSL sottostante (o NSS) per fare la negoziazione della connessione sicura. Quindi credo che la domanda giusta da porre qui sia la capacità della libreria OpenSSL. Se è in grado di gestire una connessione TLS, quindi curl può gestire una connessione TLS.

Quindi, come capire a cosa è capace la libreria openssl (o NSS)?

<?php  
$curl_info = curl_version(); 
echo $curl_info['ssl_version']; 

che sta per scaricare qualcosa come

OpenSSL/1.0.1k 

Poi si può andare a dare un'occhiata alle note di rilascio di tale versione e vedere se si include il supporto TLS. Note

OpenSSL uscita - osserva https://www.openssl.org/news/openssl-1.0.1-notes.html

NSS uscita - https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/NSS_Releases

Spoiler Alert

  • OpenSSL include il supporto per TLS v1.1 e TLS v1.2 in OpenSSL 1.0.1 [14 mar 2012]
  • supporto NSS incluso per TLS v1.1 in 3.14
  • NSS incluso supporto per TLS v1.2 a 3.15
+0

Ho fatto il curl a howsmyssl e restituisce 'error: 1407742E: Routine SSL: SSL23_GET_SERVER_HELLO: versione del protocollo di avviso tlsv1'. Sta rifiutando ssl v2/3? https://twitter.com/jmhodges/status/420614636606468096. Cosa faccio in questo caso? –

+0

Con la seconda logica php, il mio server indica "NSS/3.19.1 Basic ECC" che implica il supporto per TLS v1.2, tuttavia la prima logica PHP ha restituito "TLS 1.0"? Cosa devo fare per supportare TLS 1.2? – panofish

+0

Non importa il mio precedente commento ... Ho semplicemente aggiunto il seguente codice in php logiC# 1 e ora ricevo TLS 1.2 'curl_setopt ($ ch, CURLOPT_SSLVERSION, 6);' – panofish