ChatGPT解决这个技术问题 Extra ChatGPT

更改 ec2 实例的密钥对

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

我按照此视频中指示的步骤进行操作,并且成功了 youtube.com/watch?v=OF2AOekW4IE
似乎不可能,也可以从 AWS 中删除密钥对,在这种情况下主机 m/c 无法登录 EC2 实例。看起来是缺陷

k
khaverim

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

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

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

这就是我所做的,感谢 Eric Hammond 的博客文章:

停止正在运行的 EC2 实例分离它的 /dev/xvda1 卷(我们称之为卷 A) - 请参阅此处使用我的新密钥对启动新的 t1.micro EC2 实例。确保在同一子网中创建它,否则您将不得不终止实例并重新创建它。 - 请参阅此处将卷 A 附加到新的微实例,如 /dev/xvdf(或 /dev/sdf)SSH 到新的微实例并将卷 A 挂载到 /mnt/tmp

$ sudo mkdir /mnt/tmp; sudo mount /dev/xvdf1 /mnt/tmp

将 ~/.ssh/authorized_keys 复制到 /mnt/tmp/home/ubuntu/.ssh/authorized_keys 注销 终止微实例 从中分离卷 A 将卷 A 附加到主实例作为 /dev/xvda 启动主实例 像以前一样登录,使用新的 .pem 文件

而已。


刚刚救了我的屁股,你是个传奇!
mkdir /mnt/tmp 然后 mount /dev/xvdf /mnt/tmp 应该可以解决 #5 的问题。并且不要忘记第 13 步。在您连接的盒子上可能是 rm ~/.ssh/known_hosts
这太臭了……首先,请看下面埃里克·哈蒙德的回答。第二:Pat Mcb 的回答。它们实际上执行相同的操作,但不会浪费您 1 小时的时间来做有趣的解决方法。 PS。另请参阅stackoverflow.com/a/24143976/547223
我在这里写了非常具体的说明,建立在这个答案的基础上,但基本上是相同的想法 - gist.github.com/tamoyal/1b7ec4d3871b343d353d。正如@kgadek 所指出的,这有点脏且耗时,但是如果您被锁定在要更改密钥的服务器之外并且不想启动该服务器的副本,那么这是一个不错的选择。每个实例大约需要 5-10 分钟,而不是一个小时。
@Eric 和 @Pat 发布的答案是针对只想为其实例使用不同密钥对的人的解决方案。这些对首先以某种方式丢失密钥对文件的用户没有帮助。如果不分离卷并将其附加到另一个实例,您将如何控制该卷?更不用说替换原来的 .ssh/authorized_keys 文件了。
E
Eric Hammond

启动实例后,无法在元数据级别更改与实例关联的密钥对,但您可以更改用于连接到实例的 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 文件后,请始终使用不同的终端确认您能够 ssh 进入实例,然后再断开用于编辑文件的会话。您不想犯错误并将自己完全锁定在实例之外。

当您考虑 EC2 上的 ssh 密钥对时,我建议您将自己的个人 ssh 公钥上传到 EC2,而不是让 Amazon 为您生成密钥对。

这是我写的一篇文章:

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

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


我愚蠢地犯了那个错误,我的意思是我编辑了authorized_keys文件并注销了。现在,不能 ssh 回来 :(。有什么快速修复的建议吗?
aatifh:这是我写的一篇关于如何让自己摆脱这种情况的文章:alestic.com/2011/02/ec2-fix-ebs-root
@EricHammond 这可能不合适,但您似乎知道这一切是如何工作的......我今天设置了一个 EC2 实例并在我的 Mac 上收到了私钥 .pem 文件,但是 ssh -i key.pem 没有进行身份验证(权限被拒绝(公钥))。在密钥对名称下的 EC2 管理控制台中,它没有列出任何内容。这让我很震惊。我该如何设置?根据管理控制台,我配置的密钥对似乎没有分配给实例!
@StevenLu:是的,评论线程是提出新问题的错误地方。尝试在 serverfault.com 上创建一个新问题(比 stackoverflow 更适合该问题)。
这是一个不错的小单线,用于添加您的密钥。除了 AWS 生成的密钥之外,这只是添加了您的普通 pub 密钥,因此如果它不起作用,您不会将自己锁定:stackoverflow.com/a/5654728/193494
N
Nikita

下载 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

这仅在您已经可以访问系统时才有效,对吗? (就像没有丢失旧的 .pem 文件一样)。
您可以使用 > 而不是 >> 来覆盖当前用户而不是添加它。
这是正确和最简单的答案。无需重新启动、创建新实例或安装驱动器。只需获取 .pem,对其进行密钥生成并将其添加到 authorized_hosts。
我已经完成了这个 ssh-keygen -f YOURKEY.pem -y >> ~/.ssh/authorized_keys 但是无法使用新的公钥访问我的 ec2。
我运行了这个,我的本地密钥没有改变。
E
Elia Weiss

来自 AWS EC2 支持的说明:

更改 pem 登录到您的 EC2 控制台 在 NETWORK & SECURITY 下,单击 Key Pair 单击 Create Key Pair 为您的新密钥对命名,保存 .pem 文件。密钥对的名称将用于连接到您的实例 创建与您的实例的 SSH 连接并在 PuttyGen 中保持打开状态,单击“加载”以加载您的 .pem 文件 选中 SSH-2 RSA 单选按钮。点击“Save private key” 会弹出警告窗口,点击“Yes” 点击“Save public key”,生成公钥。这是我们要复制的公钥跨到当前实例 使用新的密钥对名称和扩展名 .pub 保存公钥 在记事本中打开公钥内容 将内容复制到“注释:”imported-openssh-key“和之前”---- END SSH2 PUBLIC KEY ---- 注意 - 您需要将内容复制为一行 - 删除已连接实例上的所有新行,使用工具 vi 打开您的 authorized_keys 文件。运行以下命令: vi .ssh/authorized_keys 你应该查看文件中的原始公钥还将文件上的光标移动到第一个公钥内容的末尾:键入“i”以插入新行,键入“ssh-rsa”并在粘贴之前添加一个空格公钥的内容、空格和 .pem 文件的名称(不带 .pem)注意 - 您应该得到与 previ 格式相同的行ous line 按 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) 并将其重新附加到工作实例,然后更改卷上的密钥并将其重新附加到前一个实例。


应该是最好的答案
如果旧密钥已损坏并且由于没有旧 ppk 文件而无法通过 putty 连接到实例怎么办?
如果您没有 SSH 访问权限怎么办,因此会出现此问题。
杰登劳森,如果你没有互联网连接怎么办?
可能会发生密钥对与其他人共享,现在需要更改密钥对以使该人无法再登录,或者像这样的许多其他原因,
W
Will Demaine

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

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

当我这样做时,我的实例已经终止。然后它开始,终止,然后重新开始。显然“替换”意味着终止并创建一个新实例。如果您修改了引导卷,请先创建一个 AMI,然后在与自定义 AMI ID 相同的 Elastic Beanstalk > 配置 > 实例表单中指定该 AMI。这也会警告更换 EC2 实例。

在您修改您的 EC2 密钥对和自定义 AMI ID 并看到关于两者的警告后,单击保存以继续。

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


这现在位于配置的“安全”部分下。
谢谢@WillDemaine。目前没有使用 AWS,所以我会相信你的话并批准编辑!
d
daxlerod

我经历了这种方法,过了一段时间,能够使它工作。缺乏实际命令使它变得困难,但我想通了。但是 - 不久之后发现并测试了更简单的方法:

将您的实例保存为 AMI(重启与否,我建议重启)。这仅在 EBS 支持时才有效。然后,只需从此 AMI 启动一个实例并分配您的新密钥文件。将弹性 IP(如果适用)移至新实例,就完成了。


在我不小心删除 ~/.ssh 后,这对我完全有用
我做了同样的事情并且它有效,现在我可以使用新的 pem 登录。但我仍然可以使用旧 pem 登录。所以现在 2 个 pem 是有效的。
仅供参考,这是一种快速简单的 GUI 方法,可以在忙碌时使用不同的密钥启动新的 EC2,但@vitaly 发现您的旧 pem 密钥也有效,需要转到 /home/ec2-user/.ssh/authorized_keys 并删除文件中的旧 pem 密钥。感谢您在没有时间的情况下快速轻松地更改 Pem 密钥的方法。
这对我不起作用。 AWS 一直说密码不可用,另一条消息提到如果实例是从 AMI 创建的,它将使用父映像的凭证。
P
Parveen yadav

这个问题有两种情况: -

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

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

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

1) 转到 AWS 控制台登录并从那里的密钥对部分创建一个新的 .pem 文件。它会自动将 .pem 文件下载到您的电脑中 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 文件的访问权限。

希望它会有所帮助!


我有点喜欢这个解决方案,因为它不需要我用冻结的 AMI 图像创建新实例。但是这种方法是否能够在 EC2 仪表板中更改 EC2 实例的关联密钥对名称? @Parveen yadav
它真的很神奇的答案,我只想添加一件事,你也可以使用 Putty 生成器生成 RSA
Ec2 仪表板仍显示旧的密钥对名称。由于这没有从控制台更改
N
Nilesh Patel

我相信最简单的方法是:

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


@Brady,什么根本不起作用?制作快照?启动实例?登录?
我不确定此更改是否是最近的更改,但是当您从已分配密钥的实例创建 AMI 时,您需要拥有该密钥才能登录到复制的 AMI 映像,无论是否您在创建过程中分配了不同的密钥对。
这不是解决方案,因为@Brady 提到它不起作用。
W
Warren Parad

脚步:

创建新密钥,例如使用 AWS 控制台、PuTTY 密钥生成器或 ssh-keygen 停止实例 设置实例用户数据以将公钥推送到服务器 启动实例

https://i.stack.imgur.com/1nRVg.png

#cloud-config
cloud_final_modules:
- [once]
bootcmd:
 - echo 'ssh-rsa AAAAB3Nz...' > /home/USERNAME/.ssh/authorized_keys

其中 USERNAME 是机器的预期用户名。默认用户名列表为 available from AWS

Step-by-step instructions from AWS


这是官方的 AWS 方式,所以支持@reto。 aws.amazon.com/premiumsupport/knowledge-center/…
@Bevan 你的官方文档不起作用
v
vinay saini

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

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

这就对了。享受 :)


V
Vaelyr

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

弹性豆茎面板

配置

实例(齿轮右上角)

EC2 密钥对

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


如果您在 ElasticBeanstalk 上,这是最简单的答案。
警告 !这是一个危险的解决方案。 AWS 还将重置附加到该实例的存储(即虚拟 HDD)(!!)。因此,您必须分离存储,并且在提升一个新实例后,再次重新附加它,而不是新实例附带的新实例。当然,最好是它不是加密卷(而且你没有丢失它的密钥..)
s
snez

最简单的解决方法是复制

~/.ssh/id_rsa.pub

进入您的 AWS 实例的授权密钥

~/.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

当我什至无法 SSH aws 实例时如何访问 ~/.ssh/authorized_keys
我相信您的最后一行不正确,只有拥有私钥才能连接.. ssh -i private_key.pem user@host.com。如果您希望某人让您访问他们的实例,您可以安全地与他们共享您的公钥,他们可以将其添加到他们的 authorized_keys 以授予您以该用户身份访问该实例...
H
Hardeep Singh

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

ssh-keygen -f YOURKEY.pem -y

这将为您的新 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
--//

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


M
Mr. Bordoloi

我已经尝试了以下步骤,并且它在不停止实例的情况下工作。我的要求是 - 由于我更改了客户端计算机,旧的 .pem 文件不允许我登录到 ec2 实例。

使用旧机器上的旧 .pem 文件登录到 ec2 实例。打开 ~/.ssh/authorized_keys

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

ssh-keygen -f YOUR_PEM_FILE.pem -y 它将生成一个密钥。将密钥附加到在步骤#1 中打开的 ~/.ssh/authorized_keys。无需删除旧密钥。从 AWS 控制台,创建一个新的密钥对。将其存放在您的新机器中。将其重命名为旧 pem 文件 - 原因是旧 pem 文件仍与 AWS 中的 ec2 实例相关联。

全部完成。

我能够从我的新客户端机器登录到 AWS ec2。


H
Hendric

您有多个选项来替换您的 EC2 实例的密钥。

您可以在 .ssh/authorized_keys 文件中手动替换密钥。但是,这需要您实际访问未加密的实例或卷。您可以使用 AWS Systems Manager。这需要安装代理。

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

打开服务系统管理器单击左侧的自动化。点击 Execute Automation 选择 AWSSupport-TroubleshootSSH(通常在最后一页)

您可以在 Official AWS Documentation 上找到更多信息


G
George Smith

谢谢提醒伙计。当我需要休息密钥对时,一定会记住它们。然而,为了效率和懒惰,我想出了别的办法:

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

希望这对您有用,并为您节省一些时间,并最大限度地减少您从此类物品中获得的白发数量 :)


为什么我会终止我的实例。我只需要更改我的密钥对吗?
这可能不是一个好主意。创建一个新的 AMI 并运行一个新的实例可能会面临另一个问题,比如音量降低。
N
Neeraj Yadav

这适用于拥有两个不同 pem 文件并且出于任何安全目的想要丢弃两者之一的人。假设我们要丢弃 1.pem

连接服务器 2 并从 ~/.ssh/authorized_keys 复制 ssh 密钥 在另一个终端中连接服务器 1 并将密钥粘贴到 ~/.ssh/authorized_keys 中。您现在将在这里拥有两个公共 ssh 密钥 现在,为了您的信心,尝试使用 2.pem 连接服务器 1。您将能够使用 1.pem 和 2.pem 连接服务器 1 现在,注释 1.pem ssh 并使用 ssh -i 2.pem user@server1 进行连接


R
Ryan

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

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

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

mount -t ext4 xvdp1 /mnt/tmp

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


作为评论,这应该作为评论添加,而不是答案。
b
belial

你可以做什么...

创建附加了 AmazonEC2RoleForSSM 策略的新实例配置文件/角色。将此实例配置文件附加到实例。使用 SSM 会话管理器登录实例。使用本地计算机上的 keygen 创建密钥对。使用您的 SSM 会话将该密钥的公共部分推送到实例上。利润。


s
skd

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

vim .ssh/authorized_keys

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

希望这可以帮助。


v
vipin cp

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


R
Raghunath Babalsure

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


S
Shaan Ansari

替代解决方案。如果您拥有服务器上的唯一访问权限。在这种情况下,不要从 AWS 控制台中删除 pem 文件。只需从 sudo nano ~/.ssh/authroized_keys 中删除 pem 访问密钥并添加您的系统公共 ssh 密钥。现在您可以访问 ssh user@i.p


E
Eric Aya

如果有人因为没有密钥对而无法访问 EC2 实例而在这里,但他们确实具有 IAM 访问权限,您可以运行以下命令以允许使用密钥临时访问(60 秒)您的 EC2 实例只要您知道用户名(对于 ubuntu 实例通常是“ubuntu”,对于 amazon linux 实例通常是“ec2-user”),您就已经拥有了:

aws ec2-instance-connect send-ssh-public-key --region ${your-aws-region} --instance-id ${your-instance-id} --availability-zone ${your-instance-az} --instance-os-user ${username} --ssh-public-key file://path/to/public/key 

(如果您的 ~/.aws/credentials 文件中有多个凭据配置文件,您还可以通过在此命令中添加标志“--profile your-profile”来指定)

如果成功,输出将如下所示:

{
"RequestId": "3537268d-c161-41bb-a4ac-977b79b2bdc0",
"Success": true
}

然后您有 60 秒的时间使用该密钥进行 ssh。