Supongamos el siguiente escenario y corríjame si me equivoco en alguna parte:
Hay un cliente y hay un servidor SSH al que el cliente se conecta. También hay un "hombre en el medio" (MIM) que puede interceptar el tráfico entrante y saliente del cliente.
Ahora suponga que el cliente se conecta al servidor SSH por primera vez y que la información de la clave pública del servidor aún no está en el archivo conocido_hosts. El servidor envía su clave pública al cliente, el cliente comprueba el archivo conocido_hosts, no encuentra allí la clave pública del servidor y, por lo tanto, el servidor ahora debe demostrar su identidad al cliente. La identidad se ha comprobado con éxito (mediante el uso de la clave privada del servidor), pero supongamos que el cliente no almacena la clave pública del servidor en el host conocido después de eso (no es obligatorio almacenarlo en el host conocido, hasta donde sé).
La próxima vez que el cliente se conecte al servidor SSH, el intermediario (MIM) intercepta la solicitud de conexión del cliente y envía su propia clave pública al cliente, en nombre del servidor SSH real. El cliente recibe la clave pública de MIM, inspecciona el archivo conocido y no encuentra la clave pública recibida en ese archivo, por lo que el "servidor" (MIM) debe probar su identidad nuevamente. Debido a que la clave pública de MIM está asociada con la clave privada correspondiente, MIM prueba con éxito su identidad al cliente.
¿Es posible comprometer la seguridad de esa manera? Corrígeme si me equivoco en alguna parte, por favor.
Alguien me dijo que el certificado de dominio del servidor es capaz de resolver el problema, así que, además, me gustaría entender el propósito de los certificados de host. He leído que el certificado se coloca en el archivo conocido_hosts como la clave pública habitual. Pero, ¿para qué usar un certificado si podemos usar la misma clave pública en todos los servidores en el dominio, y simplemente poner esa clave pública en el archivo conocido_host del cliente? Aparentemente, si aún no hay una clave pública en known_hosts, el ataque que he descrito anteriormente todavía es posible, y no importa si el servidor usa el certificado o no.