¿Cuál es el significado del campo de versión en un mensaje TLS 1.1+ ClientHello?

10

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.
pregunta Burhan Ali 18.01.2013 - 18:09
fuente

1 respuesta

17

Los campos de versión aparecen en tres lugares:

  • como parte del encabezado de cada registro que el cliente y el servidor envían;
  • como parte del mensaje ClientHello del cliente;
  • como parte del mensaje ServerHello del servidor.

Negociación de versión de protocolo

El campo de versión en el ClientHello es la versión máxima admitida por la implementación del cliente. Por ejemplo, cuando el cliente coloca 0x0302 en este campo (ese es el valor convencional que significa "TLS 1.1"), el cliente le dice al servidor: "Estoy listo para manejar todas las versiones de protocolo hasta TLS 1.1". El campo de versión en el mensaje ServerHello del servidor especifica qué versión de protocolo se usará para esta conexión. El servidor debería utilizar la versión de protocolo más alta que admiten tanto el cliente como el servidor.

El cliente no debe anunciar el soporte para una versión de protocolo que realmente no admita, para que un servidor no elija esa versión, creyendo erróneamente que el cliente realmente la admite.

Acerca de los registros

El ClientHello del cliente se envía envuelto en uno o varios registros , y cada registro contiene también la versión del protocolo. Los registros son como los sobres alrededor de las letras. Es seguro usar la versión 0x0300 (SSLv3) para estos registros, independientemente de la versión máxima admitida indicada en ClientHello ; eso es como enviar una carta en un sobre SSLv3, pero la carta dice "por cierto, también apoyo TLS 1.0 y TLS 1.1". El uso de registros SSLv3 maximiza la interoperabilidad con implementaciones antiguas y con errores que solo conocen SSLv3 y rechazan los registros con una versión superior.

La respuesta del servidor indica la versión del protocolo que se usará, y debe venir como registros que llevan esa versión. P.ej. si el servidor dice "TLS 1.1" en su ServerHello , entonces ese ServerHello debería incluirse en un registro también etiquetado como "TLS 1.1"; y todos los registros posteriores tanto del cliente como del servidor deberían usar esa versión.

Interoperabilidad

Teóricamente , un servidor debe aceptar cualquier valor mayor o igual a 0x0300 en un campo de versión, y no debe quejarse si contiene, por ejemplo. 0xA7C0 (que significa "TLS 165.193", una versión ficticia que probablemente nunca se definirá). Esto se mantiene tanto para el mensaje ClientHello como para los encabezados de grabación. La versión del protocolo afecta a la codificación de los registros, pero los primeros registros están en texto sin cifrar (sin criptografía), y para ellos la versión puede ignorarse porque el texto no cifrado es claro (SSL 3.0, TLS 1.0, TLS 1.1 y TLS 1.2. La versión especificada en el encabezado, pero son idénticas).

En la práctica , hay informes de implementaciones ampliamente implementadas que no toleran los campos de "versión" donde el primer byte no es 0x03. Incluso hay implementaciones que no admiten un ClientHello que especifica una versión superior a 0x0301 (también conocida como TLS 1.0).

Para minimizar problemas, un cliente:

  • utilizará SSL 3.0 en los registros para el ClientHello ;
  • debe especificar su versión más alta admitida en el ClientHello ;
  • puede fallar, en caso de fallar, al intentar ClientHello nuevamente, esta vez reclamando una versión máxima admitida más baja (para acomodar a los servidores antiguos que reciben un golpe cuando ven "TLS 1.1" o "TLS 1.2").
respondido por el Tom Leek 18.03.2013 - 17:58
fuente

Lea otras preguntas en las etiquetas