如何从Amazon AWS下载公钥?


25

我有一个与密钥对(p1)关联的正在运行的Amazon ec2 linux实例,并且我已经将私钥下载到了我的家庭桌面。现在,在工作中,我在工作桌面上创建了密钥对(p2),并通过AWS控制台将公钥导入了Amazon。

在家里,我想添加要添加到authorized_keys我的AMI实例的密钥对p2的公钥(我目前只能从家里访问它)。但是,我忘了带上p2的公钥,因此有可能以某种方式从亚马逊导出此公钥。

Answers:


6

好拼图,谢谢!这是一个答案:

  1. 启动新的临时EBS引导t1.micro实例A,并指定密钥对p2。指定一个可用区,您已经在该可用区上运行了另一个实例B,并且您可以访问该实例。(如果需要,启动一个临时的)。

  2. 在实例A处于运行状态几分钟后停止(不终止)实例A,因此它有机会将公钥保存到其authorized_keys文件中。

  3. 从停止的实例A分离根EBS卷。将其附加并安装到正在运行的实例B。

  4. 从已挂载的文件系统中复制公钥。

  5. 卸下并删除EBS卷。终止临时实例A。


1
不确定这实际上如何解决原始问题...绝对是(且仅)在使用EBS支持的实例时,这是处理AWS EC2实例的一种方法。
杰里米·布斯

除了一次运行临时实例以从中获取公钥之外,您不必使用EBS引导实例。您要做的就是获取此方法所做的公钥。
埃里克·哈蒙德

1
如果您拥有私钥,则无需采取此类措施即可重新生成公钥。
杰里米·布斯

2
杰里米:根据最初的问题,私钥又回到了他的办公室,在那里他无法获得它。一旦回到办公室,他就无法进入EC2实例,因为该实例没有该办公室私钥的公钥。这就是为什么他想从Amazon获取公钥,而这样做的唯一方法是使用该公钥启动实例。然后,您必须从该实例中获取公钥,这是棘手的部分。
埃里克·哈蒙德

1
哇!获取公钥的大量工作。对于亚马逊而言,放置“导出公钥”选项会更容易。
2011年

37

正确的ssh-keygen命令是:

ssh-keygen -y -f /path/to/privatekey > /path/to/publickey

这应该是对先前答案的评论或建议的编辑。你是正确的。
JCotton 2012年

您是对的,这应该是一条评论。不幸的是,我还没有获得发表评论的特权:-(
rsmoorthy 2012年

哈哈,好吧,你去。感谢您的更正。
JCotton 2012年

如果他可以访问私钥,则此答案将起作用,但在最初的问题中,该私钥位于其他位置且不可访问。
埃里克·哈蒙德

1
运行chmod 400 your_private_key.pem,如果你得到“权限过于开放的错误”
crizCraig

7

我已经提供了一个使用EBS卷获取ssh公共密钥的答案,但是这是您可以通过使用将公共密钥发送到控制台输出的用户数据脚本启动临时EC2实例来获取它的另一种方法。步骤如下:

将以下代码保存到output-ssh-key.userdata本地计算机上命名的文件中。不要本地运行这些命令!

#!/bin/bash -ex
exec> >(tee /var/log/user-data.log|logger -t user -s 2>/dev/console) 2>&1
adminkey=$(GET instance-data/latest/meta-data/public-keys/ | 
  perl -ne 'print $1 if /^0=[^a-z0-9]*([-.@\w]*)/i')
cat <<EOF
SSHKEY:========================================================================
SSHKEY:HERE IS YOUR PUBLIC SSH KEY FOR KEYPAIR "$adminkey":
SSHKEY:$(cat /home/ubuntu/.ssh/authorized_keys)
SSHKEY:========================================================================
SSHKEY:Halting in 50min ($(date --date='+50 minutes' +"%Y-%m-%d %H:%M UTC"))
EOF
sleep 3000
halt

运行带有以上文件作为用户数据脚本的储备Ubuntu 10.04 LTS实例。指定要为其检索公共ssh密钥的密钥对:

ec2-run-instances \
  --key YOURKEYPAIRHERE \
  --instance-type t1.micro \
  --instance-initiated-shutdown-behavior terminate \
  --user-data-file output-ssh-key.userdata \
  ami-ab36fbc2

继续从实例请求控制台输出,直到它显示您的公共ssh密钥为止。指定从run-instances命令返回的实例ID:

ec2-get-console-output YOURINSTANCEID | grep SSHKEY: | cut -f3- -d:

在2-10分钟内,您将获得如下输出:

========================================================================
HERE IS YOUR PUBLIC SSH KEY FOR KEYPAIR "erich":
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6rn8cl41CkzaH4ZBhczOJZaR4xBBDI1Kelc2ivzVvCB
THcdJRWpDd5I5hY5W9qke9Tm4fH3KaUVndlcP0ORGvS3PAL4lTpkS4D4goMEFrwMO8BG0NoE8sf2U/7g
aUkdcrDC7jzKYdwleRCI3uibNXiSdeG6RotClAAp7pMflDVp5WjjECDZ+8Jzs2wasdTwQYPhiWSiNcfb
fS97QdtROf0AcoPWElZAgmabaDFBlvvzcqxQRjNp/zbpkFHZBSKp+Sm4+WsRuLu6TDe9lb2Ps0xvBp1F
THlJRUVKP2yeZbVioKnOsXcjLfoJ9TEL7EMnPYinBMIE3kAYw3FzZZFeX3Q== erich
========================================================================
Halting in 50min (2011-12-20 05:58 UTC)

临时实例会在一个小时内自动终止,但是如果您想确保自己收取的费用不超过运行所需的2美分,则可以自行终止。


我使用现代安装的awscli进行了尝试,并且可以与您的用户数据脚本一起使用。但是我不得不稍微修改一下命令。这适用于eu-west-1区域:aws ec2 run-instances --key-name mykey --instance-type t1.micro --instance-initiated-shutdown-behavior终止--user-data file:// output- ssh-key.userdata --image-id ami-c1167eb8; AWS EC2 get-console-output --instance-id i-0ce56c0e02086160d; AWS EC2终止实例--instance-id i-0ce56c0e02086160d
holmb

(编辑)好的格式在这里太可怕了,我将其发布为其他答案。
伯恩哈德'18

5

如果您拥有私密SSH密钥,则只需运行以下ssh-keygen命令即可重新生成公钥组件:

 ssh-keygen -i -f /path/to/private-key > /path/to/public-key

那就是最简单的部分...启动EC2实例时,AWS控制台和API不支持推送2个密钥对。这是系统管理员可以通过其他方式进行的练习。

如果您有权访问已授权的身份密钥,则只需执行以下ssh-copy-id命令:

 ssh-copy-id -i /path/to/public-key user@EC2-instance

这会将给定的公钥~user/.ssh/authorized_keys自动复制到服务器并复制到文件中,并确保对该文件具有适当的权限。

更为优雅的方法是在配置管理过程中包括其他身份密钥。在我的情况下,这需要将其他密钥添加到该节点的Puppet配置中。

附带说明一下,个人喜好但会使用更好的SSH密钥管理方法,而不仅仅是必须为工作和家庭位置添加单独的密钥。正如我在上一个问题中提到的那样,我将密钥保存在随身携带的USB驱动器上,而不是使用的任何计算机上。


0

另一个选择是在user_data中添加一个短脚本,该脚本仅向根添加另一个ssh密钥:

#!/bin/bash

touch ~/.ssh/authorized_keys
chmod 400 ~/.ssh/authorized_keys

echo "<KEY>" >> ~/.ssh/authorized_keys

然后,您可以使用root用户身份以root ssh -l root -i <KEYFILE> URL用户身份登录计算机,并仅从用户ec2_user,ubuntu或无论如何被调用的authorized_keys中读出密钥。

唯一的事情-您需要使机器可公开访问,并确保可以从外部访问端口22。

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.