通过SSH访问Amazon EC2实例时,权限被拒绝(公钥)


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连接以上传/下载文件,并查看逐步说明-y2u.be/e9BDvg42-JI
Yasitha Chinthaka 2013年

2
您确定未使用“ sudo chmod 600 pem文件”这会导致此错误,并且意味着您需要在ssh之前使用sudo
Felbus 2014年

同样对于某些Debian OS,用户名是admin。至少适用于6.5和7.0版本。
开发人员

2
如果您的用户名是ec2-user,请确保您未使用ec2_user:)
grisaitis

2
确保用户作为你试图连接已经钥匙中列出他/她的 $HOME/.ssh/authorized_keys文件。
ILMostro_7 '16

Answers:


589

此错误消息表示您认证失败。

这些是可能导致以下情况的常见原因:

  1. 试图用错误的钥匙连接。您确定此实例正在使用此密钥对吗?
  2. 尝试使用错误的用户名连接。ubuntu对于Ubuntu的基于AWS分配的用户名,但在另一些它的ec2-user(或admin在某些Debians,根据波格丹Kulbida的答案)(也可以是rootfedora,见下文)
  3. 尝试连接错误的主机。您尝试登录的主机正确吗?

请注意,1.如果您弄乱了/home/<username>/.ssh/authorized_keysEC2实例上的文件,也会发生这种情况。

关于2.,AMI Image描述中通常缺少有关应使用哪个用户名的信息。但是您可以在AWS EC2文档中找到一些要点4.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,用户名是fedoraec2-user。对于SUSE Linux,用户名是root。否则,如果ec2-user和root不起作用,请与AMI供应商联系。

最后,请注意,身份验证失败还有许多其他原因。如果您想将-v选项添加到SSH命令并读取输出,则SSH通常非常清楚地指出了出了什么问题,如对此问题的许多其他答案所述。


2
我不认为该界面为您提供了向正在运行的实例添加密钥的功能,因此,如果您丢失了正在运行的实例的密钥,则必须开始新的密钥。
Thibault D.

81
#2解决了我的问题,谢谢!
rckehoe

4
这个答案为我解决了。该实例的默认用户名是“ ubuntu”,而不是AWS手册中所说的ec2-user。尝试使用'ec2-user@_your_EC2_IP.amazonaws.com
emf

7
关于#1,错误的密钥,在ssh命令行中添加-v(详细)显示了它正在尝试使用哪些密钥,这使我意识到它没有尝试使用生成的密钥,因为我将其命名为id_rsa以外的名称或id_dsa。
KC Baltz 2014年

3
“ ubuntu是基于ubuntu的AWS发行版的用户名,”这就是我的意思。习惯于使用ec2-user,只是假设它始终是用户名。
Nate Reed

48

在这种情况下,问题是由丢失密钥对引起的。对这个:

  • 无法更改实例上的密钥对。您必须创建一个使用新密钥对的新实例。
  • 如果实例由Elastic Beanstalk上的应用程序使用,则可以解决此问题

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

  1. 访问AWS管理控制台
  2. 打开Elastic Beanstalk选项卡
  3. 从“ 所有应用程序”选项卡中选择您的应用程序
  4. 从左侧菜单中选择配置
  5. 单击实例齿轮
  6. 服务器表单中,检查EC2密钥对输入,然后选择新的密钥对。您可能需要刷新列表才能看到刚创建的新密钥对。
  7. 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
您的答案的第二部分是错误的。您不会收到“权限被拒绝(公钥)”。如果您没有正确设置防火墙设置(安全组)。“权限被拒绝(公钥)。” 是来自SSH的错误消息,并证明您的安全组配置正确。相反,您会得到“ ssh:连接到主机xxxx端口22:连接被拒绝”
Thibault D. 2014年

长话短说:错误消息表明此问题与安全组配置无关。
Thibault D.

你是对的。第二部分处理另一种问题。我修好了职位。
Matteo Ceserani 2014年

如果您丢失了密钥,我认为解决该问题的一种可能方法是对实例进行快照,然后使用新密钥启动一个新实例。在这种情况下,Amazon会将新的公钥追加到.ssh / authorized_keys中,因此请确保以后再删除旧的公钥。(请注意不要删除新的期刊,否则您将回到第一期)
Thibault D.


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

它正在工作,因为您要尝试在支持用户的Amazon上登录该VM
Taimoor Changaiz

我做过whoami然后sudo chown user_name_given_by_whoami xxxx.pem
Chirag Purohit


22

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

用户的主目录是可写组的,用户将无法登录。

(转载于Ubuntu实例。)


1
+1希望我4个小时前已阅读!!!解决了我的问题,其中rsync -a覆盖了我的ec2-user文件夹的权限。
Michael Hobbs 2015年

在进入主目录后,我无法登录。
罗伯特·月亮

那么,如何在受影响的计算机上登录却根本无法登录呢?
PKHunter '16

/ home目录的修复权限也对我有用,谢谢!@AlexPetralia,您的链接已损坏= /,但在AWS论坛上有一篇谈论此话题的消息
Liko

像Alex Petralia或@Michael Hobbs这样的人可以重新发布(或重述)解决方案吗?
Jakub Langr

7

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

ssh -i pemfile.pem -l ubuntu dns

这对我有用,令我感到惊讶的是,它实际上不是讨论可能需要的用户的aws文档的一部分。
2014年

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


5

我显然是由于相同的许可被拒绝错误而挣扎

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配置文件通过意外的全局设置重置了主机,如下所示。第一主机行不应是注释。

$ 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

我希望其他人对此有所帮助。


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.

3

这发生在我身上好几次了。我使用了都在免费层上的Amazon Linux AMI 2013.09.2和Ubuntu Server 12.04.3 LTS。

每次启动实例时,都会拒绝显示权限。我尚未对此进行验证,但是我的理论是在尝试将其SSH入服务器之前,服务器尚未完全设置好。经过几次拒绝权限的尝试后,我等待了几分钟,然后就可以连接了。如果您遇到此问题,建议等待五分钟,然后重试。


我等了5分钟。而且有效。也是免费的。谢谢
Emeka Mbah

2

这是可能导致此错误的令人沮丧的方案:

如果您正在从另一个实例创建的AMI(例如,实例xyz)中午餐一个新实例,则新实例将只接受与实例A使用的相同密钥。这是完全可以理解的,但是会引起混淆,因为在创建新实例的逐步过程中,要求您选择或创建一个无效的密钥(在最后一步)。

不管您创建或选择的密钥如何,新实例都将仅接受您使用的密钥(例如XYZ)。


哇,我从未想过。使用旧密钥为我解决了这个问题。谢谢。
tolgamorf 2014年

它通常将新的公共密钥附加到authorized_keys文件中,从而使两者均可用。自从我测试以来已经有一段时间了,但这就是我期望发生的事情。
Thibault D.

2

我也为此苦了一段时间,直到发现以下内容:

eb ssh

当您从项目目录中使用Bingo-bango no muss no fuss时,您就在


2

就我自己而言,我执行了以下操作:

chmod 400 <key.pem>

ssh -i <key.pem> ec2-user@ec2_public_dns (for debian)

我最初使用root@part时,得到以下提示:

Please login as the user "ec2-user" rather than the user "root".

2

我在Windows中使用WinSCP。它在File Explorer和PuTTY SSH Shell上都可以很好地访问我的Amazon EC2-VPC Linux。没有什么可以做chmod pem file,因为它使用myfile.ppk 转换的puttygenPEM文件




1

我已经两次拥有正确的键和ssh命令行(我知道,因为我正在复制一个正在运行的Ubuntu 14.04实例),但是即使按照上面的Wade Anderson的建议等待了5分钟,也无法将ssh转换为新实例。

我不得不销毁并重新创建机器。这发生在两个不同的场合。由于最初无法进入,所以看不到出了什么问题。

因此,如果您有此问题,请尝试。


1

您必须检查以下几件事:

  1. 确保您的IP地址正确
  2. 确保您使用正确的密钥
  3. 确保使用正确的用户名,您可以尝试:3.1。管理3.2。ec2-user 3.3。ubuntu

我遇到了同样的问题,将用户名更改为ubuntu后就解决了。在AWS文档中,用户ec2-user提到了文档,但是某种程度上对我不起作用。


1

我的私钥被设置为权限400,导致权限被拒绝,将其设置为“ 644”可以帮助我。

key_load_private_type:权限被拒绝是我遇到的特定错误

解: Sudo chmod 644 <key.pem>

注意:必须设置为644,不能与400一起使用


1

当你尝试做的时候

ssh -i <.pem path> root@ec2-public-dns

您会收到一条消息,建议您使用ec2-user

Please login as the user "ec2-user" rather than the user "root".

所以用

ssh -i <.pem path> ec2-user@ec2-public-dns


1

我有同样的问题,这很奇怪。如果您认为自己做的还不错,那就不要遵循以下步骤:有些时候,对于EC2实例的用户会感到困惑!有时您会获得ec2-user,ubuntu,centos等。因此,请检查您的machie用户名!

使用root用户登录 ssh -i yourkey.pem (400 permission) root@<ip> 它将引发错误,并为您提供可用的用户名。然后使用该用户登录。


1

这是很基本的事情,但是请始终确认您要尝试登录的用户。我的情况只是分散注意力。我正在尝试使用root用户:

ssh -i ~/keys/<key_name> root@111.111.111.111

但是是另一个用户

ssh -i ~/keys/<key_name> dedeco@111.111.111.111

1

我有相同的错误,但情况不同。对我来说,它发生了很多次,我可以成功地将ssh切换到我的远程计算机上。经过大量搜索解决我的问题的方法是文件权限。当然这很奇怪,因为我没有更改计算机或属于ssh文件/目录的远程权限。因此,来自优秀的archlinux Wiki来看,它是:

对于本地计算机,请执行以下操作:

$ chmod 700 ~/
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_ecdsa

对于远程计算机,请执行以下操作:

$ chmod 700 ~/
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

在那之后,我的ssh开始再次工作,没有允许被拒绝(publickey)的东西。


0

另一个可能的问题:错误的登录ID

检查“使用说明”

上面所有好的建议,但我遇到的是我选择了一个预制实例。实例启动后,请查看用法说明。在本应使用“ bitnami”的说明中,我错误地使用了私钥的登录ID(例如,bitnami @ domain -i key.pem)


0

我有类似的错误

debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: xxxx.pem
debug1: Authentications that can continue: publickey
debug1: No more authentication methods to try.
Permission denied (publickey).

我的问题是,由于运行启动脚本从Step 3: Configure instance detail下面的错误,实例无法正确启动Advanced details:

我以为我输入了什么:

#include
 https://xxxx/bootstrap.sh


实际输入的内容破坏了实例设置

#include

https://xxxx/bootstrap.sh

因此未创建实例端的公钥


0

区分大小写。

错误:SSH EC2用户 @ XXX.XX.XX.XX -i MyEC2KeyPair.pem

正确:SSH ec2-user @ XXX.XX.XX.XX -i MyEC2KeyPair.pem


-1

我可以从一台计算机进行SSH,但不能从另一台计算机进行SSH。原来我使用了错误的私钥。

我发现此问题的方法是从私钥中获取公钥,如下所示:

ssh-keygen -y -f ./myprivatekey.pem

结果~/.ssh/authorized_keys与EC2实例上的不匹配。


-1

上面所有排名靠前的答案都是准确的,应该可以在大多数情况下使用。如果它们与我的情况不同,我只是简单地删除了我~/.ssh/known_hosts尝试从ssh发送的计算机上的文件,这为我解决了问题。之后我就可以连接了。


虽然删除known_hosts可以解决连接到主机密钥已更改的服务器时出现的问题(尽管这是一种不好的方法),但我敢肯定它无法解决“权限被拒绝(公钥)”错误。
Martin Prikryl
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.