更改ec2实例的密钥对

Mic*_*hen 376 ssh amazon-s3 amazon-ec2 amazon-web-services key-pair

如何在AWS管理控制台中更改ec2实例的密钥对?我可以停止实例,我可以创建新的密钥对,但是我没有看到任何修改实例密钥对的链接.

yeg*_*256 462

只需这样做: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 mount/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文件登录

而已.

  • 这太臭了......首先,请看下面的Eric Hammond的答案.第二:Pat Mcb回答.他们的表现实际上是相同的,但没有浪费你的1小时的时间去做搞笑的解决方法.PS.另见http://stackoverflow.com/a/24143976/547223 (21认同)
  • 刚救了我的屁股,你才是传奇! (6认同)
  • `mkdir/mnt/tmp`然后`mount/dev/xvdf/mnt/tmp`应该为#5做诀窍.并且不要忘记步骤13.可能是你连接的盒子上的`rm~/.ssh/known_hosts`. (5认同)
  • 发现这对步骤4-5很有用:http://stackoverflow.com/a/11537390/456584 (4认同)
  • @Eric和@Pat发布的答案是那些只想为其实例使用不同密钥对的人的解决方案.这些对于以某种方式首先丢失密钥对文件的用户没有帮助.如果不拆卸卷并将其连接到另一个实例,您将如何获得该卷的控制权?更别说替换原来的`.ssh/authorized_keys`文件了. (4认同)
  • 我在这里写了非常具体的说明,建立在这个答案的基础上,但基本上是相同的想法 - https://gist.github.com/tamoyal/1b7ec4d3871b343d353d.正如@kgadek所指出的那样,它有点脏和耗时,但是如果你被锁定在服务器上,你想要进行密钥更改并且如果你不想启动该服务器的副本,这是一个很好的选择.每个实例大约需要5-10分钟,而不是一小时. (3认同)
  • 工作原理很像,我只需要将根卷重新附加为`/ dev / sda1`而不是`/ dev / xvda`即可使主实例再次启动。它可能取决于分布(此处为ubuntu)。 (2认同)

Eri*_*ond 177

一旦实例启动,就无法在元数据级别更改与实例关联的密钥对,但您可以更改用于连接到实例的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
Run Code Online (Sandbox Code Playgroud)

编辑authorized_keys文件后,在断开与用于编辑文件的会话之前,请始终使用其他终端确认您能够进入实例.你不想犯错,完全把自己锁在实例之外.

当您考虑在EC2上使用ssh密钥对时,我建议您将自己的个人ssh公钥上传到EC2,而不是让亚马逊为您生成密钥对.

这是我写的一篇文章:

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

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

  • aatifh:这是我写的关于如何摆脱这种情况的文章:http://alestic.com/2011/02/ec2-fix-ebs-root (11认同)
  • 这是一个很好的小单行,用于添加密钥.除了AWS生成的密钥之外,这只会添加您的普通pub密钥,因此如果它不起作用,您将不会自己锁定:http://stackoverflow.com/a/5654728/193494 (4认同)
  • @StevenLu:是的,评论线程不是提出新问题的错误地方。尝试在 http://serverfault.com 上创建一个新问题(比 stackoverflow 更适合该问题)。 (2认同)

小智 73

下载AWS pem后运行此命令.

ssh-keygen -f YOURKEY.pem -y
Run Code Online (Sandbox Code Playgroud)

然后将输出转储到authorized_keys.

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

chmod 600 YOURKEY.pem
Run Code Online (Sandbox Code Playgroud)

然后

ssh-keygen -f YOURKEY.pem -y >> ~/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

  • 只有在您已有权访问系统时才有效,对吗?(就像没有丢失旧的.pem文件一样). (13认同)
  • 您可以使用>而不是>>来覆盖当前用户而不是添加它. (5认同)
  • 这是正确且最简单的答案。无需重新启动、创建新实例或安装驱动器。只需获取 .pem、注册机并将其添加到authorized_hosts 即可。 (3认同)

Eli*_*iss 50

AWS EC2支持的说明:

  1. 更改pem登录
  2. 转到您的EC2控制台
  3. 在NETWORK&SECURITY下,单击密钥对单击创建密钥对
  4. 为新密钥对命名,保存.pem文件.密钥对的名称将用于连接到您的实例
  5. 创建与您的实例的SSH连接并保持打开状态
  6. 在PuttyGen中,单击"加载"以加载.pem文件
  7. 保持SSH-2 RSA单选按钮被选中.点击"保存私钥"你会弹出窗口警告,点击"是"
  8. 单击"保存公钥",以生成公钥.这是我们要复制到您当前实例的公钥
  9. 使用新密钥对名称和扩展名.pub保存公钥
  10. 在记事本中打开公钥内容
  11. 复制下面的内容"注释:"import-openssh-key"和之前"----结束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进入实例时,您可以使用vi .ssh/authorized_key并删除旧密钥.

回答Shaggie评论:

如果您无法连接到实例(例如密钥已损坏),请使用AWS控制台分离卷(http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-detaching-volume.html)并将其重新连接到工作实例,而不是更改卷上的键并将其重新连接回上一个实例.

  • 应该是最好的答案 (6认同)
  • 如果您没有 SSH 访问权限,则会出现此问题。 (4认同)
  • Jayden Lawson,如果你没有网络连接怎么办? (3认同)
  • 如果旧密钥已损坏并且由于没有旧 ppk 文件而无法通过腻子连接到实例怎么办??? (2认同)
  • 可能会发生与其他人共享的密钥对,现在需要更改密钥对,以便该人无法再登录,或许多其他原因,例如, (2认同)

Mar*_*rry 36

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

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

当我这样做时,我的实例已经终止了.然后它开始,终止,然后重新开始.显然,"替换"意味着终止和创建新实例.如果您已修改启动卷,请先创建AMI,然后在同一Elastic Beanstalk> Configuration> Instances表单中将AMI指定为自定义AMI ID.这也警告要更换EC2实例.

修改EC2密钥对和自定义AMI ID后,在看到有关两者的警告后,单击" 保存"继续.

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

  • 现在它位于配置的“安全”部分下。 (2认同)

小智 31

我经历了这种方法,过了一段时间,才能使它发挥作用.缺乏实际命令使其变得艰难,但我想出来了.然而 - 在以后不久发现并测试了更简单的方法:

  1. 将您的实例保存为AMI(重启或不重启,我建议重启).这只有在EBS支持的情况下才有效.
  2. 然后,只需从此AMI启动一个实例并分配新的密钥文件.
  3. 将弹性IP(如果适用)移动到新实例,即可完成.


vin*_*ini 15

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

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

这就对了.享受:)


Par*_*dav 15

这个问题有两种情况:-

1)您无权访问 .pem 文件,这就是您想要创建一个新文件的原因。

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

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

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

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

chmod 400 yournewfile.pem
Run Code Online (Sandbox Code Playgroud)

3)在本地机器生成新下载文件的RSA

ssh-keygen -f yournewfile.pem -y
Run Code Online (Sandbox Code Playgroud)

4)从这里复制RSA代码

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

ssh -i oldpemfileName.pem username@ipaddress

sudo vim  ~/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

6) 给一两行空格并将新文件复制的 RSA 粘贴到这里,然后保存文件

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

8)如果你想禁用以前的 .pem 文件访问,那么只需编辑

sudo vim ~/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

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

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

通过这种方式,您可以更改/连接新的 .pem 文件与您正在运行的实例。

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

希望它会有所帮助!

  • 我有点喜欢这个解决方案,因为它不需要我使用冻结的 AMI 映像创建新实例。但此方法是否能够更改 EC2 仪表板中 EC2 实例的关联密钥对名称?@Parveen 亚达夫 (3认同)

Ser*_*gey 10

我相信最简单的方法是:

  1. 创建原始iinstance的AMI图像.
  2. 使用具有新密钥对的AMI映像(来自步骤1)启动新的EC2实例.
  3. 使用新密钥登录新的EC2实例.

  • 我不确定这个更改是否是最近的更改,但是当您从已经分配了密钥的实例创建AMI时,您需要使用该密钥登录复制的AMI映像,无论是否您在创建过程中分配了不同的密钥对. (3认同)

Vae*_*lyr 8

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

  • Elastic Beanstalk面板
  • 组态
  • 实例(cog top-right)
  • EC2密钥对

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

  • 如果您使用ElasticBeanstalk,这是最简单的答案. (2认同)
  • 警告 !这是一个危险的解决方案。AWS还将重置附加到该实例(!!)的存储(即虚拟HDD)。因此,您必须分离存储,并在提出一个新实例后,重新附加它,而不是新实例附带的新存储。当然,最好不是加密卷(并且您也不会丢失其密钥。) (2认同)

Ret*_*ner 8

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

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

#cloud-config
bootcmd:
 - echo 'ssh-rsa AAAAB3Nz...' > /root/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


sne*_*nez 6

最简单的解决方案是复制

~/.ssh/id_rsa.pub
Run Code Online (Sandbox Code Playgroud)

进入您的AWS实例的authorized_keys

~/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

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

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

ssh-keygen -t rsa
Run Code Online (Sandbox Code Playgroud)

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

ssh-keygen -f private_key.pem -y > public_key.pub
Run Code Online (Sandbox Code Playgroud)

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

ssh user@host.com -i private_key.pem
Run Code Online (Sandbox Code Playgroud)

  • 当我什至无法使用SSH AWS实例时,如何访问`〜/ .ssh / authorized_keys`? (3认同)
  • 我相信您的最后一行是错误的,只有拥有私钥,您才能连接。ssh -i private_key.pem user@host.com。如果您希望某人允许您访问其实例,则可以安全地与他们共享您的公钥,他们可以将其添加到他们的authorized_keys中,以授予您作为该用户的实例访问权限... (3认同)

Har*_*ngh 5

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

ssh-keygen -f YOURKEY.pem -y
Run Code Online (Sandbox Code Playgroud)

这将为您的新 SSH 密钥对生成公钥,复制此公钥并在下面的脚本中使用它。

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
--//
Run Code Online (Sandbox Code Playgroud)

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