A mi lado esto sucede debido a algo que considero un error ssh
de los clientes más nuevos (OpenSSH_7.9p1
y superiores), cuando trata de aprender una clave de servidor ecdsa
más segura donde ya hay una clave de tipo rsa
más antigua conocida. Entonces presenta este mensaje engañoso!
No conozco una buena solución para esto, la única solución que encontré es eliminar todas las “buenas pero viejas claves rsa
” para que el cliente pueda volver a aprender las “nuevas claves ecdsa
más seguras”. Así que:
El primer paso es eliminar todas las viejas y buenas claves RSA ( Advertencia! Esto pierde la protección contra el MitM ):
- El segundo paso entonces es reaprender todas las claves del host, lo cual debe hacerse manualmente conectándose a cada IP de nuevo usando
ssh
.
Esto es lo que observo:
$ sftp test@136.243.197.100
Connected to test@136.243.197.100
sftp>
$ sftp test@valentin.hilbig.de
Connected to test@valentin.hilbig.de.
sftp>
Ahora intenta conectarte a un nuevo alias de este mismo buen servidor ya conocido:
$ sftp test@gcopy.net
Warning: the ECDSA host key for 'gcopy.net' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:44
Are you sure you want to continue connecting (yes/no)?
Por favor, echa un vistazo a la dirección IP. Es la misma IP que arriba! Así que parece que la (buena) clave de la (conocida) IP de repente se está ofendiendo a sí misma (no es así, ya que el cliente ssh
mezcla dos claves incompatibles, véase más abajo).
Ahora intentamos arreglarlo:
$ ssh-keygen -R 136.243.197.100
# Host 136.243.197.100 found: line 45
/home/test/.ssh/known_hosts updated.
Original contents retained as /home/test/.ssh/known_hosts.old
Intentémoslo de nuevo:
$ sftp test@gcopy.net
Warning: Permanently added the ECDSA host key for IP address '136.243.197.100' to the list of known hosts.
Connected to test@gcopy.net.
$ sftp test@valentin.hilbig.de
Warning: the RSA host key for 'valentin.hilbig.de' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:10
Are you sure you want to continue connecting (yes/no)?
WTF? ¿Qué ha pasado aquí? ¿La nueva clave fresca aprendida del servidor vuelve a fallar? ¿Y el problema incluso cambió de lado? No, no es la llave, ni el servidor. ¡Todo está correcto!
¡Es el cliente ssh
que falla al verificar la clave correcta! La entrada 45
en known_hosts
ahora lleva una clave de tipo ecdsa-sha2-nistp256
mientras que la clave, que fue sacada del servidor por el cliente, es de tipo rsa-sha2-512
(¡y por lo tanto no puede coincidir con la otra clave!).
$ sftp -v test@valentin.hilbig.de
muestra:
debug1: kex: host key algorithm: rsa-sha2-512
mientras que
$ sftp -v test@gcopy.net
muestra:
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
¡Aparentemente el cliente ssh
tiene un error en algún lugar! ¡No puede hacer frente a una clave de host existente en más de una variante! O cae en la trampa de solicitar una variante anticuada de una clave.
¿Cómo arreglarlo?
Realmente no tengo ni idea. Esto probablemente sólo puede ser arreglado aguas arriba.
Pero hay una solución manual pero torpe:
Tienes que eliminar manualmente todos los rastros de la vieja llave de tipo rsa
. La clave en cuestión se muestra en la salida, pero no se marca directamente como el problema:
Warning: the RSA host key for 'valentin.hilbig.de' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:10
comprueba:
awk 'NR==45 { print $2 }' /home/test/.ssh/known_hosts
awk 'NR==10 { print $2 }' /home/test/.ssh/known_hosts
da
ecdsa-sha2-nistp256
ssh-rsa
¡Así que aquí la clave de host parejada es la que ofende y la clave ofensiva es la correcta que debe ser guardada! Así que vamos a eliminar la incorrecta (coincidencia):
ssh-keygen -R valentin.hilbig.de
# Host valentin.hilbig.de found: line 10
/home/test/.ssh/known_hosts updated.
Original contents retained as /home/test/.ssh/known_hosts.old
Ahora comprueba de nuevo:
$ sftp test@valentin.hilbig.de
The authenticity of host 'valentin.hilbig.de (136.243.197.100)' can't be established.
ECDSA key fingerprint is SHA256:tf7lwe10C2p1lK2UG9p//m/4sUBCpX+i9k5Ub63c6Os.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'valentin.hilbig.de' (ECDSA) to the list of known hosts.
Connected to test@valentin.hilbig.de.
sftp>
$ sftp test@gcopy.net
Connected to test@gcopy.net.
sftp>
sftp test@136.243.197.100
Connected to test@136.243.197.100.
sftp>
YAY! El problema finalmente se ha ido. Pero con varias 100 entradas en .ssh/known_hosts
, esta “solución” realmente se convierte en un gran PITA (y una pesadilla de seguridad propensa a errores en Elm Street. YMMV.)