En SSH:
- Las claves DH se usan para lograr el secreto hacia adelante, son únicas para cada sesión y son efímeras: no hay necesidad ni manera de distribuirlas previamente
- las claves de autenticación del cliente (RSA) ya tienen el requisito de estar predistribuidas: al colocar la clave pública del cliente en el archivo
authorized_keys
del servidor
- las claves de autenticación del servidor se pueden distribuir previamente colocando la clave pública del servidor en el archivo
known_hosts
del usuario o aceptadas manualmente por el usuario en la primera conexión
Aclaraciones de los comentarios:
Buscando una forma en que un MITM no pueda obtener una retención de las claves públicas del cliente y falsificar el servidor como un cliente legítimo. [] el MITM todavía podría intentar enviar datos al servidor, ya que el servidor cree que es el cliente real.
Podría "intentar", pero no tendría éxito. La clave pública no es un token que usted presenta a la parte autenticadora que debe coincidir. La clave pública es utilizada por el lado de autenticación para descifrar el mensaje enviado y cifrado (firmado) por la parte que se autentica, asegurando así que se cifró con la clave privada correspondiente.
El conocimiento de una clave pública no permite suplantar al titular de la clave privada correspondiente.
Si alguien "escuchando" adquiere la clave RSA pública de los clientes, ¿no podrán usarla para conectarse al servidor? ¿Cómo sabría el servidor si se trata de la clave pública RSA de los clientes reales frente a otra persona que usa su clave pública?
Ejemplo: el servidor tiene tres claves públicas configuradas para el acceso pubA
, pubB
, pubC
.
-
B envía un mensaje cifrado con privB
. El servidor recibe un mensaje cifrado e intenta descifrarlo utilizando la clave pública pubA
- se vuelve incomprensible. Luego intenta descifrar el mensaje usando pubB
y esta vez recibe un mensaje válido. Significa que el mensaje fue cifrado usando privB
. La única entidad que posee el privB
es B, por lo que el servidor confirmado B es el remitente y otorga el permiso de acceso.
-
Alguien cifra el mensaje inicial con pubB
y lo envía al servidor. El servidor no puede descifrarlo usando pubB
(porque necesita privB
, pero solo B posee el privB
, no el servidor).
-
Alguien envía pubB
al servidor, el servidor no tiene idea de qué es. No espera que se envíe ninguna clave.
La explicación anterior es conceptual, el algoritmo de intercambio de clave real es más complejo, ya que también debe establecerse el contenido del mensaje inicial