La confusione deriva dal modo in cui OpenSSL esprime le sue opzioni di configurazione.
Nel protocollo ci sono due cose ben distinte:
-
La versione del protocollo . Questo può essere SSL 3.0, TLS 1.0, TLS 1.1 o TLS 1.2 (o qualcos'altro, non ancora definito). Internamente, la versione è codificata come numero intero a 16 bit del valore 0x0300, 0x0301, 0x0302 o 0x0303, rispettivamente (quindi TLS 1.0 è davvero "SSL 3.1" sul filo). (Non sto parlando di SSL 2.0 qui.)
-
Le suite di crittografia . Questi sono identificativi a 16 bit (sul cavo) per le combinazioni di algoritmi crittografici che il client e il server sono disposti a utilizzare. Il client invia una lista, il server sceglie quella che verrà utilizzata. La maggior parte delle suite di crittografia funziona con SSL 3.0, TLS 1.0 e TLS 1.1; alcune suite di crittografia recenti funzionano solo con TLS 1.2 perché utilizzano le funzionalità di protocollo disponibili solo con TLS 1.2.
OpenSSL utilizza, nella sua stringa di configurazione per specificare un elenco di pacchetti di crittografia, alcuni mnemonici come "SSLv3". In quel contesto , "SSLv3" non significa "versione del protocollo 0x0300"; significa "l'elenco di pacchetti di crittografia che possono funzionare con SSLv3". Quando scrivi "! SSLv3" nella configurazione per l'elenco delle suite di crittografia supportate, dovresti leggerlo come "rimuovere tutte le suite di crittografia che potrebbero funzionare con SSL 3.0". Ma questo NON è: "rimuovi tutti i pacchetti di crittografia che potrebbero funzionare con SSL 3.0 quando effettivamente usi SSL 3.0 ". La rimozione è tutto-o-niente; non è possibile rimuovere il supporto in modo condizionale sulla versione del protocollo (ciò sarebbe concettualmente possibile, ma OpenSSL non funziona così).
Quindi, se si rimuove il supporto per tutte le suite di crittografia che potrebbero funzionare con SSL 3.0, si rimuovono anche le suite di crittografia per ulteriori versioni del protocollo. In particolare, poiché SSL 3.0, TLS 1.0 e TLS 1.1 utilizzano tutte le stesse suite di crittografia, le uniche suite di crittografia rimanenti nell'elenco sono quelle specifiche per TLS 1.2. In effetti, hai appena ucciso anche il supporto per TLS 1.0 e 1.1.
Se si utilizza " !SSLv3:!SSLv2
", il server può fingere di supportare ancora SSL 2.0, ma con un elenco vuoto di suite di crittografia supportate, quindi non andrà lontano; una vera stretta di mano non accadrà. È come dare la chiave per la tua auto ma rimuovere le ruote.