Windows通过OpenSSH/Bitvise访问EC2实例报公钥权限拒绝错误
Windows 系统连接 AWS EC2 报 Permission denied (publickey) 解决方案
按以下优先级逐一排查,90%以上的同类问题都能解决:
1. 先确认登录用户名匹配实例AMI
不要默认所有实例都用ec2-user,不同系统镜像的默认登录用户名完全不同,填错用户名会直接触发公钥认证失败:
- Amazon Linux 2/Amazon Linux 2023:
ec2-user - Ubuntu 官方镜像:
ubuntu - Debian 官方镜像:
admin - RHEL/CentOS Stream 官方镜像:
ec2-user - SUSE 官方镜像:
ec2-user - 自定义镜像:使用制作镜像时配置的用户名
2. 排除密钥不匹配、实例内公钥损坏问题
本地存储的.pem文件和实例绑定的密钥对不匹配、实例内~/.ssh/authorized_keys文件损坏是该报错最高发的原因,新手最稳妥的排查/修复方式:
- 打开EC2控制台,选中目标实例,先停止实例(仅停机不会删除数据,不要点终止)
- 右键实例选择「实例设置-编辑用户数据」
- 粘贴以下配置,将
<替换为你本地pem对应的公钥全文>替换为实际内容:公钥是pem文件对应的以ssh-rsa或ssh-ed25519开头的一整行字符串,可以在PowerShell里执行ssh-keygen -y -f 你的pem文件完整路径直接导出公钥内容
Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud_final_modules: - [users-groups, once] users: - name: ec2-user ssh-authorized-keys: - <替换为你本地pem对应的公钥全文>
- 保存用户数据后启动实例,等实例状态检查全部通过后再尝试连接
如果你用的是Ubuntu等其他系统镜像,把上面配置里的
name: ec2-user改成对应系统的默认用户名即可
3. 修正Windows下.pem文件的权限配置
你之前执行的icacls命令遗漏了权限清理的关键步骤,Windows OpenSSH客户端会强制校验密钥文件权限,只要存在任何非授权用户的访问权限,就会拒绝加载密钥,哪怕你能正常打开文件也不行。正确配置步骤:
- 找到本地.pem文件,右键选择「属性-安全-高级」
- 点击「禁用继承」,选择「将已继承的权限转换为此对象的显式权限」
- 删除所有权限条目里的非授权账户,包括Administrators、Users、Authenticated Users等所有组/用户,仅保留你当前登录Windows的个人账户、SYSTEM账户两个条目
- 给两个保留的条目仅分配「读取、读取和执行」权限即可,不要开完全控制权限,权限过高同样会被OpenSSH判定为不安全
如果用PowerShell执行命令配置,直接运行以下代码,替换为你的pem文件实际路径:
$pemPath = "C:\你存放pem文件的完整路径\my_pem_file.pem" icacls $pemPath /reset icacls $pemPath /inheritance:r icacls $pemPath /grant:r "$($env:USERNAME):(R)" icacls $pemPath /grant "SYSTEM:(R)"
4. 正确执行连接命令
用Windows自带OpenSSH连接时,不要省略密钥参数,避免客户端加载错误路径下的其他密钥,标准连接命令格式:
ssh -i "你的pem文件完整路径" 正确用户名@EC2公网IP或公网域名
举个实际例子:pem存在当前用户下载文件夹,实例是Amazon Linux、公网IP为54.xx.xx.xx,命令为:
ssh -i "C:\Users\你的Windows用户名\Downloads\my_pem_file.pem" ec2-user@54.xx.xx.xx
如果用Bitvise连接,在密钥导入环节确认选中的是对应正确的pem文件,不要选错本地其他密钥。
5. 排查网络与实例服务问题
- 确认实例的2项状态检查全部通过,实例刚启动时SSH服务需要1-2分钟加载,刚开机就连接会报错
- 确认安全组入站规则放通了你当前网络的出口公网IP的22端口,不要只设置0.0.0.0/0就认为规则正确,部分本地网络运营商、公司防火墙会拦截22端口出站请求
- 可以先在EC2控制台通过网页端的实例连接功能登录实例,如果网页端能正常登录,直接查看对应用户主目录下
~/.ssh/authorized_keys文件内容,确认里面存储的公钥和你本地pem的公钥一致,不一致就把本地公钥追加到文件末尾,保存后即可正常连接
内容的提问来源于stack exchange,提问作者Advait Kulkarni
相关产品推荐
相关产品推荐

