错误信息
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 上,同样的消息表示你的任何一个密钥都没有注册在能访问该仓库的账号上(也没有注册为它的部署密钥)。
原因
没有提供正确的密钥
常见密钥不在代理中,不在默认路径(`~/.ssh/id_ed25519`、`id_ecdsa`、`id_rsa`)下,也没有用 `-i` 或 `IdentityFile` 指定。如果代理中有很多密钥,服务器可能在尝试到正确的密钥之前就断开连接(MaxAuthTries)。
密钥不在该用户的 authorized_keys 中
常见密钥装给了另一个用户或另一台主机、在重装时被删除,或者(对于 Git 托管平台)添加到的账号并不是拥有该仓库访问权限的那个账号。
sshd 因权限问题忽略了 authorized_keys
偶见在 `StrictModes yes`(默认值)下,如果主目录、`~/.ssh` 或 `authorized_keys` 对所属组或所有用户可写,sshd 就会拒绝使用该文件。服务器日志中会写着“Authentication refused: bad ownership or modes”。
密钥的签名算法不被接受
偶见旧客户端和旧库以基于 SHA-1 的 `ssh-rsa` 算法使用的 RSA 密钥,会被 OpenSSH 8.8+ 服务器拒绝;OpenSSH 10 则彻底移除了 DSA 密钥。服务器日志中会记录“not in PubkeyAcceptedAlgorithms”。
远程用户名错误
偶见`ssh server` 会用你的本地用户名登录。云镜像要求的是 `ubuntu`、`ec2-user`、`admin`;Git 托管平台始终要求 `git@`。
修复方法
- 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.
按主机固定身份文件
`IdentityFile` 加上 `IdentitiesOnly yes` 只会提供一个密钥,可以避免代理中密钥很多时出现“Too many authentication failures”。
text # ~/.ssh/config Host server.example.com User deploy IdentityFile ~/.ssh/deploy_ed25519 IdentitiesOnly yes - 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"
相关错误
userauth_pubkey: signature algorithm ssh-rsa not in PubkeyAcceptedAlgorithms [p…OpenSSH server (sshd) logsign_and_send_pubkey: signing failed for RSA "/path/to/key" from agent: agent r…OpenSSH client with an SSH agent (ssh-agent, gpg-agent, 1Password, Secretive, Windows OpenSSH agent)ssh: handshake failed: ssh: unable to authenticate, attempted methods [none pub…golang.org/x/crypto/ssh (Go)Load key "/path/to/key": invalid formatOpenSSH