ssh客户端严格校验私钥权限(必须600),windows下需通过ntfs安全属性清除继承权限并仅保留当前用户控制权;rdp本身不依赖ssh密钥,但通过ssh隧道、winrm over ssh等间接调用openssh时同样受此限制。

SSH 和 RDP 都会因客户端私钥权限过宽而拒绝连接,但机制不同:SSH 是主动校验并中止加载,RDP(Windows 环境下使用 OpenSSH 客户端时)同样沿用该逻辑。关键不在于服务端,而在于你本地用于发起连接的私钥文件是否满足安全访问限制。
SSH 客户端私钥权限必须为 600
OpenSSH 客户端(如 Linux/macOS 的 ssh 命令、Windows 上的 OpenSSH for Windows 或 Git Bash 中的 ssh)在读取私钥前强制检查权限。若发现私钥(如 id_rsa、id_ed25519)可被组或其他用户读取(例如权限是 644、664、755),会直接报错:
- Permissions for '/home/user/.ssh/id_rsa' are too open.
- Permission denied (publickey).
解决方法很简单:
- Linux/macOS:运行 chmod 600 ~/.ssh/id_rsa
- 确保整个 ~/.ssh 目录权限为 700(chmod 700 ~/.ssh)
- 避免将私钥放在共享目录、OneDrive 同步路径或 NTFS 挂载点上——这些位置可能绕过或重置权限
Windows 下不能只信 chmod 命令
在 Windows 使用 WSL、Git Bash 或原生 OpenSSH 时,chmod 600 命令可能看似执行成功,实则未真正生效——因为 NTFS 权限体系不认 Unix 权限位。系统仍会检测到“Authenticated Users”、“Users”等组有读取权,从而拒绝使用私钥。
正确做法是通过图形界面修正 NTFS 权限:
- 右键私钥文件 → “属性” → “安全” → “高级”
- 点击“禁用继承”,选择“从此对象中删除所有已继承的权限”
- 仅保留当前登录用户的“完全控制”,移除所有其他条目(特别是 Authenticated Users、Everyone、Users)
- 确认应用,关闭窗口
RDP 场景中私钥权限问题的特殊性
RDP 协议本身不使用 SSH 密钥,但如果你通过以下方式间接涉及私钥,则同样受控:
- 用 ssh -L 建立跳转隧道后连接 RDP(如 ssh -L 3390:target:3389 user@jump)→ 此时跳转主机的私钥必须合规
- 在 Windows 上用 OpenSSH 客户端执行 scp 或 ssh 同步 RDP 相关配置 → 私钥权限错误会导致 scp 失败,阻断部署流程
- PowerShell Remoting over SSH(WinRM over SSH)→ 同样依赖私钥认证,权限过宽即失败
这类场景下,只要调用了 OpenSSH 客户端组件,就遵循同一套权限校验规则,修复方式与上述一致。
快速验证是否修复成功
改完权限别急着连服务器,先做两步闭环验证:
- 运行 ssh -T -i /path/to/id_rsa git@github.com(或任意支持密钥登录的地址),观察是否跳过密码直接返回欢迎信息
- 若仍报错,加 -v 参数查看详细日志:ssh -v -i ~/.ssh/id_rsa user@host,重点关注 debug1: read_passphrase: 和 debug1: key_load_private: 后是否出现 “too open” 提示










