2010-12-02 23 views
5

Actualmente estoy tomando una clase universitaria sobre seguridad y criptografía, y uno de los proyectos que estamos llevando a cabo implica la implementación de un socket TLS básico.Entender el protocolo TLS/SSL

Así que estudié el protocolo TLS usando tanto mi libro de texto como el último RFC, así que entiendo muy bien cómo funciona TLS/SSL, y también cómo se presenta el formato de registro TLS, byte by byte.

Por lo tanto, para empezar decidí escribir un programa de servidor que escucha en el puerto 443 y acepta conexiones entrantes seguras HTTP. Todo lo que hace es aceptar una conexión de cliente y luego imprimir un volcado hexadecimal del mensaje inicial enviado por el cliente.

Pero cuando me conecto a mi servidor usando un navegador web (Firefox), estoy totalmente desconcertado por la corriente de bits que el navegador me envía. According to the RFC, lo primero que debe hacer un cliente TLS es enviar un mensaje ClientHello. Todos los mensajes deben ser encapsulados en un formato de registro TLS, que se supone debe ser formateado como esto (usando la notación C-ish utiliza el RFC):

struct { 
     ContentType type; 
     ProtocolVersion version; 
     uint16 length; 
     opaque fragment[TLSPlaintext.length]; 
    } TLSPlaintext; 

El campo ContentType es un único valor de enumeración que debe ser uno de los siguientes tipos: change_cipher_spec = 0x14, alert = 0x15, handshake = 0x16, application_data = 0x17

por lo tanto, ya que la primera cosa que un cliente debe hacer es enviar un mensaje ClientHello, que forma parte del apretón de manos, yo esperaría que el primer byte en la corriente de bytes a ser un 0x16, lo que indica este es un mensaje de saludo.

Pero en cambio, el bytestream real mi navegador envía es:

80 55 01 03 00 00 3c 00 00 00 10 00 00 88 00 00 87 00 00 39 00 00 
38 00 00 84 00 00 35 00 00 45 00 00 44 00 00 33 00 00 32 00 00 96 
00 00 41 00 00 04 00 00 05 00 00 2f 00 00 16 00 00 13 00 fe ff 00 
00 0a 00 00 ff 07 99 58 ad 17 f3 17 23 be 63 8c 6d cb 9b 5f 6f 

no puede tener ningún sentido de esta corriente de bytes, incluso después de verter sobre el RFC durante horas. Todo lo que leo sobre TLS me dice que el primer byte debe ser 0x16 para indicar un saludo, seguido de un campo de versión de dos bytes, seguido de un campo de longitud de registro de dos bytes. Pero este byte-stream comienza con 0x80 0x55, lo que no tiene sentido para mí.

¿Alguien puede aclarar qué está pasando aquí? ¿Estoy malinterpretando alguna parte del protocolo TLS?

Respuesta

9

Lo que está viendo es el hello compatible con la versión 2 de SSL. Mira appendix E of RFC 5246. No creo que las versiones más recientes de Firefox lo envíen, solo enviarán el formato de saludo de V3 que esperaban.