Mensagem de erro
userauth_pubkey: signature algorithm ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]
Também aparece 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 por versão do sshd (conferido no código-fonte do OpenSSH): na 9.0 e posteriores, “signature algorithm … not in PubkeyAcceptedAlgorithms”; da 8.5 à 8.9, “key type … not in PubkeyAcceptedAlgorithms”; na 8.4 e anteriores, “key type … not in PubkeyAcceptedKeyTypes” (a opção foi renomeada na 8.5). O algoritmo citado na mensagem varia conforme o cliente e a restrição do servidor.
OpenSSH server (sshd) log — the client sees only "Permission denied (publickey)."
O que significa
O log do servidor explica um “Permission denied (publickey)”: o cliente apresentou um algoritmo de assinatura que o servidor não aceita. No caso de `ssh-rsa`, trata-se do esquema de assinatura RSA baseado em SHA-1, desativado por padrão desde o OpenSSH 8.8 (2021). A chave RSA em si não tem problema — a mesma chave funciona com os algoritmos `rsa-sha2-256`/`rsa-sha2-512` —, mas o cliente (um OpenSSH antigo, uma biblioteca desatualizada ou um dispositivo embarcado) só conhece a variante com SHA-1.
Por que acontece
Um cliente SSH antigo ou uma biblioteca antiga assina com ssh-rsa
comumO OpenSSH anterior à versão 7.2, o Paramiko anterior à 2.9 (também por trás do plugin de conexão paramiko do Ansible), o JSch original 0.1.55 (plugins do Jenkins, IDEs), versões antigas do golang.org/x/crypto e muitos dispositivos de rede só geram assinaturas `ssh-rsa`.
O servidor restringe ainda mais os algoritmos
ocasionalGuias de hardening definem `PubkeyAcceptedAlgorithms` com uma lista curta (por exemplo, apenas Ed25519 e ECDSA); chaves RSA ou Ed25519 fora dessa lista são recusadas, como mostra a variante da mensagem com `ssh-ed25519`.
Uma chave DSA
ocasionalO `ssh-dss` está desativado desde o OpenSSH 7.0 e foi removido na versão 10.0. Chaves DSA precisam ser substituídas.
Como corrigir
- 1.
Usar uma chave moderna ou um cliente moderno
Uma chave Ed25519 evita por completo o problema RSA/SHA-1; caso contrário, atualize a biblioteca do cliente para que ela 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 restrita, se for mesmo necessário
Um bloco `Match` para um único dispositivo legado mantém as assinaturas SHA-1 longe de todos os outros. Trate-o como temporário.
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
Erros 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)