¿Por qué Wireshark se muestra en la descripción general del protocolo TLSv1.3 pero en los detalles de la versión TLS 1.2?
Wireshark informa TLS 1.3 en la columna de protocolo debido a que Server Hello contiene una extensión de versiones compatibles con TLS 1.3.
Recuerde que las sesiones TLS comienzan con un apretón de manos para negociar parámetros como la versión del protocolo y los cifrados. El cliente envía un mensaje de saludo de saludo de cliente en un registro TLS que contiene:
- Registro TLS - Versión: versión mínima compatible de TLS (en TLS 1.2 y anteriores). En TLS 1.3, este campo no se usa realmente y DEBE ser 0x0303 ("TLS 1.2") o 0x301 ("TLS 1.0") para fines de compatibilidad. Referencia: RFC 8446 (página 79)
- Client Hello - Version: versión máxima admitida de TLS (en TLS 1.2 y anteriores). En TLS 1.3, este campo no se usa, pero DEBE establecerse en 0x0303 ("TLS 1.2"). Referencia: RFC 8446 (4.1.2. Cliente Hola)
- Client Hello - Extensión de versiones compatibles: lista de versiones compatibles. Este es el único valor utilizado por las implementaciones de TLS 1.3 (que pueden estar de acuerdo con TLS 1.3, 1.2 u otras versiones). Referencia: RFC 8446 (4.2.1. Versiones compatibles)
El servidor envía un mensaje de saludo de servidor con:
- Server Hello - Versión: versión negociada (para TLS 1.2 y anteriores). Si se negocia TLS 1.3, DEBE establecerse en 0x0303 ("TLS 1.2").
- Server Hello - Versiones compatibles: una única versión negociada (para TLS 1.3). No se puede utilizar para negociar versiones anteriores.
Entonces, en TLS 1.2, el cliente envía un rango de versiones compatibles, mientras que un cliente TLS 1.3 envía una lista de versiones compatibles. Luego, el servidor elegirá una única versión, pero por motivos de compatibilidad utilizará un nuevo campo para seleccionar TLS 1.3 o posterior.
(Incluso si un cliente anuncia soporte para alguna versión (por ejemplo, a través de una versión de registro TLS que contiene "TLS 1.0"), aún podría fallar el protocolo de enlace si el servidor acepta esta versión baja).
Otra cosa a tener en cuenta: Wireshark intenta interpretar un paquete inmediatamente cuando se recibe. En el momento en que se recibe el saludo del cliente, no sabrá la versión final y, por lo tanto, asumirá la versión de registro TLS. Cuando se recibe el Server Hello, puede ajustar la versión en consecuencia:
$ 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
...
En una disección de dos pasos (que también incluye la GUI de Wireshark), la versión acordada se conocerá cuando imprima los resultados del segundo paso:
$ 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
...
Captura de prueba utilizada anteriormente: https://github.com/wireshark/wireshark/blob/master/test/captures/tls13-rfc8446.pcap