SSH密钥登录失败八成以上是权限配置错误所致,需严格检查本地私钥(600)、.ssh目录(700)及远程authorized_keys(600)权限,Windows还需修正NTFS ACL;同时确认sshd_config中PubkeyAuthentication yes已启用并重启sshd,用ssh -vvv定位具体拒绝环节。

SSH密钥登录失败,八成以上是权限配置错误导致的。OpenSSH对文件和目录权限极其敏感,只要权限过宽(比如其他用户可读),就会直接拒绝使用密钥,连尝试都不给,只报“Permission denied (publickey)”或“Bad permissions”。
检查本地和远程的文件权限
权限错误是最高频原因,必须逐项核对:
-
本地私钥文件(如
~/.ssh/id_rsa):必须为600(仅所有者可读写) -
本地公钥文件(如
~/.ssh/id_rsa.pub):建议设为644,但非关键 -
本地.ssh目录(
~/.ssh):必须为700(仅所有者可读写执行) -
远程.ssh目录(
~/.ssh):同样必须为700 -
远程authorized_keys文件:必须为
600,且不能被组或其他人读取
在Linux/macOS上运行以下命令快速修复:
chmod 700 ~/.ssh<br>chmod 600 ~/.ssh/id_rsa<br>chmod 600 ~/.ssh/authorized_keys
Windows用户需特别注意NTFS权限——右键文件→属性→安全→高级,确保只有当前用户有“完全控制”,移除Administrators、SYSTEM等其他主体的权限条目。
确认服务端SSH配置启用公钥认证
登录服务器(可用密码方式临时进入),检查/etc/ssh/sshd_config中以下三项:
-
PubkeyAuthentication yes(必须开启) -
AuthorizedKeysFile .ssh/authorized_keys(路径要匹配实际存放位置) -
PasswordAuthentication no或yes(测试阶段建议保持yes,避免锁死)
修改后务必重启服务:sudo systemctl restart sshd。注意:不要用reload,某些版本不生效。
用调试模式定位卡点
不靠猜,用-vvv看真实流程:
ssh -vvv user@hostname
重点关注三行输出:
-
Offering public key: /path/to/id_rsa→ 客户端是否找到并准备发送私钥 -
Authentications that can continue: publickey,password→ 服务端是否接受公钥方式 -
Authentication succeeded (publickey)或Authentication refused→ 最终结果
如果看到Offering但没后续验证动作,大概率是远程authorized_keys权限或内容格式问题(比如多空格、换行错乱、开头多了ssh-rsa以外的字段)。
验证密钥对是否真正匹配
有时公钥复制错了,或用了不同算法的密钥。简单验证方法:
- 在本地运行:
ssh-keygen -l -f ~/.ssh/id_rsa.pub,记下指纹 - 登录服务器,运行:
ssh-keygen -l -f ~/.ssh/authorized_keys,对比指纹是否一致 - 若不一致,说明粘贴的不是同一对密钥;若报错“not a valid key file”,说明
authorized_keys格式损坏(常见于手动编辑时多加了空行或注释)
推荐用ssh-copy-id部署公钥,它自动处理目录创建、权限设置和追加逻辑,大幅降低人为出错概率。


















