Windows 下 SSH 私钥报 "UNPROTECTED PRIVATE KEY FILE" 的解决办法
在云平台创建服务器时选了密钥对登录,下载好 .pem 私钥后,在 Windows 自带的 OpenSSH 里执行:
ssh -i D:\keys\server.pem root@<服务器IP>
结果直接被拒:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'D:\keys\server.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
root@<服务器IP>: Permission denied (publickey).
原因
OpenSSH 要求私钥文件只能被当前用户读取。Linux 上对应的是 chmod 600,而 Windows 用的是 ACL(访问控制列表)。
文件放在 D 盘之类的目录时,会从上级目录继承权限,通常 Users、Authenticated Users 这些组也有读权限。ssh 一检查发现”别人也能读”,就拒绝使用这个私钥。
解决:用 icacls 收紧权限
在 PowerShell 里执行:
$key = "D:\keys\server.pem"
# 1. 去掉从上级目录继承来的权限
icacls $key /inheritance:r
# 2. 只给当前用户读权限(/grant:r 表示替换而不是追加)
icacls $key /grant:r "$($env:USERNAME):(R)"
# 3. 确认结果:应该只剩当前用户一行
icacls $key
最后一条命令的输出里只剩 电脑名\用户名:(R) 一行,就说明设置对了。再执行 ssh 就能正常登录。
几点补充
- 不要用”属性 → 安全”里的图形界面一个个删。容易漏掉继承来的权限,命令行更可靠。
- 如果习惯用 Git Bash,它自带的 ssh 对权限的检查方式不一样,有时不报错。但为了统一,还是建议按上面的方法收紧。
- 私钥丢了只能去云平台重新创建密钥对再绑定,记得备份到安全的地方,也千万不要提交到 Git 仓库。
小结
报 UNPROTECTED PRIVATE KEY FILE 就是私钥权限太宽,Windows 上用 icacls /inheritance:r 加 /grant:r 当前用户:(R) 两步解决。