¿Por qué Wireshark muestra la versión TLS 1.2 aquí en lugar de TLS 1.3?

8

Estoy accediendo al servidor de prueba TLS 1.3 " https://tls13.pinterjann.is " a través de un cliente http java usando TLS 1.3. Todo parece funcionar bien, ya que la respuesta html indica:

Respuesta HTML

Lo que no entiendo: ¿por qué Wireshark se muestra en la descripción general del protocolo TLSv1.3 pero en la versión de detalles TLS 1.2?

¿Wireshark solo muestra la versión incorrecta o estoy usando TLS 1.2?

Gracias de antemano por su apoyo.

Wireshark ClientHola Wireshark HelloRetry Wireshark ClientHello 2 Wireshark ServerHola

usuario120513
fuente
¿Está actualizada su copia de Wireshark?
Jesse P.
1
Sí, estoy usando Wireshark versión 2.6.5.
user120513
1
Curiosamente, decía 1.3 en una línea pero luego 1.0 en otra, luego 1.2 en otra. ¿Has probado una utilidad de captura diferente, como Fiddler?
Jesse P.
No, no probé otra herramienta de captura. ¿Fiddler admite la visualización de mensajes TLS 1.3?
user120513
Por cierto: encontré esta captura cloudshark.org/captures/64d433b1585a en Internet, donde sucede lo mismo. Supongo que es una inexactitud en la forma en que Wireshark muestra la versión en la sección de detalles.
user120513

Respuestas:

14

Disculpe, por la confusión, me faltaba la semántica exacta de TLS 1.3: por ejemplo, en Client Hello, el campo "versión" debe contener el valor fijo 0x0303 (TLS 1.2), mientras que la versión preferida está contenida en la extensión "compatible versiones ".

Desde RFC 8446 (especificación TLS 1.3):

struct {
      ProtocolVersion legacy_version = 0x0303;    /* TLS v1.2 */
      Random random;
      opaque legacy_session_id<0..32>;
      CipherSuite cipher_suites<2..2^16-2>;
      opaque legacy_compression_methods<1..2^8-1>;
      Extension extensions<8..2^16-1>;
  } ClientHello;

legacy_version: en versiones anteriores de TLS, este campo se usaba para la negociación de versiones y representaba el número de versión más alto admitido por el cliente. La experiencia ha demostrado que muchos servidores no implementan adecuadamente la negociación de versiones, lo que lleva a una "intolerancia a la versión" en la que el servidor rechaza un ClientHello aceptable con un número de versión superior al que admite. En TLS 1.3, el cliente indica sus preferencias de versión en la extensión "support_versions" (Sección 4.2.1) y el campo legacy_version DEBE establecerse en 0x0303, que es el número de versión para TLS 1.2. TLS 1. 3 ClientHellos se identifican por tener una versión heredada de 0x0303 y una extensión compatible_versiones presente con 0x0304 como la versión más alta indicada allí. (Consulte el Apéndice D para obtener detalles sobre la compatibilidad con versiones anteriores).

Esto concuerda con lo que muestra Wireshark:

Versiones compatibles con Wireshark

usuario120513
fuente
1
Buen hallazgo Felicidades
Jesse P.
1
Esto se cubrió hace 4 días en una conferencia en 35C3: media.ccc.de/v/… El problema de "intolerancia a la versión" parece estar bastante extendido en los dispositivos "empresariales"
cg909
5

¿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

Lekensteyn
fuente