Amazon EC2实例SSH访问时出现“Permission denied (publickey)”错误

355

我想使用我的Amazon ec2实例,但是遇到了以下错误:

Permission denied (publickey).

我已经创建了我的密钥对并下载了.pem文件。

给定:

chmod  600 pem file.

然后,运行此命令

ssh -i /home/kashif/serverkey.pem  ubuntu@ec2-54-227-242-179.compute-1.amazonaws.com

但是会出现这个错误:

Permission denied (publickey)

另外,我该如何使用FileZilla连接以上传/下载文件?


1
关于您的第二个问题,可连接使用Filezilla上传/下载文件,请查看以下步骤说明- http://y2u.be/e9BDvg42-JI。 - Yasitha Waduge
2
你确定你没有使用“sudo chmod 600 pem file”这条命令吗?这会造成此错误,并意味着你需要在 ssh 命令前加上 sudo。 - felbus
2
如果您的用户名是 ec2-user,请确保不要使用 ec2_user :) - william_grisaitis
2
请确保您尝试连接的用户在其$HOME/.ssh/authorized_keys文件中列出了密钥。 - ILMostro_7
我不小心删除了 .ssh/authorized_keys 文件,如何重新登录? - Kishan Mehta
显示剩余5条评论
29个回答

588

这个错误信息意味着您未能通过身份验证。

以下是可能导致此问题的常见原因:

  1. 尝试使用错误的密钥进行连接。您确定此实例正在使用该密钥对吗?
  2. 尝试使用错误的用户名进行连接。在基于Ubuntu的AWS发行版上,ubuntu是用户名,但在其他一些发行版中,则为ec2-user(根据Bogdan Kulbida的答案,在某些Debian上也可以是admin)(还可以是rootfedora,请参见下文)
  3. 尝试连接错误的主机。您确定要登录的是正确的主机吗?

请注意,如果您搞砸了EC2实例上的 /home/<username>/.ssh/authorized_keys 文件,则1.也会发生。

关于2.,关于应该使用哪个用户名的信息通常缺乏AMI Image说明。但是您可以在AWS EC2文档中找到一些帮助,第四个小点:http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html

使用ssh命令连接实例。您将指定私有密钥(.pem)文件和user_name@public_dns_name。对于Amazon Linux,用户名是ec2-user。对于RHEL5,用户名是root或ec2-user。对于Ubuntu,用户名为ubuntu。对于Fedora,用户名为fedora或ec2-user。对于SUSE Linux,用户名是root。否则,如果ec2-user和root无法正常工作,请与AMI提供商联系。

最后,请注意认证失败可能有许多其他原因。如果您在SSH命令中添加-v选项并阅读输出,正如许多其他答案中所解释的那样,SSH通常会明确说明出了什么问题。

2
我认为该界面不提供向正在运行的实例添加密钥的选项,因此如果您丢失了正在运行的实例的密钥,则必须启动一个新实例。 - Thibault D.
81
#2修复了我的问题,谢谢! - rckehoe
4
这个答案对我有用。这个实例的默认用户名是"ubuntu",而不是AWS手册中提到的"ec2-user"。尝试使用'ec2-user@_your_EC2_IP.amazonaws.com'. - emf
7
关于#1,错误的密钥,将-v(详细模式)添加到ssh命令行中,让我看到它尝试的是哪些密钥,这让我意识到它并没有尝试我生成的密钥,因为我给它命名为除id_rsa或id_dsa之外的其他名称。 - KC Baltz
3
"ubuntu是基于AWS的Ubuntu发行版的用户名,这让我有些疑惑。习惯了用ec2-user作为用户名,以为那才是默认的用户名。" - Nate Reed
显示剩余17条评论

48
在这种情况下,问题源于丢失的密钥对。关于此:
  • 无法更改实例上的密钥对。您必须创建一个使用新密钥对的新实例。
  • 如果您的实例是由 Elastic Beanstalk 上的应用程序使用的,则可以解决该问题

您可以按照以下步骤操作:

  1. 访问AWS 管理控制台
  2. 打开Elastic Beanstalk选项卡
  3. 所有应用程序标签中选择您的应用程序
  4. 在左侧菜单中选择配置
  5. 单击实例齿轮
  6. 服务器表单中检查EC2 密钥对输入并选择新密钥对。您可能需要刷新列表才能看到您刚刚创建的新密钥对。
  7. 保存
  8. Elastic Beanstalk 将为您创建与新密钥对关联的新实例。

总的来说,请记住您必须允许您的 EC2 实例接受入站 SSH 流量。

要执行此操作,您必须为 EC2 实例的安全组创建一个特定规则。可以按照以下步骤操作。

  1. 访问AWS 管理控制台
  2. 打开EC2选项卡
  3. 实例列表中选择您感兴趣的实例
  4. 说明选项卡中检查您的实例正在使用的安全组的名称。
  5. 再次在说明选项卡中单击查看规则,并检查您的安全组是否有一个针对端口 22 的入站 SSH 流量的规则
  6. 如果没有,在网络和安全性菜单中选择安全组
  7. 选择您实例使用的安全组,然后单击入站选项卡
  8. 在入站选项卡左侧,您可以为SSH入站流量制定规则:
    • 创建新规则:SSH
    • 来源:您想要访问实例的IP地址子网
    • 注意:如果您想授予实例无限制的访问权限,可以指定0.0.0.0/0,尽管Amazon不建议这样做
  9. 单击添加规则,然后单击应用更改
  10. 检查您是否现在能够通过SSH连接到您的实例。

希望这能像帮助我一样帮助其他人。


1
你的回答的第二部分是错误的。如果你没有正确设置防火墙设置(安全组),你不可能得到“Permission denied (publickey)”。"Permission denied (publickey)"是SSH的一个错误消息,证明你的安全组配置是正确的。相反,你会得到“ssh: connect to host x.x.x.x port 22: Connection refused”。 - Thibault D.
长话短说:错误信息表明此问题与您的安全组配置无关。 - Thibault D.
你说得对。第二部分涉及另一种问题。我已经修复了这篇文章。 - Matteo Ceserani
如果您丢失了密钥,我认为解决的可能方法是对实例进行快照,然后使用新密钥启动新实例。在这种情况下,亚马逊会将新的公钥附加在.ssh/authorized_keys中,请务必在此之后删除旧的公钥。(并小心不要删除新的公钥,否则您将回到最初的问题) - Thibault D.

43

这是我如何解决问题的方法

ssh -i <key> ec2-user@<ec2 ip>

1
对我来说,这里的关键似乎是主机的 DNS 地址与 IP 的区别。使用 ec2-user@<ip> 对我有效。 - Zack
1
解决方案。 - Tpojka

26

我只是在之前加上sudo就解决了这个问题。

sudo ssh -i mykey.pem myec2.amazonaws.com

但是正确的解决方案是先更改所有权,然后像Janus Troelsen在下面所说的那样以普通用户身份连接。对于我的情况,应该是:

chown wellington:wellington key.pem

对我有用(不过需要之后更新一些包)! - user1429980
4
正确的解决方法是先更改所有权,然后以普通用户身份连接。使用 sudo chown wellington:wellington key.pem 命令。 - Janus Troelsen
这是有效的,对于你的情况来说,因为你正在尝试登录到亚马逊上支持 root 用户的 VM。 - Taimoor Changaiz
我先执行了whoami命令,然后使用sudo chown user_name_given_by_whoami xxxx.pem命令。 - Chirag Purohit

23

尝试使用

sudo ssh -i mykey.pem ubuntu@<ec2_ip_public_dns>

或者

sudo ssh -i mykey.pem ec2-user@<ec2_ip_public_dns>

22

另一个可能导致此错误的原因:

当用户的主目录具有组写权限时,用户无法登录。

(在Ubuntu实例上重现。)


1
真希望我4小时前就读了这篇文章!!!解决了我的问题,rsync -a 覆盖了我的 ec2-user 文件夹的权限。 - Michael Hobbs
我将我的主目录移动后,无法登录。 - Robert Moon
修复 /home 目录的权限对我也有效,谢谢!@AlexPetralia,你的链接已经失效了 =/ 但是 AWS 论坛中有一篇帖子讨论了这个问题:https://forums.aws.amazon.com/message.jspa?messageID=334402 - Liko
有没有像Alex Petralia或@Michael Hobbs这样的人可以重新发布(或重申)这个解决方案? - Jakub Langr
@JakubLangr 在用户的主目录上执行 chmod 755 - Michael Hobbs
显示剩余2条评论

7
您需要执行以下步骤:
  1. 如果您使用的是Linux,请打开您的ssh客户端或终端。
  2. 找到您的私钥文件并更改目录。
    cd <path to your .pem file>
  3. 执行以下命令:
    chmod 400 <filename>.pem
    ssh -i <filename>.pem ubuntu@<ipaddress.com>

如果 ubuntu 用户无法工作,请尝试使用 ec2-user


7

对于Ubuntu 12.04 LTS微型实例,我必须将用户名设置为选项。

ssh -i pemfile.pem -l ubuntu dns

这对我有用,我很惊讶AWS文档实际上没有讨论可能所需的用户。 - Ben

5

我遇到了同样的权限被拒绝错误,显然是由于

IT技术引起的。
key_parse_private2: missing begin marker 

在我的情况下,问题的原因是当前用户的ssh配置文件(~/.ssh/config)。
使用以下内容:
ssh -i ~/myKey.pem ec2-user@<IP address> -v 'exit'

最初的输出显示:
debug1: Reading configuration data /home/ec2-user/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 56: Applying options for *
debug1: Hostname has changed; re-reading configuration
debug1: Reading configuration data /home/ec2-user/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config

...这里截掉了许多调试行...

debug1: Next authentication method: publickey
debug1: Trying private key: /home/ec2-user/somekey.pem
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey
debug1: No more authentication methods to try.

上面第三行是实际问题的所在,但我错把下面(上方)第四行的调试信息看成了问题所在。密钥没有问题,但我测试并比较了其他配置。
我的用户ssh配置文件通过下面展示的意外全局设置重置了主机。第一行Host不应该是注释。
$ cat config
StrictHostKeyChecking=no
#Host myAlias
        user ec2-user
        Hostname bitbucket.org
#        IdentityFile ~/.ssh/somekey
#        IdentitiesOnly yes

Host my2ndAlias
        user myOtherUser
        Hostname bitbucket.org
        IdentityFile ~/.ssh/my2ndKey
        IdentitiesOnly yes

我希望有人能够从中受益,以下是相关的IT技术内容:


4

我在连接Ubuntu实例时忘记添加用户名(ubuntu)。所以我尝试了以下方法:

ssh -i /path/my-key-pair.pem my-ec2-instance.amazonaws.com

正确的方法是

ssh -i /path/my-key-pair.pem ubuntu@my-ec2-instance.amazonaws.com

合法的初学者错误。如果您忘记添加用户名,则会使用您在本地计算机上登录的用户的用户名。 - Thibault D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接