Estoy seguro de que hay muchas razones obvias para esto, pero ¿por qué no se puede iniciar una sesión SSL con un viaje de ida y vuelta?
Parece que esto sería suficiente:
- El cliente envía su clave pública
- El servidor responde con:
- Su certificado (clave pública + lo que sea necesario para verificarlo)
- Una clave simétrica para usar (cifrada con la clave pública del cliente / firmada con la clave privada del servidor)
Los problemas que se me ocurren son:
-
Es posible que debas saber la versión del protocolo de antemano.
- Parece que el protocolo podría diseñarse para que el cliente envíe primero una versión, luego su clave pública, y si el servidor no lo entiende, envía un mensaje de "intente esta versión", que sería más rápido en el mejor de los casos (el cliente y el servidor entienden el mismo protocolo), y tan rápido como SSL en el peor de los casos ("versión 2 ... mi clave pública", "No entiendo, use la versión 1", " versión 1 ... mi clave pública "," mi certificado ... clave cifrada).
- Para hacer que el protocolo sea más compatible con versiones anteriores, podría tener dos versiones, una para intercambiar las claves públicas y otra para todo lo demás. Solo la versión de clave pública rompería la compatibilidad y requeriría el segundo viaje de ida y vuelta.
- Obviamente, esto no sería compatible con SSL ahora, pero ¿por qué no estaba allí en primer lugar?
-
Tal vez haya más trabajo para el servidor, ya que necesita (1) generar una clave simétrica criptográficamente segura, (2) cifrar esa clave usando cifrado de clave pública, (3) firmar el resultado de eso utilizando cifrado de clave pública . ¿El problema es que sería demasiado fácil sobrecargar el servidor?
-
¿Me falta algo?
Esto me ha estado molestando todo el día, ya que parece tan obvio, pero tiene que haber un defecto evidente que me falta (y por eso no soy un investigador de seguridad).
EDITAR:
Un enlace publicado por @lour tiene esta cita:
En un protocolo de enlace TLS, los mensajes "Finalizados" sirven para validar todo el protocolo. Estos mensajes se basan en un hash del protocolo de enlace procesado hasta ahora por un PRF ingresado con el nuevo secreto maestro (que funciona como MAC), y también se envían bajo la nueva especificación de cifrado con su MAC codificado, donde se deriva la clave MAC Del secreto maestro. El diseño del protocolo se basa en la suposición de que cualquier autenticación de servidor y / o cliente realizada durante el protocolo de enlace se traslada a esto. Si bien un atacante podría, por ejemplo, haber cambiado la lista de conjuntos de cifrado enviada por el cliente al servidor y, por lo tanto, haber influido en la selección del conjunto de cifrados (probablemente hacia una opción menos segura) o haber realizado otras modificaciones a los mensajes de intercambio de información en transmisión, el atacante debería no podrá redondear el protocolo de enlace modificado con un mensaje "Finalizado" válido: se presume que cada conjunto de cifrado TLS ingresa la PRF de manera apropiada para garantizar la impunidad. Una vez que se haya validado el protocolo de enlace mediante la verificación de los mensajes "Finalizados", esto confirma que no se ha modificado el protocolo de enlace, por lo que se está realizando un encriptado seguro (usando los algoritmos negociados) de la autenticación segura.
Entonces, ¿por qué no hacer que el servidor y el cliente firmen sus mensajes de negociación de cifrado con sus claves privadas? Lo sé, más trabajo, pero aún más rápido que un RTT, ¿verdad?