如何从Amazon AWS下载公钥?

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

在家里,我想添encryption钥对p2的公钥,将其添加到我的AMI实例的authorized_keys密钥(目前我只能从家中访问)。 但是,我忘记带p2的公钥,所以有可能以某种方式从亚马逊出口这个公钥。

好难题,谢谢! 这里有一个答案:

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

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

  3. 从已停止的实例A分离根EBS卷。将其挂接并挂载到正在运行的实例B.

  4. 从安装的文件系统复制公钥。

  5. 分离并删除EBS卷。 终止临时实例A.

然而,正确的ssh-keygen命令是:

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

我已经提供了一个使用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) 

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

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

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

这很简单… AWS控制台和API不支持在启动EC2实例时推送2个密钥对。 这是系统pipe理员通过其他方式完成的练习。

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

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

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

更优雅的方式是将其他身份密钥包含在configurationpipe理stream程中。 在我的情况下,这需要添加额外的键到节点的Puppetconfiguration。

作为一个侧面说明,个人喜好,但会利用更好的SSH密钥pipe理方法,而不仅仅是包括单独的工作和家庭位置的密钥。 正如我在前面的问题中提到的那样,我把钥匙保存在一个与我保持在一起的USB驱动器上,而不是在任何我使用的计算机上。