Qué ves
sign_and_send_pubkey: no mutual signature supported
user@server: Permission denied (publickey,password).
A menudo lo único visible es la segunda línea. En nuestras pruebas la primera línea apareció con un archivo de clave RSA en formato antiguo sin un archivo .pub al lado. Con un archivo .pub, el mismo fallo era silencioso, y solo ssh -v mostraba el motivo:
debug1: send_pubkey_test: no mutual signature algorithm
Crear el archivo .pub quita la primera línea pero no arregla el inicio de sesión.
Por qué ocurre
El nombre ssh-rsa se refiere a dos cosas: un tipo de clave y una firma con SHA-1. Una clave RSA también puede firmar con SHA-256 o SHA-512, conocidas como rsa-sha2-256 y rsa-sha2-512. OpenSSH las admite desde la 7.2. OpenSSH 8.8 dejó de ofrecer por defecto la firma SHA-1, porque SHA-1 está roto.
Así, un servidor anterior a la 7.2, o un equipo con una biblioteca SSH antigua, solo puede aceptar la firma que tu cliente ya no hace. Un servidor moderno no se ve afectado, y no necesitas sustituir una clave RSA por esto: la misma clave inició sesión sin problema en un servidor moderno en nuestras pruebas.
Confírmalo
ssh -v user@server true 2>&1 | grep -E 'remote software version|mutual|server-sig-algs'
Una coincidencia se ve así. Una versión antigua de servidor y ninguna línea server-sig-algs:
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.13
debug1: send_pubkey_test: no mutual signature algorithm
Para confirmarlo, pruébalo en una sola conexión:
ssh -o PubkeyAcceptedAlgorithms=+ssh-rsa user@server
Si inicia sesión, esa es la causa. Los clientes anteriores a OpenSSH 8.5 llaman a esta opción PubkeyAcceptedKeyTypes.
Solución 1: usa una clave Ed25519
Es la mejor solución si el servidor la admite, es decir, OpenSSH 6.5 o posterior. Funcionó contra el servidor 6.6 de nuestra prueba sin opciones especiales, y no necesita SHA-1.
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_oldserver
ssh-copy-id -o PubkeyAcceptedAlgorithms=+ssh-rsa -i ~/.ssh/id_ed25519_oldserver.pub user@server
Mira cómo generar una clave ed25519. ECDSA también sirve donde Ed25519 no esté disponible. Para comparar los dos tipos de clave, mira RSA o Ed25519.
Solución 2: permite ssh-rsa solo para ese host
Úsala para un dispositivo que no puedes cambiar, como equipos de red antiguos. Limítala a ese host en ~/.ssh/config en lugar de ponerla bajo Host *:
Host old-box
HostName 203.0.113.10
User user
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes
PubkeyAcceptedAlgorithms +ssh-rsa
OpenSSH lo describe como un parche provisional hasta que se pueda actualizar el sistema antiguo. Si el dispositivo solo tiene una clave de host RSA, aparece otro error sobre el tipo de clave de host. Añade HostKeyAlgorithms +ssh-rsa al mismo bloque, y mira no matching key exchange para esa familia de errores.
Solución 3: actualiza el servidor
Un servidor con OpenSSH 7.2 o posterior firma con SHA-2 automáticamente y el mensaje desaparece. Un servidor tan antiguo además carece de años de correcciones de seguridad.
Si sigue fallando en sistemas tipo Red Hat
En RHEL 9 y derivados, la política criptográfica del sistema restringe por defecto las firmas SHA-1, además del ajuste de OpenSSH:
update-crypto-policies --show
Si tienes que llegar al servidor antiguo desde esa máquina, vuelve a permitir las firmas SHA-1 con la subpolítica SHA1 y reinicia:
sudo update-crypto-policies --set DEFAULT:SHA1
Afecta a toda la máquina y a cada programa, así que prefiere la solución 1 donde puedas.
El caso inverso
Un cliente antiguo contra un servidor nuevo falla al revés: el cliente ofrece ssh-rsa y el servidor lo rechaza. El cliente solo ve Permission denied (publickey). Actualiza el cliente o usa una clave Ed25519.
Preguntas
¿Tengo que sustituir mi clave RSA?
No. La misma clave RSA firma con rsa-sha2-256 o rsa-sha2-512 en cualquier servidor con OpenSSH 7.2 o posterior. El error viene de servidores antiguos que solo aceptan firmas SHA-1.
¿Es seguro PubkeyAcceptedAlgorithms +ssh-rsa?
Permite firmas SHA-1 solo para ese host. Déjalo en el bloque Host de ese host como solución temporal, y pasa a una clave Ed25519 o a un servidor más reciente.
¿Qué diferencia hay entre ssh-rsa y rsa-sha2-256?
Las dos usan la misma clave RSA. ssh-rsa firma con SHA-1, que OpenSSH dejó de ofrecer por defecto en la 8.8, mientras que rsa-sha2-256 y rsa-sha2-512 firman con SHA-2.
Fuentes
- Notas de la versión de OpenSSH 8.8
- ssh_config(5), PubkeyAcceptedAlgorithms
- Uso de políticas criptográficas de todo el sistema, RHEL 9