为什么我的 OpenSSH 密钥指纹与 AWS EC2 控制台密钥对指纹不匹配?

Cra*_*ger 98 ssh amazon-ec2 ssh-keys

当我将 OpenSSH 公钥导入 AWS EC2 的密钥环时,AWS 显示的指纹与我看到的不匹配:

ssh-keygen -l -f my_key
Run Code Online (Sandbox Code Playgroud)

它的长度不同,字节数也不同。

为什么?我确定我上传了正确的密钥。

Cra*_*ger 138

AWS EC2 显示的是 SSH2 指纹,而不是每个人都期望的 OpenSSH 指纹。它没有在用户界面中说明这一点。

它还显示两种完全不同的指纹,具体取决于密钥是在 AWS 上生成并下载,还是您上传了自己的公钥。

生成的指纹

ssh-keygen -l -f id_rsa
Run Code Online (Sandbox Code Playgroud)

将与 EC2 显示的内容匹配。您可以使用 AWS API 工具通过ec2-fingerprint-key命令生成指纹,也可以使用 OpenSSL 来执行此操作。

请注意,如果您最初在 AWS 上生成了一个密钥,但随后又将其上传(例如,到另一个区域),那么您将获得不同的指纹,因为它将采用 SSH2 RSA 指纹,而不是它为您的密钥显示的 sha1在 AWS 上生成。

好玩,嘿? 此屏幕截图中有两个具有不同指纹的相同密钥的副本

在上面,test-generated是使用 AWS EC2 生成的。test-generated-reuploaded是来自 AWS 生成、提取ssh-keygen -y并再次上传的私钥的公钥。第三个密钥,test-uploaded,是本地生成的密钥……但本地ssh-keygen -l指纹是b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea

$ ssh-keygen -l -f theprivatekey
2048 b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea
$ openssl pkey -in theprivatekey -pubout -outform DER | openssl md5 -c
Enter pass phrase for id_landp:
(stdin)= 91:bc:58:1f:ea:5d:51:2d:83:d3:6b:d7:6d:63:06:d2
Run Code Online (Sandbox Code Playgroud)

上传到 AWS 的密钥

当您将密钥上传到 AWS 时,您仅上传公有密钥,AWS 会显示公有密钥的 MD5 哈希值。

您可以使用 OpenSSL,如Daniel 在 AWS 论坛上演示的那样,以 AWS使用的形式生成指纹,以显示上传的公钥 (SSH2 MD5) 的指纹,例如:

7a:58:3a:a3:df:ba:a3:09:be:b5:b4:0b:f5:5b:09:a0
Run Code Online (Sandbox Code Playgroud)

如果您有私钥,则可以通过从私钥中提取公共部分并使用以下方法对其进行散列来生成指纹:

openssl pkey -in id_rsa -pubout -outform DER | openssl md5 -c
Run Code Online (Sandbox Code Playgroud)

如果您只有公钥,并且它是 OpenSSH 格式,则需要先将其转换为 PEM,然后是 DER,然后是散列,使用:

ssh-keygen -f id_rsa.pub -e -m PKCS8 | openssl pkey -pubin -outform DER | openssl md5 -c
Run Code Online (Sandbox Code Playgroud)

在 AWS 上生成的密钥

当您在 AWS 上生成密钥对时,AWS 会显示私钥的 SHA1 哈希值,该哈希值更长,例如:

ea:47:42:52:2c:25:43:76:65:f4:67:76:b9:70:b4:64:12:00:e4:5a
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您需要使用以下命令(也由 Daniel 在 AWS 论坛上展示)来生成基于私钥的 sha1 哈希:

openssl pkcs8 -in aws_private.pem -nocrypt -topk8 -outform DER | openssl sha1 -c
Run Code Online (Sandbox Code Playgroud)

在下载的 AWS 生成的私有密钥/证书文件上。它也适用于您转换为 OpenSSH 格式的密钥。但是,这确实需要您拥有私钥,因为散列是私钥的。如果您只有公钥,则无法在本地生成哈希。

参考

看:

  • 遗憾的是 AWS 没有明确说明,他们正在打开一个潜在的安全漏洞,使验证密钥变得更加困难 (7认同)
  • 很好的答案!在最初的 `ssh` 命令中,对于较新的版本,您需要一个 -E 选项来指定 md5 格式:`ssh-keygen -E md5 -l -f id_rsa`。 (2认同)

小智 21

如果您只有公钥,则可以按如下方式生成 AWS 指纹:

ssh-keygen -e -f id_rsa.pub -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
Run Code Online (Sandbox Code Playgroud)