AWS两实例共用密钥对,其一SSH登录报Permission denied (publickey)
解决EC2实例同一密钥对登录出现Permission denied (publickey)的问题
这种情况确实挺闹心的——同一密钥对能正常登录一个EC2实例,却在登录另一个时遇到Permission denied (publickey)错误,而且你已经试过常规方案还没解决。我来分享几个针对性的排查和修复步骤,说不定能帮你搞定:
1. 先确认目标实例的网络访问规则
虽然你之前能正常登录,但安全组或网络ACL的规则可能被意外修改:
- 登录AWS控制台,找到出问题的EC2实例,查看它关联的安全组,确认入站规则里是否允许你的公网IP访问22端口(或者临时放开
0.0.0.0/0测试,测试完记得改回去) - 检查实例所在子网的网络ACL,确保入站规则允许22端口流量,出站规则允许所有响应流量
2. 验证目标实例的authorized_keys文件(核心排查点)
密钥对本身没问题,但目标实例里的authorized_keys文件可能丢失了对应公钥或被篡改。由于你没法直接登录,可通过挂载根卷到正常实例的方式检查:
- 停止出问题的EC2实例,分离它的根卷(注意不要删除卷)
- 把这个根卷挂载到你能正常登录的另一个EC2实例上,比如挂载到
/mnt/rescue目录 - 在正常实例上执行以下命令对比公钥:
# 生成本地pem文件对应的公钥 ssh-keygen -y -f mypem.pem # 查看目标实例authorized_keys里的内容 cat /mnt/rescue/home/ec2-user/.ssh/authorized_keys - 如果两者不一致,把本地生成的公钥添加到
/mnt/rescue/home/ec2-user/.ssh/authorized_keys文件中 - 卸载根卷,重新挂载回原EC2实例,启动后再尝试登录
3. 检查文件和目录的权限
就算公钥正确,权限配置错误也会导致SSH拒绝认证:
挂载根卷后,执行以下命令检查并修复权限:
# 修改ec2-user家目录权限 chmod 700 /mnt/rescue/home/ec2-user # 修改.ssh目录权限 chmod 700 /mnt/rescue/home/ec2-user/.ssh # 修改authorized_keys文件权限 chmod 600 /mnt/rescue/home/ec2-user/.ssh/authorized_keys
权限必须严格符合上述要求,否则SSH会认为文件不安全而拒绝使用。
4. 检查sshd服务的配置
有时候sshd的配置被修改,导致公钥认证被禁用:
挂载根卷后,打开/mnt/rescue/etc/ssh/sshd_config文件,确认以下配置项:
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
如果配置项被设为no或者路径错误,修改后保存,再把卷放回原实例启动。
5. 查看系统日志定位具体错误
AWS控制台提供了EC2实例的系统日志,能帮你快速定位问题:
- 在EC2实例详情页,找到“获取系统日志”选项,下载或查看日志内容
- 搜索
sshd相关的日志条目,比如类似Failed publickey for ec2-user from xxx.xxx.xxx.xxx port xxxxx ssh2: RSA SHA256:xxxx的信息,这能直接告诉你是公钥不匹配、权限问题还是其他配置错误
如果以上所有步骤都试过还是无法解决,你可以考虑创建新的密钥对,通过挂载根卷的方式替换目标实例的authorized_keys文件,或者创建新的EC2实例并迁移数据。
内容的提问来源于stack exchange,提问作者user1hjgjhgjhggjhg
相关产品推荐
相关产品推荐

