从.pem派生的.ppk可连接EC2,但原.pem无法连接的问题求助
AWS EC2:.pem密钥无法连接但派生.ppk可用的问题排查与解决
问题背景
拥有AWS EC2实例及对应.pem密钥文件,尝试传输文件时遇到以下情况:
- MobaXterm用未修改权限的
.pem连接,报错:Server refused our key / No supported authentication methods available (server sent: publickey) - PuTTY用
.pem派生的.ppk可正常连接 - WinSCP用两种密钥均报错
- 本地执行
ssh -l user -i abc.pem user@ip偶尔成功 - 执行
chmod 400 abc.pem后,上述工具连接仍失败;将.pem复制到服务器执行ssh-add后重启实例,MobaXterm仍无法连接;新实例用修改权限后的.pem也连接失败 - 服务器
~/.ssh/authorized_keys已有一行ssh-rsa AAAAB3Nza....格式的公钥
核心原因分析
1. 本地.pem文件的权限与格式问题
Windows系统不支持Unix-style权限位,即使在Git Bash/WSL执行chmod 400,部分Windows原生SSH工具(如MobaXterm的某些版本)可能无法识别该权限,仍会判定文件权限过于开放导致密钥被拒绝。
另外,.pem文件可能存在格式问题:比如包含Windows换行符(CRLF)、多余空行或空格,而PuTTYgen在转换为.ppk时会自动修复这些格式错误,所以.ppk能正常使用。
2. EC2实例端的SSH配置与权限问题
你只关注了本地密钥的权限,却忽略了服务器端~/.ssh目录及authorized_keys文件的权限要求——这是公钥认证失败的常见原因:
.ssh目录权限必须为700(仅所有者可读可写可执行)authorized_keys文件权限必须为600(仅所有者可读可写)
如果权限过松,sshd会拒绝使用该文件中的公钥。
3. SSH命令的参数冗余
你之前执行的ssh -l user -i abc.pem user@ip存在参数冗余:-l user和user@ip重复指定了用户名,部分情况下OpenSSH会解析异常,导致连接不稳定。
解决步骤
第一步:验证本地.pem的有效性
- 用PuTTYgen打开
.pem文件,确认能正常加载私钥;点击"Save public key"导出公钥,对比服务器~/.ssh/authorized_keys中的内容,确保完全一致(注意不要包含多余注释或换行)。 - 若格式存在问题,直接从PuTTYgen中重新导出
.pem:加载.ppk后,点击"Conversions" -> "Export OpenSSH key",保存为新的.pem文件。
第二步:确保本地.pem的权限被工具识别
- 在WSL或Git Bash环境中操作
.pem文件,执行chmod 400 /path/to/new-abc.pem,然后在该环境下测试SSH连接:
(注意:根据EC2 AMI选择正确的用户名,Ubuntu用ssh -i /path/to/new-abc.pem ubuntu@<EC2-IP>ubuntu,Amazon Linux用ec2-user,CentOS用centos)
第三步:修复EC2实例端的权限与配置
用能正常连接的.ppk登录实例,执行以下操作:
- 修复
.ssh目录权限:chmod 700 ~/.ssh - 修复
authorized_keys权限:chmod 600 ~/.ssh/authorized_keys - 检查sshd配置文件
/etc/ssh/sshd_config:- 确保
PubkeyAuthentication yes(取消注释) - 确保
AuthorizedKeysFile .ssh/authorized_keys(默认配置,若被修改需改回)
- 确保
- 重启sshd服务:
sudo systemctl restart sshd
第四步:针对不同工具的配置调整
- MobaXterm:新建SSH会话时,在"Advanced SSH settings"中选择修改好权限的
.pem,建议将.pem放在WSL的用户目录下(如/home/your-user/abc.pem),而非Windows本地目录。 - WinSCP:新建SFTP站点,在"高级"->"SSH"->"认证"中选择
.pem文件;若仍报错,尝试用PuTTYgen重新导出的.pem,或直接使用.ppk(WinSCP原生支持.ppk)。
内容的提问来源于stack exchange,提问作者gonzalez.ivan90
相关产品推荐
相关产品推荐

