Windows下SSH连接报Permission denied (publickey)错误的解决方法
Windows环境SSH连接报
Permission denied (publickey)排查修复方案 核心逻辑说明
Windows环境下的OpenSSH客户端不需要执行chmod 600调整权限,它的密钥权限校验完全基于Windows系统的ACL访问控制列表,之前观察到的“完全控制”权限配置如果包含多余的授权主体,反而会触发客户端的安全校验机制,拒绝使用该密钥发起认证,最终触发公钥认证失败报错。
分步修复操作
1. 修正本地私钥文件的ACL权限(替代Linux端chmod 600的等效操作)
- 定位到你的私钥文件路径,默认为
C:\Users\你的Windows用户名\.ssh\目录下的无后缀文件(如id_rsa、id_ed25519) - 右键文件打开「属性」→ 切换到「安全」选项卡 → 点击「高级」按钮
- 关闭「启用继承」开关,在弹出的选项中选择「将已继承的权限转换为显式权限」
- 清除权限列表中所有非必要的授权主体,仅保留三类主体的完全控制权限:
- 当前登录的Windows本地用户
- SYSTEM系统账号
- 本地管理员组
- 注意:只要权限列表中存在Authenticated Users、普通访客用户、其他本地用户这类多余主体,OpenSSH就会判定密钥文件存在泄露风险,主动拒绝对该密钥的使用
2. 校验SSH Agent的密钥加载状态
- 执行
ssh-add -l查看当前SSH Agent中已加载的密钥列表 - 如果之前存在加载错误的旧密钥,先执行
ssh-add -D清空所有缓存的密钥 - 执行
ssh-add 私钥文件的完整绝对路径重新加载正确的私钥,不要依赖无参数的ssh-add自动扫描加载,避免匹配到错误的旧密钥 - 注意:SSH Agent加载密钥的动作本身不会校验文件权限,只有实际发起连接时才会触发权限校验,因此即使ssh-add执行无报错,也可能因为ACL配置不对导致认证失败
3. 排查连接参数的匹配性
- 确认连接命令中的端口号、登录用户名、服务器IP/域名没有输入错误,很多公钥权限报错本质是连接到了错误的服务端口
- 开启调试模式定位具体报错点:执行
ssh -v -p 端口号 用户名@服务器地址,从详细日志中查看客户端实际尝试了哪个密钥、服务器返回的认证失败原因 - 如果存在多个密钥文件,可以在连接命令中直接指定要使用的私钥路径,跳过Agent的自动匹配逻辑:
ssh -i 你的私钥文件完整路径 -p 端口号 用户名@服务器地址
4. 校验服务器侧的公钥配置
- 确认本地与私钥对应的公钥文件(同路径下.pub后缀的文件)内容,已经完整追加到服务器对应用户的
~/.ssh/authorized_keys文件中,没有换行错误、多余字符 - 确认服务器端权限配置符合要求:
~/.ssh目录权限为700,authorized_keys文件权限为600,文件所属用户为当前要登录的普通用户,不是root或其他系统用户 - 确认服务器sshd配置中未禁用公钥认证、未对应用户做登录权限限制
常见误区:不少Windows用户会将私钥文件设置为“所有人完全控制”的宽松权限,实际上OpenSSH for Windows的权限校验规则和Linux端完全对齐,只有最小化的授权集合才会被判定为安全可用,宽松权限反而会触发安全拦截。
内容的提问来源于stack exchange,提问作者Nicolás Covello
相关产品推荐
相关产品推荐

