亚马逊EC2权限被拒绝(公钥)

78

看起来这是一个常见问题,但我的具体情况似乎有些不同。

我使用命令行工具设置了一个新的Amazon EC2实例,并通过SSH连接进行了一些配置工作。

最初,我无法ssh连接到实例,必须停止并重新启动实例,然后才能连接。在重新启动之前,我只收到了回复。

Permission denied (publickey).

昨晚发生的事,今天早上我回到同一个实例,但现在我只得到了这个:

Permission denied (publickey).

我已经尝试重新启动实例,但没有成功。

有人能指导我吗?昨晚可行的命令现在不起作用了,我是从我的Macbook Pro连接的。

16个回答

78

我想回答自己的问题,以便其他人也可以看到......昨晚我做了:

ssh-add ~/.ssh/[keypair name]

然后已经连接到:

ssh ec2-user@[ec2 instance ip]
今天早上我尝试了同样的方法,但是无法连接。但是做了一件事情。
ssh -i ~/.ssh/[keypair name] ec2-user@[ec2 instance ip]

使用ssh-add再次针对密钥对进行操作可以让我登录。我猜测ssh-add只在我执行它的shell中有效。当我关闭终端窗口并打开另一个时,如果没有显式指定,我将无法使用该密钥对。


8
谢谢,一直忘记使用“ec2-user”这部分,而返回的错误信息对这个错误并没有太多提示。 - pulkitsinghal
22
如果是Ubuntu实例,请使用ssh -i ~/.ssh/[密钥对名称] ubuntu @[EC2实例IP] - Gal Bracha
弹性Map Reduce集群 --> hadoop @[ec2实例IP] - craastad
2
尝试更改用户名。如果您使用的是Ubuntu,则“ubuntu”应该是您的用户名。 - Foxinni
最好将@GalBracha的信息放在答案正文中。这是一条非常有用的信息,否则读者可能会错过它。 - Dylan Knowles
显示剩余2条评论

32

我遇到这个问题是因为我没有使用正确的用户名。当我使用一个教程中使用的AMI登录时,我可以成功登录,但是当我尝试使用另一个AMI(来自Bitnami的ubuntu + LAMP)时,我会收到“Permission denied (public key)”错误提示。最终我意识到,如果我将教程AMI的用户名从ubuntu改为ec2-user,我会得到相同的错误提示。

于是我快速谷歌了一下,发现Bitnami AMI的用户名是bitnami。问题得到解决。


重新安装实例,更改键值对等等花了很多时间,最终发现问题出在用户名上!谢谢 :) - Katya S
4
谢谢您的提示。对于我的情况,恰恰相反,我需要使用“ubuntu”作为用户名。 - STW
对我不起作用。使用Bitnami AMI,他们说bitnami是用户名,使用正确的.pem,在新的shell中启动,但什么也没有发生。非常令人沮丧,这是第二天没有进展。 - John Smith

15

我遇到了类似的问题,后来发现是主目录的权限问题。幸运的是我还有另一个已经存在的ssh连接,所以我能够检查ec2实例上的日志:

$ sudo less /var/log/secure

其中包含:

Dec  9 05:58:20 ... sshd[29816]: Authentication refused: 
    bad ownership or modes for directory /home/ec2-user

通过执行以下命令解决了这个问题:

$ chmod og-rwx /home/ec2-user

希望能对其他人有所帮助。


如果您还没有打开连接,您可以做些什么呢? - Nate
5
回答了自己的问题:将EBS卷附加到另一个EC2实例上,进入该实例并更改权限,然后重新附加到您关心的实例。 - Nate
+1 我们遇到了同样的问题,这正是亚马逊支持团队向我们提供的确切答复。主文件夹上的权限是罪魁祸首。 - amit1310
1
是的!!这确实是问题所在,而且没有第二个连接来进行任何调查,这篇文章真是我的救命恩人! - chrismarx
@Nate 我尝试将EBS卷附加到另一个实例上,但现在我在该实例上遇到了相同的问题。这很有道理,因为现在该实例具有错误的权限。你是如何避免这种情况的? - Wouter van Dijke

13
请注意,重新启动实例后,DNS名称会更改。我因此犯了几次错。密钥文件仍然有效,但“服务器名称”已更改。

1
谢谢您的提示。这也是我的问题。 - asmaier

3

谢谢!

我非常感谢@Trevor在这里的回答。我要添加一个小技巧,以避免将来出现此问题。

便利性

因为您必须为每个可用区创建不同的密钥对,所以管理它们以及使用它们的命令变得非常麻烦。通过在~/.ssh/config中进行适当的设置,我的ssh命令变得非常简单:

ssh ec2-52-10-20-30.us-west-2.compute.amazonaws.com

这是在美国西部2可用区的服务器的完整公共DNS。选择适当的用户名和密钥是因为以下原因:
## ~/.ssh/config

Host *.us-west-2.compute.amazonaws.com
    User ec2-user
    IdentityFile ~/.ssh/bruno-bronosky-aws-us-west-2.pem

3
如果EC2实例使用的是Ubuntu ami 14.04,请在EC2实例IP之前添加“ubuntu@”。
ssh -i [key name] ubuntu@[EC2 instance ip]

2
这是我们在处理ssh时经常遇到的问题。
当您使用Mac或Linux系统时,可以按照以下步骤操作:
1.进入Pem文件所在位置。 2.在那里打开终端。 3.运行以下命令:chmod 400 4.然后使用命令连接服务器与ssh,一切都会正常工作。
但是Windows系统存在问题,因为chmod不是cmd或PowerShell中的命令。
要在Windows上使用ssh,我们必须按照以下过程操作: (注意:此过程仅适用于PowerShell,不适用于CMD。我建议使用管理员模式的PowerShell。)
以下是步骤:
1.以管理员模式打开PowerShell。 2.进入pem文件所在的文件夹。 3.按顺序运行以下命令:
这里pem文件的名称为key.pem 1.icacls.exe key.pem /reset // 撤销所有权限 2.icacls.exe key.pem /grant:r "$($env:username):(r)" //授权所有以前的特权 3.icacls.exe key.pem /inheritance:r //删除所有继承
希望这能解决您的问题。
以下引用来自以下链接:在WINDOWS中CHMOD 400

2

从cli连接EC2对于第一次来说可能有些棘手。 如果您转到

服务 -> 计算 -> EC2 -> 运行的实例 > 并选择要ssh的实例 -> 连接

然后您将看到描述如何连接的对话框。 其中一部分如下所示。

enter image description here

如果您在数字4之前没有使用ec2-user@,您将会得到
Permission denied (publickey).

只需复制并粘贴下面在“示例:”中提到的内容。


1
请确保您的私钥路径正确。
如果您的ssh客户端找不到您要提供的私钥,奇怪的是它不会给您错误提示!它只是不会使用该密钥。它将使用您在 .ssh/id_dsa 和 .ssh/id_ecdsa 下拥有的任何密钥,这当然会导致公钥身份验证失败。

0

我也收到了:权限被拒绝。

我使用了:

ssh -v -i ~/.ssh/pemfile ec2-user@xx.xx.xx.xx

而且回应是:

debug1: No more authentication methods to try.

输入命令:
ssh-add -l

但是响应为空

所以,我认为钢笔文件的格式有问题。接下来,我找到了从ec2网站下载的钢笔文件,并将其移动过来。在此之前,我创建了一个新文件,并从下载的pem文件中解析文本到目录“.ssh”,然后:

ssh-add filename

操作成功。


这是一个答案/解决方案吗?从我所读的内容来看,不是完全清楚你是否真正成功了。我打算提出一个[编辑],基于我认为你的意思,但如果不准确,请回滚它。 - gravity

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