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 出于严格的安全机制,要求私钥文件(如 .pemid_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 密钥对的相关笔记吗?

创建于 2026/3/4 更新于 2026/5/27