私钥文件权限必须为600(-rw-------),openssh硬编码校验st.st_mode & 077 == 0,400等其他权限均被拒绝;.ssh目录需700,公钥可644;禁用sudo chmod,注意wsl的ntfs权限问题。

SSH 密钥文件的本地权限不是“越保守越好”,而是必须严格匹配 OpenSSH 的硬性校验规则。设成 400(仅所有者可读)看似更安全,实际会导致 SSH 客户端直接拒绝使用私钥,并报错 Permissions for 'id_rsa' are too open——这不是提示,是强制拦截。
私钥文件必须是 600 权限
即 -rw-------:所有者可读可写,组和其他用户完全无权限。OpenSSH 源码中硬编码检查 st.st_mode & 077 == 0,只有 600 满足该条件。400、500、644 等任何其他组合都会失败。
正确设置步骤
- 私钥文件:
chmod 600 ~/.ssh/id_rsa(路径必须完整,不能只写id_rsa) -
.ssh目录:chmod 700 ~/.ssh(防止他人遍历看到known_hosts或其他密钥) - 公钥文件:
chmod 644 ~/.ssh/id_rsa.pub(公钥本就可公开,无需限制读取)
常见错误要避开
- 不要用
sudo chmod修权限——会把文件属主变成 root,导致你自己的用户无法读取 - 不要手动改目录或文件权限后忽略父子关系:比如
.ssh是 755,即使私钥是 600,某些新版 OpenSSH(如 8.8+)也会拒绝加载 - Windows WSL 用户注意:若
.ssh挂在 NTFS 分区上,默认无 Unix 权限,需启用metadata选项并重启
验证是否生效
运行:
ssh -T -i ~/.ssh/id_rsa git@github.com
成功返回 Hi xxx! You've successfully authenticated,说明权限和密钥都正常。
如果报 Too open,立刻检查:
ls -l ~/.ssh/id_rsa ls -ld ~/.ssh
确认输出分别是 -rw------- 和 drwx------。
不复杂但容易忽略。











