Usando il comando openssl, come posso sapere se sta usando TLS 1.0?

5

A causa di una scansione di sicurezza, mi è stato detto di non usare TLS1.0. Ho trovato un link che mi ha dato comandi da usare per verificare se un protocollo specifico è usato / abilitato. Il comando che ho eseguito (con output è)

(Output da TLS1.0 disabilitato)

$ openssl s_client -connect localhost:8443 -tls1
CONNECTED(00000003)
139874418423624:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1275:SSL alert number 40
139874418423624:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:598:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1505770082
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

Il link diceva che se il protocollo è abilitato, dirà "Connesso", altrimenti "errore di handshake". Tuttavia, come puoi vedere i messaggi sopra, dice entrambi, anche se ho configurato Tomcat per usare TLS1.2.

La mia configurazione nel file server.xml:

<Connector port="8443" protocol="HTTP/1.1"
   maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
   keystoreFile="/glide/bigdata/bdapi/keys/bdapi_keystore.jks"
   keystorePass="bdapi123" clientAuth="false" sslProtocol="TLSv1.2" 
   sslEnabledProtocols="TLSv1.2"/>

Se consento a Tomcat di utilizzare TLS1.0, vedo ancora CONNECTED ma vedo anche le informazioni sul certificato.

(Output da TLS1.0 abilitato)

openssl s_client -connect localhost:8443 -tls1
CONNECTED(00000003)
<snip snip>
<snip snip>
(certificate info)
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
<snip snip>
<snip snip>
(certificate info)
---
Server certificate
-----BEGIN CERTIFICATE-----
<snip snip>
<snip snip>
(public key)
-----END CERTIFICATE-----
<snip snip>
<snip snip>
(certificate info)
---
No client certificate CA names sent
Server Temp Key: ECDH, secp521r1, 521 bits
---
SSL handshake has read 2121 bytes and written 357 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : ECDHE-RSA-AES256-SHA
    Session-ID: 59C0448146B0A18DE52D99C630C896E12BA9861702AB2582C2AA0658E6458B04
    Session-ID-ctx: 
    Master-Key: <some random key>
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1505772673
    Timeout   : 7200 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
read:errno=0

Come interpreto l'output di openssl? Ho disabilitato con successo TLS1.0 con la configurazione sopra o dato che dice "CONNECTED" in entrambe le uscite, non l'ho disabilitato e avrò di nuovo la scansione di sicurezza?

    
posta Classified 19.09.2017 - 00:44
fonte

3 risposte

6

TL; TR: È tutt'altro che banale verificare dal client che un server non supporta TLS 1.0. Si può essere sicuri che il server supporti TLS 1.0 se si ottiene una connessione riuscita con TLS 1.0. Ma non puoi essere sicuro che il server non supporti TLS 1.0 se questo tentativo fallisce.

Come già sapevi, le informazioni fornite nel link che citi sono almeno parzialmente errate. Inoltre, sono incompleti. Controllare se un server ha realmente TLS 1.0 disabilitato non è così semplice. Per capire cosa è necessario verificare per essere veramente sicuri è meglio avere almeno una conoscenza di base di come funziona TLS-Handshake. Nota che la maggior parte di ciò che dico qui vale anche per SSL, che è principalmente il nome precedente per la stessa famiglia di protocolli ora nota come TLS.

Inizialmente, il client deve creare una connessione TCP al server. Questo non ha ancora niente a che fare con TLS stesso. E già se la connessione TCP ha esito positivo otterrai CONNECTED(00000003) . Se non si ottiene questo CONNECTED, il server potrebbe essere inattivo o non essere raggiungibile dal sito, ad esempio perché un firewall sta bloccando l'accesso. Pertanto, non ottiene CONNECTED non dice nulla sulla capacità del server di supportare TLS 1.0 .

Dopo aver creato la connessione TCP inizia la parte TLS. Nel caso più semplice, il client invia all'inizio dell'handshake TLS all'interno del messaggio ClientHello la migliore versione di TLS che può e le cifre supportate. Il server risponde con il miglior protocollo SSL / TLS supportato che sia uguale o inferiore alla versione del protocollo offerta dal client. E il server sceglie il codice comune in base a ciò che offre il client e a cosa è configurato per essere accettabile per il server. Nel tuo caso specifico, il client offre TLS 1.0 come protocollo migliore (a causa dell'opzione -tls1 ) e il set di crittografia predefinito. L'handshake avrà esito negativo se il server non supporta TLS 1.0 o inferiore OR se il server non supporta nessuno dei codici offerti dal client. A causa dell'ultima parte è possibile che il server non riesca con il tuo client specifico anche se il server ha abilitato TLS 1.0 perché al server non piacciono le cifre offerte dal client .

E diventa più complesso. È normale che i server supportino più certificati sullo stesso indirizzo IP oggi. Ciò avviene includendo il nome host di destinazione utilizzando l'estensione SNI TLS all'interno di ClientHello all'inizio dell'handshake TLS. Se non è presente un'estensione SNI o se l'estensione non corrisponde ad alcun hostname configurato, il server invierà solitamente un certificato predefinito o interromperà l'handshake. A causa dell'ultima parte è possibile che il server non riesca con il tuo client specifico anche se il server ha abilitato TLS 1.0 perché non è stata utilizzata alcuna estensione SNI o è stata utilizzata con il nome host errato . openssl s_client non utilizzerà SNI per impostazione predefinita, quindi il tuo tentativo potrebbe semplicemente fallire solo a causa di un'estensione SNI mancante. Devi usare l'opzione -servername per questo e ovviamente devi usare un nome host correttamente configurato sul server con questa opzione.

E fino ad ora ci siamo occupati solo di stack TLS sani e di una connessione diretta al server. Se lo stack TLS è interrotto o se c'è qualche intermediario in mezzo (come bilanciamento del carico, firewall, ecc.) potrebbero far fallire accidentalmente o di proposito l'handshake anche se il server supporta TLS 1.0. E se hai una terminazione SSL davanti al tuo server (alcuni firewall, load balancer o un CDN) non testerai nemmeno le proprietà del server ma del sistema di fronte ad esso.

In altre parole: se si ottiene una connessione TLS 1.0 di successo con il server, si può essere sicuri che il server o un terminatore SSL di fronte supportino TLS 1.0. Se la connessione TLS 1.0 non funziona, non significa che il server non supporti TLS 1.0.

    
risposta data 19.09.2017 - 07:19
fonte
3

Sebbene questi strumenti non rispondano direttamente alla tua domanda specifica, possono fornire i risultati che stai cercando. Se disponi di una connessione Internet, prova alcuni di questi:

Se nessuna connessione Internet tenta:

risposta data 20.09.2017 - 11:37
fonte
2

Sì, quel sito web è sbagliato ; CONNECTED significa che la connessione TCP è riuscita, ma non dice nulla sull'handshake TLS (o si spera non su SSL). Se non si ottiene CONNECTED ma si ottengono alcune righe che terminano con connect: errno=$n (anche se il numero è 0!) Significa che non siamo nemmeno riusciti a tentare una stretta di mano e quindi non abbiamo informazioni in alcun modo su ciò che il server supporta.

Sebbene tu possa imparare a leggere i messaggi di errore e altre informazioni openssl , l'indicatore chiave è la linea che inizia con New, all'inizio dell'ultimo blocco di output (dopo --- poche righe prima %codice%); se mostra una versione e un codice di protocollo reali, l'handshake ha avuto successo, se ha SSL-Session: l'handshake non è riuscito - come fa il tuo.

Nota: l'handshake può fallire per ragioni diverse dalla versione del protocollo. Se questo test ha esito positivo per 1.0, puoi essere sicuro che il server supporta 1.0, ma se questo test fallisce, non dimostra che il server non supporta 1.0. Avrai bisogno di conoscere effettivamente TLS per distinguerli. Come Steffen ha postato a un livello molto più lungo mentre stavo scrivendo questo - ma ho deciso che i miei paras 2 e 4 potrebbero ancora aiutare.

FWIW nota anche che il testing per SSLv2 utilizzando solo (NONE) non è valido nelle versioni 1.0.0 su dove la lista di cifratura predefinita impedisce la connessione SSLv2 anche sui server che supportano SSLv2. Tuttavia, qualcuno che ancora oggi si preoccupa di SSLv2 su un server reale (non in laboratorio o in laboratorio) è in pericolo.

    
risposta data 19.09.2017 - 07:23
fonte

Leggi altre domande sui tag