Mensaje de error
userauth_pubkey: signature algorithm ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]
También se muestra como
- userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]
- userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedKeyTypes [preauth]
- userauth_pubkey: signature algorithm ssh-ed25519 not in PubkeyAcceptedAlgorithms [preauth]
Texto según la versión de sshd (comprobado en el código fuente de OpenSSH): 9.0 y posteriores, «signature algorithm … not in PubkeyAcceptedAlgorithms»; 8.5–8.9, «key type … not in PubkeyAcceptedAlgorithms»; 8.4 y anteriores, «key type … not in PubkeyAcceptedKeyTypes» (la opción cambió de nombre en 8.5). El algoritmo que aparece en el mensaje varía según el cliente y la restricción del servidor.
OpenSSH server (sshd) log — the client sees only "Permission denied (publickey)."
Qué significa
El registro del servidor explica un «Permission denied (publickey)»: el cliente presentó un algoritmo de firma que el servidor no acepta. Con `ssh-rsa`, se trata del esquema de firma RSA basado en SHA-1, desactivado por defecto desde OpenSSH 8.8 (2021). La clave RSA en sí está bien —la misma clave funciona con los algoritmos `rsa-sha2-256`/`rsa-sha2-512`—, pero el cliente (un OpenSSH antiguo, una biblioteca desactualizada o un dispositivo embebido) solo conoce la variante con SHA-1.
Por qué ocurre
Un cliente SSH antiguo o una biblioteca antigua firma con ssh-rsa
frecuenteOpenSSH anterior a 7.2, Paramiko anterior a 2.9 (también detrás del plugin de conexión paramiko de Ansible), el JSch original 0.1.55 (plugins de Jenkins, IDE), las versiones antiguas de golang.org/x/crypto y muchos dispositivos de red solo producen firmas `ssh-rsa`.
El servidor restringe aún más los algoritmos
ocasionalLas guías de endurecimiento (hardening) fijan `PubkeyAcceptedAlgorithms` en una lista corta (por ejemplo, solo Ed25519 y ECDSA); las claves RSA o Ed25519 que quedan fuera de esa lista se rechazan, como muestra el alias con `ssh-ed25519`.
Una clave DSA
ocasional`ssh-dss` está desactivado desde OpenSSH 7.0 y se eliminó en 10.0. Las claves DSA deben sustituirse.
Cómo solucionarlo
- 1.
Usar una clave moderna o un cliente moderno
Una clave Ed25519 evita por completo el problema de RSA/SHA-1; si no es posible, actualiza la biblioteca cliente para que negocie `rsa-sha2-*`.
bash # Best: a modern key type, which every current client signs correctly ssh-keygen -t ed25519 -C "deploy@ci" -f ~/.ssh/deploy_ed25519 # Or keep the RSA key and use a client that supports rsa-sha2-256/512 # (OpenSSH >= 7.2, Paramiko >= 2.9, JSch fork 0.2.x, golang.org/x/crypto >= 2022, PuTTY >= 0.75) - 2.
Permitir ssh-rsa de forma acotada, si es imprescindible
Un bloque `Match` para un único dispositivo heredado mantiene las firmas SHA-1 lejos de todos los demás. Trátalo como algo temporal.
text # /etc/ssh/sshd_config.d/legacy-device.conf - only for one legacy client, and remove it afterwards Match Address 10.0.5.17 PubkeyAcceptedAlgorithms +ssh-rsa
Errores relacionados
Permission denied (publickey).OpenSSH client (ssh, scp, sftp, git over SSH)Unable to negotiate with 127.0.0.1 port 22: no matching host key type found. Th…OpenSSH client (8.8+) connecting to a server that only offers legacy host key algorithmsssh: handshake failed: ssh: unable to authenticate, attempted methods [none pub…golang.org/x/crypto/ssh (Go)