Windows SSH 私钥权限过高 (Bad permissions) 修复指南
Windows 下 SSH 私钥因权限过宽被拒绝时的原因与修复步骤说明
#status / growing
#type / debug
[!info] related notes
Windows SSH 私钥权限过高 (Bad permissions) 修复指南
1. 报错现象
在 Windows 下使用 SSH 客户端连接服务器时,出现以下警告,导致私钥被拒绝并退出连接:
Plaintext
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\Users\baker\.ssh\japan_key.pem' are too open.
It is required that your private key files are NOT accessible by others.
Load key "…": bad permissions
2. 报错原因
SSH 出于严格的安全机制,要求私钥文件(如 .pem 或 id_rsa)只能被当前用户本人读取。在 Windows 系统中,文件默认会继承 C 盘用户目录的权限(通常包含 NT AUTHORITY\Authenticated Users 等其他用户组),导致权限过于开放,从而触发 SSH 的安全拦截。
3. 解决方案 (命令行 icacls)
核心思路是:断开权限继承,并仅授予当前用户完全控制权。
推荐直接对整个 .ssh 目录进行设置,这样不仅能修复现有文件,还能让未来新加入的密钥自动处于安全状态(一劳永逸)。
⚠️ 环境差异提示(避坑)
在执行授权命令时,务必注意你当前使用的命令行环境。传统 CMD 环境变量 %USERNAME% 在 PowerShell 中不生效,会导致 帐户名与安全标识间无任何映射完成 的报错。
方案 A:在 PowerShell 中执行(推荐)
如果你的终端带有美化提示符(如 baker ),说明你正在使用 PowerShell。请直接使用你的真实用户名(如 baker):
PowerShell
# 1. 移除 .ssh 目录本身的继承权限
icacls C:\Users\baker\.ssh /inheritance:r
# 2. 移除 .ssh 目录下所有现有文件的继承权限
icacls C:\Users\baker\.ssh\* /inheritance:r
# 3. 授予你对目录本身及未来新文件的完全控制权 (OI=对象继承, CI=容器继承)
icacls C:\Users\baker\.ssh /grant "baker:(OI)(CI)F"
# 4. 授予你对所有现有文件的完全控制权
icacls C:\Users\baker\.ssh\* /grant "baker:F"
(注:如果想在脚本中通用,PowerShell 读取当前用户名的语法是 $env:USERNAME)
方案 B:在传统 CMD 中执行
如果你使用 Win + R -> cmd 打开的传统黑框终端,可以直接使用系统变量自动匹配:
DOS
:: 移除继承
icacls C:\Users\%USERNAME%\.ssh /inheritance:r
icacls C:\Users\%USERNAME%\.ssh\* /inheritance:r
:: 授予完全控制
icacls C:\Users\%USERNAME%\.ssh /grant "%USERNAME%:(OI)(CI)F"
icacls C:\Users\%USERNAME%\.ssh\* /grant "%USERNAME%:F"
4. 命令参数解析
/inheritance:r:移除 (remove) 所有从父目录继承来的权限,让文件处于“白纸”状态。/grant:授予指定的权限。F:完全控制 (Full control)。(OI)(CI):对象继承和容器继承,意味着应用于此文件夹、子文件夹以及其中的文件。
这份笔记排版你还满意吗?需要我再补充一下关于如何在 Windows 下生成 SSH 密钥对的相关笔记吗?