通过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的答案)(也可以是root,fedora,见下文)
  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,用户名是fedora或ec2-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. 救
  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
您的答案的第二部分是错误的。您不会收到“权限被拒绝(公钥)”。如果您没有正确设置防火墙设置(安全组)。“权限被拒绝(公钥)。” 是来自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 转换用的puttygen从PEM文件。




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.