Qual è il significato del campo versione in un messaggio ClientHello TLS 1.1+?

10

Sto cercando di aggiungere il supporto per TLS 1.1 e 1.2 a un prodotto per l'acquisizione di pacchetti che ha già il supporto per TLS 1.0.

Ho usato Wireshark per catturare il traffico tra il mio browser e un server openssl per generare alcuni casi di test. Ho visto una versione TLS inaspettata che scorre in tutte le tracce che ho creato.

Secure Sockets Layer
    TLSv1.2 Record Layer: Handshake Protocol: Client Hello
        Content Type: Handshake (22)
        Version: TLS 1.0 (0x0301)
        Length: 105
        Handshake Protocol: Client Hello
            Handshake Type: Client Hello (1)
            Length: 101
            Version: TLS 1.2 (0x0303)

Quanto sopra è un estratto di una delle tracce di TLS 1.2, come riportato da Wireshark. La versione fornita è TLS 1.0 in ClientHello e 1.2 in tutti i messaggi successivi. Questo è successo sia nelle tracce TLS 1.1 che in quelle 1.2.

Appendice E.1. (La compatibilità con TLS 1.0 / 1.1 e SSL 3.0) dalla RFC TLS 1.2 dice:

Earlier versions of the TLS specification were not fully clear on
what the record layer version number (TLSPlaintext.version) should
contain when sending ClientHello (i.e., before it is known which
version of the protocol will be employed).  Thus, TLS servers
compliant with this specification MUST accept any value {03,XX} as
the record layer version number for ClientHello.

Questo di per sé è anche un po 'ambiguo per me.

Quindi le mie domande sono:

  • Questo campo può essere un valore completamente arbitrario (purché sia SSLv3 o superiore)?
  • Il comportamento cambierà in base alla versione fornita in questo campo?
  • C'è qualche significato per il browser che sceglie TLS 1.0 piuttosto che SSLv3?

Related:

  • link Questa risposta suggerisce che SSLv3 dovrebbe essere utilizzato in ClientHello per la massima interoperabilità. La menzione dell'interoperabilità implica che il server si preoccupa di quale valore viene fornito.
posta Burhan Ali 18.01.2013 - 18:09
fonte

1 risposta

17

I campi della versione si presentano in tre punti:

  • come parte dell'intestazione per ogni record inviato dal client e dal server;
  • come parte del messaggio ClientHello dal client;
  • come parte del messaggio ServerHello dal server.

Negoziazione versione protocollo

Il campo versione in ClientHello è la versione massima supportata dall'implementazione del client. Ad esempio, quando il client inserisce 0x0302 in questo campo (che è il valore convenzionale che significa "TLS 1.1"), il client dice al server: "Sono pronto a gestire tutte le versioni del protocollo fino a TLS 1.1". Il campo versione nel messaggio ServerHello dal server specifica quale versione del protocollo verrà utilizzata per questa connessione. Il server dovrebbe utilizzare la versione di protocollo più alta supportata sia dal client che dal server.

Il client non dovrebbe annunciare il supporto per una versione di protocollo che in realtà non supporta, per timore che un server scelga una tale versione, credendo erroneamente che il client lo supporti effettivamente.

Informazioni sui record

Il ClientHello del client viene inviato racchiuso in uno o più record e ogni record contiene anche la versione del protocollo. I documenti sono come le buste attorno alle lettere. È sicuro utilizzare la versione 0x0300 (SSLv3) per questi record, indipendentemente dalla versione supportata massima indicata in ClientHello ; è come inviare una lettera in una busta SSLv3, ma la lettera dice "a proposito, supporto anche TLS 1.0 e TLS 1.1". L'utilizzo dei record SSLv3 ottimizza l'interoperabilità con implementazioni vecchie e buggy che conoscono solo SSLv3 e rifiuta i record con una versione superiore.

La risposta del server indica la versione del protocollo che verrà utilizzata e dovrebbe venire come record con quella versione. Per esempio. se il server dice "TLS 1.1" nel suo ServerHello allora quel ServerHello dovrebbe venire incluso in un record anch'esso etichettato come "TLS 1.1"; e tutti i record successivi sia dal client che dal server dovrebbero usare quella versione.

Interoperabilità

In teoria , un server dovrebbe accettare qualsiasi valore maggiore o uguale a 0x0300 in un campo versione e non dovrebbe lamentarsi se contiene, ad es. 0xA7C0 (che significa "TLS 165.193", una versione fittizia che probabilmente non verrà mai definita). Ciò vale sia per il messaggio ClientHello , sia per le intestazioni dei record. La versione del protocollo influisce sulla codifica dei record, ma i primi record sono in chiaro (senza crittografia), e per loro la versione può essere ignorata perché cleartext è cleartext (i record di cleartext SSL 3.0, TLS 1.0, TLS 1.1 e TLS 1.2 differiscono solo la versione specificata nell'intestazione, ma sono comunque identiche).

In pratica , ci sono rapporti di implementazioni ampiamente implementate che non tollerano campi "versione" in cui il primo byte non è 0x03. Esistono anche implementazioni che non supportano un ClientHello che specifica una versione superiore a 0x0301 (ovvero TLS 1.0).

Per ridurre al minimo i problemi, un cliente:

  • utilizza SSL 3.0 nei record per ClientHello ;
  • dovrebbe specificare la sua versione supportata più alta in ClientHello ;
  • può fallire, in caso di fallimento, di provare nuovamente ClientHello , questa volta richiedendo una versione supportata massima inferiore (per accogliere vecchi server che ottengono un colpo quando vedono "TLS 1.1" o "TLS 1.2").
risposta data 18.03.2013 - 17:58
fonte

Leggi altre domande sui tag