Existen algunos escenarios en los cuales podemos observar un mensaje de error/advertencia que indica que la clave o identificación del equipo remoto ha cambiado ("Remote Host Identification Has Changed"). Este error puede ocurrir cuando un usuario hacker está interviniendo su conexión SSH con el fin de robar información personal de su plataforma; sin embargo, en la mayoría de las ocasiones, se debe a un cambio en la clave RSA del host llevada a cabo por el propio usuario. En esta guía explicamos cómo solucionar el problema.

¿Por qué aparece este mensaje cuando intento iniciar sesión?

Tal como se expone en la introducción de este artículo, el mensaje puede aparecer si un hacker se ha infiltrado en su servidor para robar información. No obstante, es un error común que ocurre cuando existe un cambio en la clave RSA del host, ¿pero cuándo hay un cambio en esta información?: es un cambio muy común cuando hace una reinstalación (una reinstalación de Linux o UNIX a través de OpenSSH) o un rebuild del sistema operativo que reside en su servidor, o incluso un cambio periódico que pueden hacer algunos administradores para garantizar la seguridad de su servidor. El mensaje de error —o advertencia— aparece para evitar posibles suplantaciones de identidad en dicho servidor.

Antes de continuar asegúrese de que el equipo remoto realmente ha sufrido algún cambio similar a los mencionados anteriormente. Si es así, entonces debe eliminar la clave antigua y volver a conectarse al servidor, de este modo se guardará la nueva clave en lugar de la almacenada anteriormente.

Descripción del error

El error ocurre cuando intentamos conectarnos utilizando el protocolo SSH a nuestro servidor. Digamos que utilizamos el siguiente comando para conectarnos a nuestro servidor con el puerto 1222 para SSH en lugar del puerto predeterminado (22 para SSH):

ssh 123.45.67.89 -p 1222

Se genera el siguiente mensaje de error:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
4a:22:1c:56:a6:ea:11:12:9a:cd:1b:b2:17:4d:e5:ea.
Please contact your system administrator.
Add correct host key in /home/usuario/.ssh/known_hosts to get rid of this message.
Offending key in /home/usuario/.ssh/known_hosts:1
RSA host key for 123.45.67.89:1222 has changed and you have requested strict checking.
Host key verification failed.

Solución al problema

Para deshacerse de este problema debe corregir la clave del host en el directorio $HOME/.ssh/known_hosts (/home/usuario/.ssh/known_hosts en nuestro ejemplo). Puede usar las siguientes opciones para deshacerse de la "clave ilegal". El :1 en el mensaje de error indica que se trata de la primera clave (línea) guardada en ese archivo.

Primera alternativa: usando ssh-keygen

La solución más simple es utilizar el comando ssh-keygen en conjunto con el parámetro -R el cual elimina todas las claves correspondiente al hostname de un archivo known_hosts. Esta opción es útil para eliminar todos los hosts tipo hash. Utilice el siguiente comando:

ssh-keygen -R 123.45.67.89:1222

Recuerde sustituir la dirección 123.45.67.89 con la dirección IP real de su servidor, o el hostname completo del servidor, por ejemplo (servidor1.ejemplo.com). El ejemplo mostrado arriba asume que el puerto usado para SSH es el 1222 si utiliza el puerto predeterminado elimine el texto desde los dos puntos y utilice simplemente:

ssh-keygen -R servidor1.ejemplo.com

Ahora podrá conectarse al host sin ningún problema.

Segunda alternativa: agregar la clave de host correcta en el archivo /home/usuario/.ssh/known_hosts

Si no quiere eliminar todo el contenido del archivo known_hosts y simplemente quiere agregar la clave correcta, puede eliminar solamente la línea ilegal en dicho archivo. Tal como se mencionó anteriormente, el mensaje de error indicará cuál es la línea del problema (Offending key in /home/usuario/.ssh/known_hosts:1). Digamos que nuestro archivo known_hosts contiene lo siguiente:

servidor1.com,111.222.33.44:1222 ssh-rsa voWdfAIHlqpCb6rP4FkDMUZlEk6IMuv2VuVlO0chqTQEi7P5gAlK5V1ZJKLJkg4qcGV5TLUCQQCsO0qa6DpJNu0RdoilhHwr7tp9H7xp8dlqa9eCNuFkXve2O6V4vg3vRC1CIHXVUOVeC3dRU+FFHBVJ2Wf00X6/AkAgd8l6pwv632Gw83DnzM6ruy4ehkBtVJSVbsp6zVHzRCcC1PNsY/IT5TzuNOTyUcxQ86/aMo15sqg0zr03/u35AkBU+KeV
servidor2.com,111.222.33.45 ssh-rsa
RC1CIHXVUOVeC3dRU+FFHBVJ2Wf00X6/AkAgd8l6pwv632Gw83DnzM6ruy4ehkBtVJSVbsp6zVHzRCcC1PNsY/IT5TzuNOTyUcxQ86/aMo15sqg0zr03/u35AkBU+KeVB0+CQYvyWqWN63ALiLrYkmi1aDFYlL3tK0BF8aiKiqDXkgRz8BHYFwWraU7P+B40zIpOO02xcoYcPaMnAkAOBZ1TP9WTSwdgjjlnlMtfSzp5JspHFa7ahAkPWF4nM3Ot
servidor3.com,111.222.33.46 ssh-rsa 
MIICXQIBAAKBgQCg0vyxr+at3z6YldgJTLknu/0EQHDaymqlAWdbl2ee24EzM97KjoTHPZH5K/MMt3296yY/4/NkDQGzceLGAM3dj0wklWw+qthyxzf0WtU8nmAtQi+X0lmZI8Xg8nhXA02CKN/9YNvVLWIIevrpGvLdeUho1oDve+Nwsr0PP0LfvwIDAQABAoGAZKiJ5sD89dijuicXZ4Kw5NDBpTacLCTDKPG++lHCVmh27lBJ4qffLUE5Kya5

Para eliminar el primer servidor (servidor1.com) abra el archivo con su editor de preferencia, usaremos vi para este ejemplo:

vi /home/usuario/.ssh/known_hosts

Movemos el cursor a la línea en cuestión y escribimos lo siguiente: dd. La línea será eliminada. Luego simplemente escriba :wq y presione Enter para guardar el archivo y salir.

También puede usar un comando directo para eliminar la línea que está causando el problema. Por ejemplo, si la línea es la número 3 utilice:

sed -i 3d /home/usuario/.ssh/known_hosts

Vuelva a conectarse al servidor usando SSH

Intente volver a conectarse al servidor, si siguió los pasos correctamente, podrá ver un mensaje similar al siguiente:

The authenticity of host '111.222.33.44' can't be established.
ECDSA key fingerprint is 4a:22:1c:56:a6:ea:11:12:9a:cd:1b:b2:17:4d:e5:ea.
Are you sure you want to continue connecting (yes/no)? yes

Escriba yes o acepte la advertencia en la ventana emergente, se agregará entonces la clave a la lista hosts conocidos (archivo known_hosts):

Warning: Permanently added '111.222.33.44' (ECDSA) to the list of known hosts.

Error relacionado: La clave para la dirección IP y nombre de equipo no coinciden

Si se accede al servidor usando la dirección IP, se guardará la clave asociado a dicha dirección IP, pero qué ocurre si hay algún cambio en la clave del equipo remoto. Se mostrará un mensaje como el siguiente:

Warning: the ECDSA host key for 'servidor.ejemplo.com':1222 differs from the key for
the IP address '111.222.33.44'
Offending key for IP in /home/usuario/.ssh/known_hosts:25
Are you sure you want to continue connecting (yes/no)?

Para solucionarlo ejecute el comando ssh-keygen -R para esa dirección IP específica:

ssh-keygen -R 111.222.33.44:1222