Warum wird Wireshark in der Übersicht Protokoll TLSv1.3 angezeigt, aber in den Details Version TLS 1.2?
Wireshark meldet TLS 1.3 in der Protokollspalte, da Server Hello eine Erweiterung für unterstützte Versionen mit TLS 1.3 enthält.
Denken Sie daran, dass TLS-Sitzungen mit einem Handshake beginnen, um Parameter wie die Protokollversion und Chiffren auszuhandeln. Der Client sendet eine Client Hello-Handshake-Nachricht in einem TLS-Datensatz, der Folgendes enthält:
- TLS-Datensatz - Version: Mindestunterstützte TLS-Version (in TLS 1.2 und früher). In TLS 1.3 wird dieses Feld nicht wirklich verwendet und MUSS aus Kompatibilitätsgründen 0x0303 ("TLS 1.2") oder 0x301 ("TLS 1.0") sein. Referenz: RFC 8446 (Seite 79)
- Client Hello - Version: Maximal unterstützte TLS-Version (in TLS 1.2 und früher). In TLS 1.3 wird dieses Feld nicht verwendet, MUSS jedoch auf 0x0303 ("TLS 1.2") gesetzt werden. Referenz: RFC 8446 (4.1.2. Client Hallo)
- Client Hello - Erweiterung für unterstützte Versionen: Liste der unterstützten Versionen. Dies ist der einzige Wert, der von TLS 1.3-Implementierungen verwendet wird (die möglicherweise TLS 1.3, 1.2 oder anderen Versionen entsprechen). Referenz: RFC 8446 (4.2.1. Unterstützte Versionen)
Der Server sendet eine Server Hello-Handshake-Nachricht mit:
- Server Hello - Version: ausgehandelte Version (für TLS 1.2 und früher). Wenn TLS 1.3 ausgehandelt wird, MUSS es auf 0x0303 ("TLS 1.2") gesetzt sein.
- Server Hello - Unterstützte Versionen: eine einzelne ausgehandelte Version (für TLS 1.3). Kann nicht zum Aushandeln früherer Versionen verwendet werden.
In TLS 1.2 sendet der Client eine Reihe unterstützter Versionen, während ein TLS 1.3-Client eine Liste der unterstützten Versionen sendet. Der Server wählt dann eine einzelne Version aus, verwendet jedoch aus Kompatibilitätsgründen ein neues Feld zur Auswahl von TLS 1.3 oder neuer.
(Selbst wenn ein Client Unterstützung für eine bestimmte Version ankündigt (z. B. über eine TLS-Datensatzversion mit "TLS 1.0"), kann der Handshake dennoch fehlschlagen, wenn der Server dieser niedrigen Version zustimmt.)
Noch etwas zu beachten: Wireshark versucht, ein Paket sofort nach dem Empfang zu interpretieren. Zum Zeitpunkt des Empfangs des Client Hello kennt er die endgültige Version nicht und nimmt daher die TLS-Datensatzversion an. Wenn der Server Hello empfangen wird, kann er die Version entsprechend anpassen:
$ 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
...
Bei einer Dissektion mit zwei Durchgängen (die auch die Wireshark-GUI enthält) wird die vereinbarte Version bekannt, wenn die Ergebnisse des zweiten Durchgangs gedruckt werden:
$ 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
...
Die oben verwendete Testaufnahme: https://github.com/wireshark/wireshark/blob/master/test/captures/tls13-rfc8446.pcap