更改EC2实例的密钥对


Answers:


491

如果您不再具有对现有服务器的SSH访问权限(即,丢失了私钥),则此答案很有用。

如果您仍然具有SSH访问权限,请使用以下答案之一。

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#replacing-lost-key-pair

感谢Eric Hammond的博客文章,这是我的工作:

  1. 停止正在运行的EC2实例
  2. 分离/dev/xvda1音量(我们称其为音量A)- 参见此处
  3. 使用我的新密钥对启动新的t1.micro EC2实例。确保在同一子网中创建它,否则,您将不得不终止实例并再次创建它。- 看这里
  4. 将卷A附加到新的微型实例,如/dev/xvdf(或/dev/sdf
  5. SSH到新的微型实例并将卷A挂载到 /mnt/tmp

    $ sudo安装/ dev / xvdf1 / mnt / tmp

  6. 复制~/.ssh/authorized_keys/mnt/tmp/home/ubuntu/.ssh/authorized_keys

  7. 登出
  8. 终止微实例
  9. 从中分离体积A
  10. 将卷A附加回主实例 /dev/xvda
  11. 启动主实例
  12. 使用新.pem文件像以前一样登录

而已。


6
刚刚救了我的屁股,你真是传奇!
Garry Welding

8
mkdir /mnt/tmp然后mount /dev/xvdf /mnt/tmp应该为#5做点技巧。而且请不要忘记步骤13可能rm ~/.ssh/known_hosts在您一直在连接的盒子上。
brandonscript

21
这太臭了……首先,请参见下面的Eric Hammond的答案。第二:帕特·麦克布(Pat Mcb)的回答。他们实际上执行相同的操作,但在浪费时间的同时却不会浪费时间。PS。另请参见stackoverflow.com/a/24143976/547223
kgadek 2014年

3
我在此处根据此答案编写了非常具体的说明,但实际上是相同的想法-gist.github.com/tamoyal/1b7ec4d3871b343d353d。正如@kgadek指出的那样,这有点脏而且很耗时,但是如果您要锁定服务器以进行密钥更改并且不想旋转该服务器的副本,那么这是一个不错的选择。每个实例大约需要5-10分钟,而不是一个小时。
托尼

4
@Eric和@Pat发布的答案是为只想为其实例使用不同密钥对的人的解决方案。这些无助于首先丢失了密钥对文件的用户。在不分离卷并将其附加到另一个实例的情况下,如何获得对该卷的控制权?更不用说替换原始.ssh/authorized_keys文件了。
sanjeev

187

启动实例后,无法在元数据级别上更改与该实例关联的密钥对,但是您可以更改用于连接到该实例的ssh密钥。

大多数AMI都有一个启动过程,该过程会下载公用ssh密钥并将其安装在.ssh / authorized_keys文件中,以便您可以使用相应的私用ssh密钥以该用户身份进行ssh存取。

如果要更改用于访问实例的ssh密钥,则需要编辑实例本身上的authorized_keys文件,然后转换为新的ssh公共密钥。

authorized_keys文件位于您以其身份登录的用户的主目录下的.ssh子目录下。根据您正在运行的AMI,它可能在以下之一中:

/home/ec2-user/.ssh/authorized_keys
/home/ubuntu/.ssh/authorized_keys
/root/.ssh/authorized_keys

编辑authorized_keys文件之后,在断开与用于编辑文件的会话的连接之前,请始终使用其他终端确认您可以进入该实例。您不想犯错误并将自己完全锁定在实例之外。

当您考虑在EC2上使用ssh密钥对时,建议您将自己的个人ssh公钥上载到EC2,而不要让Amazon为您生成密钥对。

这是我写的一篇文章:

将个人ssh密钥上传到Amazon EC2
http://alestic.com/2010/10/ec2-ssh-keys

这仅适用于您运行的新实例。


我愚蠢地犯了那个错误,我的意思是我编辑了authorized_keys文件并注销了。现在,不能回退:(。有任何快速修复的建议吗?
2012年

11
aatifh:这是我写的一篇文章,内容涉及如何摆脱困境:alestic.com/2011/02/ec2-fix-ebs-root
Eric Hammond,

@EricHammond这可能不合适,但您似乎知道这一切如何工作...我今天设置了一个EC2实例,并.pem在Mac上收到了私钥文件,ssh -i key.pem但未进行身份验证(权限被拒绝(公钥))。在EC2管理控制台中,“密钥对名称”下未列出任何内容。这让我感到震惊。我该如何设置?根据管理控制台显示,我没有配置的密钥对尚未分配给实例!
史蒂文·卢

1
@StevenLu:是的,注释线程是提出新问题的错误位置。尝试在serverfault.com上创建一个新问题(比stackoverflow更适合该问题)。
埃里克·哈蒙德

4
这是一个添加密钥的好方法。这只会在AWS生成的密钥之外添加您的普通发布密钥,因此,如果它不起作用,您将不会被锁定:stackoverflow.com/a/5654728/193494
Kevin C.

78

下载您的AWS pem后,运行此命令。

ssh-keygen -f YOURKEY.pem -y

然后将输出转储到中authorized_keys

或将pem文件复制到您的AWS实例并执行以下命令

chmod 600 YOURKEY.pem

然后

ssh-keygen -f YOURKEY.pem -y >> ~/.ssh/authorized_keys

14
这仅在您已经可以访问系统时才起作用,对吗?(例如不会丢失旧的.pem文件)。
丹尼尔(Daniel)

5
您可以使用>而不是>>覆盖当前用户,而不是添加它。
阿德里安·洛佩兹

这是正确和最简单的答案。无需重新启动,创建新实例或装入驱动器。只需获取.pem,对其进行密钥生成,然后将其添加到authorized_hosts。
Spanky

我已经完成了此ssh-keygen -f YOURKEY.pem -y >>〜/ .ssh / authorized_keys,但是sitll无法使用新的公共密钥访问我的ec2。
manukyanv07

我运行了此命令,但本地密钥没有更改。
Luiz

50

来自AWS EC2支持的说明:

  1. 更改PEM登录
  2. 转到您的EC2控制台
  3. 在“网络与安全”下,单击“密钥对”,然后单击“创建密钥对”。
  4. 给您的新密钥对命名,保存.pem文件。密钥对的名称将用于连接到您的实例
  5. 创建与实例的SSH连接并保持打开状态
  6. 在PuttyGen中,单击“加载”以加载您的.pem文件
  7. 保持选中SSH-2 RSA单选按钮。点击“保存私钥”,您将收到弹出窗口警告,单击“是”
  8. 也单击“保存公共密钥”,以便生成公共密钥。这是我们将复制到您当前实例的公钥
  9. 使用新的密钥对名称和扩展名.pub保存公共密钥。
  10. 在记事本中打开公钥内容
  11. 复制“注释:”下的内容:“ imported-openssh-key”和“ ---- END SSH2 PUBLIC KEY”之前
    的内容---- 注意-您需要将内容复制为一行-删除所有新行
  12. 在连接的实例上,使用工具vi打开您的authorized_keys文件。运行以下命令:vi .ssh / authorized_keys您还应该在文件中看到原始的公钥。
  13. 将光标移动到文件的第一个公钥内容的末尾:键入“ i”进行插入
  14. 在新行中,键入“ ssh-rsa”并添加一个空格,然后再粘贴公共密钥的内容,空格和.pem文件的名称(不带.pem)。注意-您应该使用与上一行格式相同
  15. 按Esc键,然后键入:wq!

这将保存更新的authorized_keys文件

现在尝试使用新的密钥pai向您的实例打开一个新的SSH会话

确认可以使用新密钥对SSH进入实例后,您可以使用.ssh / authorized_key并删除旧密钥。

回答Shaggie评论:

如果您无法连接到实例(例如,密钥已损坏),则可以使用AWS控制台分离卷(http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-detaching-volume.html)并重新将其附加到工作实例,然后更改卷上的键并将其重新附加到先前的实例。


6
应该是最好的答案

2
如果旧密钥已损坏并且由于没有旧的ppk文件而无法通过腻子连接到实例怎么办???
Shaggie's

3
如果您没有SSH访问权限,怎么办,因此会出现此问题。
杰登·劳森

3
Jayden Lawson,如果您没有互联网连接怎么办?
Elia Weiss

1
可能发生了密钥对与其他人共享的情况,现在需要更改密钥对,以使该人无法登录,或者类似这样的其他原因,
Harikrishna

38

我注意到,当由Elastic Beanstalk管理时,您可以更改活动的EC2密钥对。在Elastic Beanstalk>配置>安全下,从EC2密钥对下拉列表中选择新密钥。您会看到此消息,询问您是否确定:

EC2KeyName:对选项EC2KeyName设置的更改不会立即生效。您现有的每个EC2实例将被替换,新设置将生效。

执行此操作时,我的实例已被终止。然后启动,终止并再次启动。显然,“替换”是指终止并创建一个新实例。如果您已经修改了启动卷,请首先创建一个AMI,然后以与Custom AMI ID相同的Elastic Beanstalk>配置>实例形式指定该AMI。这也警告要更换EC2实例。

修改完EC2密钥对和“定制AMI ID”之后,并在看到有关二者的警告后,请单击“ 保存”以继续。

请记住,重新创建实例时IP地址会更改,因此您需要从EC2控制台检索新的IP地址,以便在通过SSH连接时使用。


1
现在,它位于配置的“安全性”部分下。
Will Demaine '18

谢谢@WillDemaine。目前不使用AWS,因此请您同意并批准编辑!
马克·贝里

31

我经历了这种方法,经过一段时间后,它才得以发挥作用。缺乏实际的命令使操作变得很困难,但我发现了。但是-在此之后不久发现并测试了一种更为简便的方法:

  1. 将您的实例另存为AMI(是否重启,建议重启)。仅在支持EBS的情况下才有效。
  2. 然后,只需从此AMI启动实例并分配新的密钥文件。
  3. 将您的弹性IP(如果适用)移到新实例,就完成了。

在我不小心删除〜/ .ssh之后,这对我完全
有用

我做了同样的事情,并且成功了,现在我可以使用新的pem登录了。但是我仍然可以使用旧的pem登录。所以现在2 pems有效。
维塔利2014年

仅供参考,这是一种快速简便的GUI方法,如果忙时使用不同的密钥来旋转新的EC2,但是@vitaly发现您的旧pem密钥也有效,需要转到/home/ec2-user/.ssh/authorized_keys并删除文件中的旧Pem密钥。感谢您在没有时间的情况下快速方便地更改Pem密钥的方法。
Blu Towers

这对我不起作用。AWS一直说该密码不可用,并另有一条消息提到,如果实例是通过AMI创建的,它将使用父映像的凭证。
布雷迪

15

如果遵循以下步骤,将节省大量时间,并且无需停止正在运行的实例。

  1. 使用新密钥对启动新的t1.micro EC2实例。确保在同一子网中创建它,否则,您将不得不终止实例并再次创建它。
  2. SSH到新的微型实例,并将〜/ .ssh / authorized_keys的内容复制到计算机上的某个位置。
  3. 使用旧的ssh key登录到主实例。
  4. 将文件内容从第2点复制并替换到〜/ .ssh / authorized_keys
  5. 现在,您只能使用新密钥再次登录。旧密钥将不再起作用。

这就对了。享受:)


14

我认为最简单的方法是:

  1. 创建现有实例的AMI映像。
  2. 使用带有新密钥对的AMI映像(由步骤1抓取)启动新的EC2实例。
  3. 使用新密钥登录新的EC2实例。

@Brady,什么根本不起作用?做快照?启动实例?登录?
谢尔盖(Sergey)

4
我不确定此更改是否是最近的更改,但是当您从已经分配了密钥的实例创建AMI时,无论是否已登录,都需要该密钥可用于登录复制的AMI映像。您可以在创建过程中分配其他密钥对。
布雷迪

这不是解决方案,因为@Brady提到它不起作用。
格雷格·桑索姆

8

如果您使用的是ElasticBeanstalk平台,则可以通过以下步骤更改密钥:

  • Elastic Beanstalk面板
  • 组态
  • 实例(齿轮右上角)
  • EC2密钥对

这将终止当前实例并创建具有选定键/设置的新实例。


2
如果您使用的是ElasticBeanstalk,这是最简单的答案。
Yuval Karmi

2
警告 !这是一个危险的解决方案。AWS还将重置附加到该实例(!!)的存储(即虚拟HDD)。因此,您必须分离存储,并在提出一个新实例之后,重新附加它,而不是新实例附带的新存储。当然,最好是它不是加密的卷(并且您没有丢失它的密钥。)
JamesC

7

这个问题有两种情况:

1)您无权访问.pem文件,因此您要创建一个新文件。

2)你有。可以访问pem文件,但是出于某些漏洞或安全目的,您只想更改或创建一个新的.pem文件。

因此,如果您丢失了按键,则可以向上滚动并查看其他答案。但是,如果出于安全目的仅更改.pem文件,请按照以下步骤操作:-

1)转到AWS控制台登录并从那里的密钥对部分创建一个新的.pem文件。它将自动将.pem文件下载到您的PC中

2)如果您使用的是Linux / ubuntu,则将权限更改为400,请点击以下命令

chmod 400 yournewfile.pem

3)在本地计算机上生成新下载文件的RSA

ssh-keygen -f yournewfile.pem -y

4)从此处复制RSA代码

5)现在通过先前的.pem文件将SSH连接到您的实例

ssh -i oldpemfileName.pem username@ipaddress

sudo vim  ~/.ssh/authorized_keys

6)给两行空格,然后将复制的新文件的RSA粘贴到此处,然后保存文件

7)现在您的新.pem文件已与正在运行的实例链接

8)如果要禁用以前的.pem文件访问权限,则只需编辑

sudo vim ~/.ssh/authorized_keys

文件并从此处删除或更改以前的RSA。

注意:-小心删除,以免更改新创建的RSA。

这样,您可以将新的.pem文件更改/连接到正在运行的实例。

出于安全考虑,您可以撤消对以前生成的.pem文件的访问。

希望对您有所帮助!


2
我有点喜欢这种解决方案,因为它不需要我使用冻结的AMI映像创建新实例。但是,此方法是否可以更改EC2仪表板中EC2实例的关联密钥对名称?@Parveen yadav
沉迷于

6

最简单的解决方案是复制

~/.ssh/id_rsa.pub

进入您的AWS实例的authorized_keys

~/.ssh/authorized_keys

这将允许您在不为ssh命令指定pem文件的情况下ssh进入EC2实例。经过测试连接后,即可删除所有其他键。

如果您需要创建新密钥以与他人共享,则可以使用以下方法:

ssh-keygen -t rsa

这将创建private key.pem文件,您可以使用以下命令获取该文件的公共密钥:

ssh-keygen -f private_key.pem -y > public_key.pub

拥有private_key.pem的任何人都可以与

ssh user@host.com -i private_key.pem

4
~/.ssh/authorized_keys什至没有SSH AWS实例时如何访问?
祈祷合

3
我相信您的最后一行是错误的,只有拥有私钥,您才能连接。ssh -i private_key.pem user@host.com。如果您希望某人向您提供访问其实例的权限,则可以安全地与他们共享您的公钥,并且他们可以将其添加到他们的authorized_keys中,以授予您作为该用户的实例访问权限……
code4cause

5

您无需旋转根设备并在中更改SSH公钥authorized_keys。为此,可以利用userdata将ssh密钥添加到任何实例。为此,您首先需要使用AWS控制台或通过ssh-keygen创建一个新的KeyPair。

ssh-keygen -f YOURKEY.pem -y

这将为您的新SSH KeyPair生成公共密钥,将其复制并在以下脚本中使用。

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
/bin/echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6xigPPA/BAjDPJFflqNuJt5QY5IBeBwkVoow/uBJ8Rorke/GT4KMHJ3Ap2HjsvjYrkQaKANFDfqrizCmb5PfAovUjojvU1M8jYcjkwPG6hIcAXrD5yXdNcZkE7hGK4qf2BRY57E3s25Ay3zKjvdMaTplbJ4yfM0UAccmhKw/SmH0osFhkvQp/wVDzo0PyLErnuLQ5UoMAIYI6TUpOjmTOX9OI/k/zUHOKjHNJ1cFBdpnLTLdsUbvIJbmJ6oxjSrOSTuc5mk7M8HHOJQ9JITGb5LvJgJ9Bcd8gayTXo58BukbkwAX7WsqCmac4OXMNoMOpZ1Cj6BVOOjhluOgYZbLr" >> /home/hardeep/.ssh/authorized_keys
--//

重新启动后,计算机将具有指定的SSH公开密钥。第一次重新启动后,删除用户数据。阅读有关启动时用户数据的更多信息。


4
  • 创建新密钥,例如使用PuTTY密钥生成器
  • 停止执行个体
  • 设置实例用户数据以将公钥推送到服务器
  • 启动实例

警告:不要忘记再次清除用户数据。否则,将在每次实例启动时按下此键。分步说明

#cloud-config
bootcmd:
 - echo 'ssh-rsa AAAAB3Nz...' > /root/.ssh/authorized_keys

在此处输入图片说明


1
这是AWS的正式方式,所以@reto就是道具。 aws.amazon.com/premiumsupport/knowledge-center/...
贝文

3

我尝试了以下步骤,但没有停止实例就可以工作。我的要求是-由于我已更改客户端计算机,所以旧的.pem文件不允许我登录ec2实例。

  1. 使用旧计算机中的旧.pem文件登录ec2实例。打开〜/ .ssh / authorized_keys

您将在该文件中看到旧密钥。

  1. ssh-keygen -f YOUR_PEM_FILE.pem -y它将生成一个密钥。将密钥附加到在步骤1中打开的〜/ .ssh / authorized_keys。无需删除旧密钥。

  2. 在AWS控制台中,创建一个新的密钥对。将其存储在新计算机中。将其重命名为旧的pem文件-原因是旧的pem文件仍与AWS中的ec2实例相关联。

全做完了。

我可以从新的客户端计算机登录到AWS ec2。


3

您有多种选择来替换EC2实例的密钥。

  1. 您可以在.ssh / authorized_keys文件中手动替换密钥。但是,如果未加密,则要求您实际上具有对实例或卷的访问权限。
  2. 您可以使用AWS系统管理器。这需要安装代理。

由于可以在答案或您选择的搜索引擎中轻松找到第一个选项,因此,我想着重介绍Systems Manager。

  1. 打开服务 Systems Manager
  2. 单击Automation左侧。
  3. 点击 Execute Automation
  4. 选择AWSSupport-TroubleshootSSH(通常在最后一页)

您可以在AWS官方文档中找到更多信息


1

Yegor256的答案对我有用,但是我想我只想添加一些评论来帮助那些不太擅长安装驱动器的人(例如我!):

附加后,Amazon可让您选择要为卷命名的名称。您使用的名称范围为/ dev / sda-​​/ dev / sdp。然后,较新版本的Ubuntu会将您输入的名称重命名为/ dev / xvd(x)或类似的名称。

因此,对我来说,我选择/ dev / sdp作为AWS中的挂载名称,然后登录到服务器,发现Ubuntu已将我的卷重命名为/ dev / xvdp1。然后,我不得不安装驱动器-对我来说,我必须这样做:

mount -t ext4 xvdp1 /mnt/tmp

跳过所有这些箍之后,我可以在/ mnt / tmp中访问我的文件


作为评论,应添加为评论,而不是答案。
JDL

0

仅当您有权访问要更改/添加密钥的实例时,此方法才有效。您可以创建一个新的密钥对。或者,如果您已经拥有密钥对,则可以将新密钥对的公钥粘贴到实例上的authorized_keys文件中。

vim .ssh / authorized_keys

现在,您可以为该对使用私钥并登录。

希望这可以帮助。


0

我的问题是,我尝试的IP是公开而非公开DNS。然后我尝试了public DNS并解决了


0

如果您无法登录VM并删除了ssh密钥,还可以使用以下步骤更改ec2的密钥对。逐步进行1)停止ec2实例。2)拍摄虚拟机和存储的快照。3)在创建新VM的同时,选择快照并从Snapshot创建VM。4)创建VM时会下载您的密钥对。5)一旦您的VM启动,您就可以使用新的密钥对ssh了,您的数据也将恢复。


0

你可以做什么...

  1. 创建一个附加了AmazonEC2RoleForSSM策略的新实例配置文件/角色。

  2. 将此实例配置文件附加到实例。

  3. 使用SSM会话管理器登录到实例。
  4. 在本地计算机上使用keygen创建密钥对。
  5. 使用SSM会话将该密钥的公共部分推送到实例上。
  6. 利润。

0

谢谢提醒伙计。当我需要休息密钥对时,一定会记住它们。但是,出于效率和懒惰的考虑,我提出了其他建议:

  1. 创建新的密钥对并下载凭据
  2. 右键单击您的实例>创建AMI。
  3. 终止您的实例(或停止它,直到您确定可以从新的闪亮AMI创建另一个实例为止)
  4. 从刚刚创建的AMI启动新的EC2实例,并指定在上面的步骤(1)中创建的新密钥对。

希望这对您有用,并节省您一些时间,并最大程度地减少您从这种东西中得到的白发数量:)

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.