Voltar ao blog

SSH Permission denied (publickey): a correção certa

18 de setembro de 2026

Às 02:10 um deploy morreu numa linha que já digitei mil vezes: ssh deploy@stagingPermission denied (publickey). A chave estava certa. A oferta, não.

TL;DR: Permission denied (publickey) significa que cada chave que o cliente ofereceu foi recusada pelo servidor — um veredito de negociação, não uma senha errada. Diagnostique com ssh -vvv (quais chaves foram oferecidas) e o log do servidor journalctl -u ssh (quais foram recusadas, e por quê). Depois corrija uma das quatro causas: usuário errado, chave ausente do authorized_keys, permissões muito abertas, ou uma chave ssh-rsa recusada pelo OpenSSH 8.8+. ssh-copy-id evita a maioria das recaídas.

$ ssh -T [email protected]
[email protected]: Permission denied (publickey).

O erro é um veredito, não uma pista: tudo o que estava na oferta foi recusado.

Por que o SSH diz “Permission denied (publickey)“?

A autenticação por chave pública é uma negociação de oferta e recusa. O cliente propõe toda chave que consegue encontrar — identidades do agente, do seu ~/.ssh/config, nomes de arquivo padrão (id_ed25519, id_rsa) e tudo o que passar com -i. O servidor confere cada oferta contra o ~/.ssh/authorized_keys da conta alvo. Quando nada corresponde, e a autenticação por senha está desativada ou esgotada, o cliente imprime a linha que todo engenheiro devops tem decorada.

Dois fatos importam para depurar. Primeiro, a mensagem não diz qual usuário você atingiu — metade dos casos é uma chave perfeitamente boa sentada no authorized_keys da conta errada. Segundo, o servidor já disse o porquê: o sshd registra cada oferta recusada. O stack trace que ninguém pediu e todo mundo precisa é o -vvv.

Como vejo qual chave o SSH está realmente oferecendo?

ssh -vvv deploy@staging 2>&1 | grep -iE "offering|identity|denied|authentications"
# debug1: Offering public key: /home/you/.ssh/id_ed25519 RSA-SHA256 (explicit)
# debug1: Authentications that can continue: publickey
# deploy@staging: Permission denied (publickey).

Leia três linhas: Offering public key (o que o cliente propôs), Authentications that can continue (o que o servidor ainda aceita — se password não aparece, nenhum pedido de senha chegará jamais) e o veredito final. Se a sua chave nunca aparece na lista de ofertas, o problema está no cliente: caminho -i errado, um IdentityFile esquecido no ~/.ssh/config, ou um agente (ssh-add -l) segurando uma identidade obsoleta que responde primeiro.

Quais são as quatro causas reais?

CausaSinalCorreção
Usuário erradoA chave funciona para root@host, falha para deploy@hostA chave deve estar no ~/.ssh/authorized_keys daquele usuário
Chave não instaladaO log do servidor mostra Failed publickey em cada ofertassh-copy-id user@host
Permissões muito abertasCliente: WARNING: UNPROTECTED PRIVATE KEY FILE — a chave é descartada, nunca oferecidachmod 700 ~/.ssh; chmod 600 ~/.ssh/*
Chave ssh-rsa antigaServidor com OpenSSH 8.8+; chave RSA velha nunca aceitaRegenerar como ed25519, ou modernizar a chave

A causa das permissões merece nota à parte, porque o OpenSSH a aplica com rigor: uma chave privada legível pelo grupo ou por outros é recusada pelo próprio cliente e sai silenciosamente da oferta. A correção são dois comandos:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519 ~/.ssh/authorized_keys

A causa ssh-rsa tropeça em imagens de CI antigas e Raspberry Pi: o OpenSSH 8.8 (lançado em 2021-10-01, openssh.com/txt/release-8.8) desativou por padrão as assinaturas ssh-rsa — a variante baseada em SHA-1. Nas palavras das release notes, “the ssh-rsa signature scheme is … disabled by default”. Uma chave RSA gerada em 2018 não está quebrada; o formato de assinatura dela simplesmente não é mais falado. Gerar uma chave ed25519 (ssh-keygen -t ed25519) é a resposta duradoura, e os consoles de nuvem oferecem um console serial para quando você se trancar fora no meio do conserto.

Se o sshd se recusa a iniciar enquanto você edita a configuração dele, essa é outra caçada — veja systemd service not starting.

Como vejo por que o servidor recusou a chave?

O log do servidor é a testemunha honesta. No Ubuntu (systemd), o sshd registra o veredito de cada oferta:

journalctl -u ssh -n 50 --no-pager | grep -iE "publickey|denied|accepted"
# sshd[4421]: Failed publickey for deploy from 203.0.113.7 port 51422 ssh2: RSA SHA256:...
# sshd[4421]: Accepted publickey for deploy from 203.0.113.7 port 51422 ssh2: ED25519 SHA256:...

Um Failed publickey com uma impressão digital inesperada significa que o cliente ofereceu uma chave diferente da que você pensava — de volta ao -vvv. Um Failed publickey com a sua impressão significa que a chave está certa mas não está instalada para aquela conta, ou que as permissões do home no lado do servidor estão erradas (a mesma regra 700/600 vale para o ~/.ssh e o ~/.ssh/authorized_keys do servidor).

Como instalo a minha chave corretamente?

ssh-copy-id deploy@staging
# Number of key(s) added: 1
ssh -o BatchMode=yes deploy@staging 'echo ok'   # prova não interativa

O ssh-copy-id adiciona a sua chave pública ao authorized_keys da conta alvo com permissões sãs — existe porque colar à mão no authorized_keys falha na medida certa, por uma quebra de linha final ou um diretório que não existe. O teste com BatchMode é a prova real: desativa todos os prompts, então o sucesso significa que a chave sozinha carregou o login. Com a chave funcionando, scp e rsync herdam a mesma autenticação de graça — a escolha entre eles é banda, não credenciais (rsync vs scp).

A triagem de 30 segundos

ssh -vvv user@host 2>&1 | grep -i offering      # 1. quais chaves foram oferecidas?
journalctl -u ssh -n 50 | grep -i publickey     # 2. por que foram recusadas?
ls -ld ~/.ssh ~/.ssh/authorized_keys            # 3. 700 / 600?
ssh-copy-id user@host                           # 4. instalar, e verificar com BatchMode

Permission denied (publickey) é um resultado de negociação, não um pedido de senha — o servidor recusou cada chave da oferta, e o log dele já sabe o porquê.

Os quatro comandos na ordem e a falha deixa de ser mistério: um deles aponta o culpado todas as vezes. O meu era uma identidade de agente obsoleta respondendo antes da chave certa — ssh-add -d, e o deploy ficou verde às 02:31.

FAQ

Por que o SSH diz Permission denied (publickey)?

Significa que cada chave oferecida pelo cliente foi recusada pelo servidor, e a autenticação por senha ou keyboard-interactive não foi tentada ou não é permitida. É um veredito de negociação sobre as suas chaves — não uma senha digitada errada.

Como corrigir SSH permission denied (publickey) no Ubuntu?

Verifique o lado do servidor com journalctl -u ssh -n 50, confirme que a sua chave pública está no ~/.ssh/authorized_keys do usuário alvo, e garanta permissões 700 no ~/.ssh e 600 no authorized_keys e na chave privada.

Por que ssh -iMinhachave ainda falha?

Três razões comuns: as permissões da chave privada estão muito abertas e o OpenSSH se recusa a carregá-la, o servidor roda OpenSSH 8.8+ que desativou ssh-rsa (assinaturas SHA-1), ou a chave não está nos authorized_keys do usuário certo.

Como adiciono a minha chave pública a um servidor?

Execute ssh-copy-id user@host — adiciona a sua chave pública ao ~/.ssh/authorized_keys com as permissões corretas. Se o login por senha já estiver desativado, faça por um console ao qual ainda tenha acesso.

— mrsaynothing

— mrsaynothing

Notas de campo sobre IA, Linux e self-hosting.

Get the next one by email

One email per post. No spam, no algorithms.

self-hosted · no third parties · one-click unsubscribe

what is this?

Gitignore não funciona? A correção de verdade

Gostou dos artigos? É assim que eu construo profissionalmente. me contrate