Perché Wireshark mostra nella panoramica Protocollo TLSv1.3 ma nei dettagli Versione TLS 1.2?
Wireshark riporta TLS 1.3 nella colonna del protocollo a causa del Server Hello contenente un'estensione Versioni supportate con TLS 1.3.
Ricordiamo che le sessioni TLS iniziano con una stretta di mano per negoziare parametri come la versione del protocollo e le cifre. Il client invia un messaggio di handshake di Client Hello in un record TLS contenente:
- Record TLS - Versione: versione minima supportata TLS (in TLS 1.2 e precedenti). In TLS 1.3, questo campo non è realmente utilizzato e DEVE essere 0x0303 ("TLS 1.2") o 0x301 ("TLS 1.0") per motivi di compatibilità. Riferimento: RFC 8446 (pagina 79)
- Client Hello - Versione: versione TLS massima supportata (in TLS 1.2 e precedenti). In TLS 1.3, questo campo non è utilizzato ma DEVE essere impostato su 0x0303 ("TLS 1.2"). Riferimento: RFC 8446 (4.1.2. Client Hello)
- Client Hello - Estensione versioni supportate: elenco delle versioni supportate. Questo è l'unico valore utilizzato dalle implementazioni TLS 1.3 (che possono concordare TLS 1.3, 1.2 o altre versioni). Riferimento: RFC 8446 (4.2.1. Versioni supportate)
Il server invia un messaggio di handshake Server Hello con:
- Server Hello - Versione: versione negoziata (per TLS 1.2 e precedenti). Se TLS 1.3 viene negoziato, DEVE essere impostato su 0x0303 ("TLS 1.2").
- Server Hello - Versioni supportate: un'unica versione negoziata (per TLS 1.3). Non può essere utilizzato per negoziare versioni precedenti.
Pertanto, in TLS 1.2, il client invia un intervallo di versioni supportate mentre un client TLS 1.3 invia un elenco di versioni supportate. Il server sceglierà quindi una singola versione, ma per motivi di compatibilità utilizzerà un nuovo campo per selezionare TLS 1.3 o successivo.
(Anche se un client pubblicizza il supporto per alcune versioni (ad esempio tramite una versione del record TLS contenente "TLS 1.0"), potrebbe comunque fallire l'handshake se il server accetta questa versione bassa.)
Un'altra cosa da tenere presente: Wireshark cerca di interpretare immediatamente un pacchetto quando viene ricevuto. Al momento della ricezione del client Hello, non conoscerà la versione finale e pertanto assumerà la versione del record TLS. Quando viene ricevuto Server Hello, è possibile regolare la versione di conseguenza:
$ tshark -r test/captures/tls13-rfc8446.pcap
1 0.000000 10.9.0.1 → 10.9.0.2 TLSv1 304 Client Hello
2 0.002634 10.9.0.2 → 10.9.0.1 TLSv1.3 658 Server Hello, Change Cipher Spec, Application Data
3 0.005266 10.9.0.1 → 10.9.0.2 TLSv1.3 130 Change Cipher Spec, Application Data
4 0.005772 10.9.0.2 → 10.9.0.1 TLSv1.3 468 Application Data
...
In una dissezione a due passaggi (che include anche la GUI di Wireshark), la versione concordata sarà nota quando stampa i risultati del secondo passaggio:
$ tshark -r test/captures/tls13-rfc8446.pcap -2
1 0.000000 10.9.0.1 → 10.9.0.2 TLSv1.3 304 Client Hello
2 0.002634 10.9.0.2 → 10.9.0.1 TLSv1.3 658 Server Hello, Change Cipher Spec, Application Data
3 0.005266 10.9.0.1 → 10.9.0.2 TLSv1.3 130 Change Cipher Spec, Application Data
4 0.005772 10.9.0.2 → 10.9.0.1 TLSv1.3 468 Application Data
...
Acquisizione test utilizzata sopra: https://github.com/wireshark/wireshark/blob/master/test/captures/tls13-rfc8446.pcap