Estoy intentando agregar compatibilidad con TLS 1.1 y 1.2 a un producto de captura de paquetes que ya tiene compatibilidad con TLS 1.0.
He utilizado Wireshark para capturar el tráfico entre mi navegador y un servidor openssl para generar algunos casos de prueba. He visto una versión inesperada de TLS fluyendo en todos los rastros que he creado.
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)
Lo anterior es un extracto de una de las trazas TLS 1.2 según lo informado por Wireshark. La versión dada es TLS 1.0 en ClientHello y 1.2 en todos los mensajes posteriores. Esto sucedió tanto en las trazas TLS 1.1 como en las 1.2.
Apéndice E.1. (Compatibilidad con TLS 1.0 / 1.1 y SSL 3.0) del TLS 1.2 RFC 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.
Eso en sí mismo también es un poco ambiguo para mí.
Así que mis preguntas son:
- ¿Puede este campo ser un valor completamente arbitrario (siempre que sea SSLv3 o superior)?
- ¿Cambiará el comportamiento dependiendo de la versión dada en este campo?
- ¿Hay algún significado para que el navegador elija TLS 1.0 en lugar de SSLv3?
Relacionados:
- enlace Esta respuesta sugiere que SSLv3 debe usarse en ClientHello para una máxima interoperabilidad. La mención de la interoperabilidad implica que el servidor se preocupa por el valor que se otorga.