La teoría, como se expone en el estándar es que:
server_version
This field will contain the lower of that suggested by the client
in the client hello and the highest supported by the server.
En el mensaje ClientHello
, el cliente anuncia una versión única, y esto significa "Admito todas las versiones hasta esa versión". Por ejemplo, si el cliente dice "TLS 1.1", entonces el cliente promete de alguna manera que puede manejar SSL 3.0, TLS 1.0 y TLS 1.1. Se supone que el servidor elige la versión de protocolo más reciente que admiten tanto el cliente como el servidor.
Sin embargo, las implementaciones de los clientes saben que no vivimos en un mundo perfecto, y algunos servidores se equivocan a veces, por lo que hacen conexiones en un bucle. Por ejemplo, el cliente primero anuncia "TLS 1.2", pero si el protocolo de enlace falla por alguna razón que podría se debe al soporte del servidor, el cliente puede intentarlo de nuevo, anunciando solo "TLS 1.1" o "TLS 1.0". No todos los clientes hacen eso, pero esto es común para los navegadores web. Como explica @dave, un TLS 1.2 ClientHello
puede ser más grande que una versión anterior y hacer que los servidores mal escritos se disparen, por lo que el comportamiento de "intente nuevamente con una versión más baja" es, por desgracia, necesario.
Como se explicó anteriormente, el cliente solo anuncia un rango, por lo que el cliente no puede expresar un soporte "con agujeros", por ejemplo. soporta TLS 1.0 y 1.2 pero no 1.1 (no es que tenga mucho sentido). De manera similar, el cliente envía tanto su "versión máxima de protocolo admitido" como su lista ordenada de suites de cifrado admitidas, por lo que el cliente no puede expresar en una única ClientHello
una preferencia como: "hagamos TLS 1.2 y AES-CBC, pero si tenemos que usar TLS 1.0, entonces preferiría RC4 porque tengo un miedo mortal al ataque de BESTIA ". Si un cliente desea imponer tales preferencias, entonces debe hacer el truco de "conexiones múltiples".
Para resumir , el paradigma normal de SSL es: lo sugiere el cliente, el servidor elige . Pero si el cliente quiere forzar al servidor a usar una versión específica del protocolo y / o una suite de cifrado, entonces puede, a través de las reconexiones, y los navegadores web existentes pueden jugar este tipo de juegos ocasionalmente.