Pular para o conteúdo
ecdsa.com
OpenSSH client (ssh, scp, sftp, git over SSH)SSH

Mensagem de erro

Permission denied (publickey).

Também aparece como

  • git@github.com: Permission denied (publickey).
  • Permission denied (publickey,password).

A mensagem vem precedida de `user@host:`. A lista entre parênteses mostra os métodos que o servidor ainda permite, por exemplo, `(publickey,password)` ou `(publickey,gssapi-keyex,gssapi-with-mic)`.

O que significa

A conexão SSH e a verificação do host deram certo, mas o servidor não aceitou nenhuma das chaves públicas que o cliente ofereceu, e a autenticação por chave pública é o único método que ele permite (a lista entre parênteses). O cliente nunca fica sabendo por que uma chave foi recusada — o motivo só aparece no log do servidor. No GitHub, no GitLab e no Bitbucket, a mesma mensagem significa que nenhuma das suas chaves está registrada na conta (ou como chave de implantação) com acesso a esse repositório.

Por que acontece

Como corrigir

  1. 1.

    Ver quais chaves são oferecidas

    O `ssh -v` lista cada chave que o cliente oferece e se o servidor a aceitou; o `ssh -G` mostra o usuário e os arquivos de identidade efetivos depois de aplicada toda a configuração.

    bash
    ssh -v deploy@server.example.com 2>&1 | grep -E "Offering|Server accepts|Authentications that can continue|send_pubkey_test"
    ssh-add -l                                  # keys the agent offers
    ssh -G deploy@server.example.com | grep -E "^(user|identityfile|identitiesonly) "
  2. 2.

    Fixar a identidade por host

    `IdentityFile` junto com `IdentitiesOnly yes` oferece exatamente uma chave e evita “Too many authentication failures” com agentes que guardam muitas chaves.

    text
    # ~/.ssh/config
    Host server.example.com
      User deploy
      IdentityFile ~/.ssh/deploy_ed25519
      IdentitiesOnly yes
  3. 3.

    Corrigir o lado do servidor e ler o log dele

    Instale a chave pública para o usuário correto, com permissões restritas, e procure no log do sshd o motivo específico da recusa.

    bash
    # On the server: install the key and fix modes (sshd ignores keys in group/world-writable paths)
    install -d -m 700 ~/.ssh && cat deploy_ed25519.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys
    sudo journalctl -u ssh --since "10 min ago" | grep -E "Authentication refused|not in PubkeyAccepted|Failed publickey"

Erros relacionados

Ver toda a base de erros de assinatura