跳到主要内容
ecdsa.com
OpenSSH client (ssh, scp, sftp, git over SSH)SSH

错误信息

Permission denied (publickey).

也可能输出为

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

前面带有 `user@host:` 前缀。括号中的列表显示服务器仍然允许的方法,例如 `(publickey,password)` 或 `(publickey,gssapi-keyex,gssapi-with-mic)`。

含义

SSH 连接和主机验证都已成功,但服务器没有接受客户端提供的任何公钥,而公钥身份验证又是它允许的唯一方法(括号中的列表)。客户端永远无法得知密钥被拒绝的原因——原因只记录在服务器日志中。在 GitHub、GitLab 和 Bitbucket 上,同样的消息表示你的任何一个密钥都没有注册在能访问该仓库的账号上(也没有注册为它的部署密钥)。

原因

修复方法

  1. 1.

    查看提供了哪些密钥

    `ssh -v` 会列出客户端提供的每个密钥,以及服务器是否接受;`ssh -G` 显示应用全部配置后实际生效的用户和身份文件。

    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.

    按主机固定身份文件

    `IdentityFile` 加上 `IdentitiesOnly yes` 只会提供一个密钥,可以避免代理中密钥很多时出现“Too many authentication failures”。

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

    修复服务器端并查看日志

    以严格的权限为正确的用户安装公钥,并在 sshd 的日志中查找具体的拒绝原因。

    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"

相关错误

浏览完整的签名错误库