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

ssh-keygen -l -f my_key


它是不同的长度,并且具有不同的长度字节。

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

#1 楼

AWS EC2显示SSH2指纹,而不是每个人都期望的OpenSSH指纹。它在UI中没有说明。
它还会显示两种完全不同的指纹,具体取决于密钥是在AWS上生成并下载的,还是您上传自己的公共密钥。
生成的指纹与
ssh-keygen -l -f id_rsa

不匹配EC2显示。您可以使用AWS API工具通过ec2-fingerprint-key命令生成指纹,也可以使用OpenSSL进行指纹。
请注意,如果您最初是在AWS上生成密钥,然后又将其上载(例如,转移到另一个区域) ),那么您将获得一个不同的指纹,因为它将使用SSH2 RSA指纹,而不是它针对您在AWS上生成的密钥显示的sha1指纹。
好吗?
在上面,使用AWS EC2生成了test-generatedtest-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

上载到AWS的密钥
将密钥上载到AWS时,您上载了仅公开密钥,AWS会显示公开密钥的MD5哈希值。
您可以使用OpenSSL(如在AWS论坛上的Daniel所展示的那样)以AWS所使用的形式生成指纹,以显示上传的公开密钥的指纹(SSH2 MD5),例如:
7a:58:3a:a3:df:ba:a3:09:be:b5:b4:0b:f5:5b:09:a0

如果拥有私钥,则可以通过从私钥中提取公钥并使用以下方法对其进行哈希处理来生成指纹:
openssl pkey -in id_rsa -pubout -outform DER | openssl md5 -c

如果只有公共密钥,并且采用OpenSSH格式,则需要先将其转换为PEM,然后将其转换为DER,然后使用以下方法进行哈希处理:
ssh-keygen -f id_rsa.pub -e -m PKCS8 | openssl pkey -pubin -outform DER | openssl md5 -c

在AWS上生成的密钥
在AWS上生成密钥对时,AWS会显示私钥的SHA1哈希,该哈希值较长,例如:
ea:47:42:52:2c:25:43:76:65:f4:67:76:b9:70:b4:64:12:00:e4:5a

在这种情况下,您需要使用以下命令(也由Daniel在AWS论坛上显示)根据私钥生成sha1哈希:
openssl pkcs8 -in aws_private.pem -nocrypt -topk8 -outform DER | openssl sha1 -c

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

AWS开发人员论坛讨论
https://stackoverflow.com/ q / 19251562/398670
AWS论坛上的错误报告-请及时输入


评论


遗憾的是,AWS缺乏对此的明确性,他们正在打开潜在的安全漏洞,使验证密钥变得更加困难

–Jaime Hablutzel
14-10-18在4:55

好答案!在初始ssh命令上,如果使用的是最新版本,则需要使用-E选项指定md5格式:ssh-keygen -E md5 -l -f id_rsa。

– RichVel
17-4-7在5:50



#2 楼

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

ssh-keygen -e -f id_rsa.pub -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c


#3 楼

AWS文档上有资源http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints

如果创建了使用AWS的密钥对,可以使用OpenSSL工具从私钥文件生成指纹:

复制

$ openssl pkcs8 -in path_to_private_key -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c


使用第三方工具创建了密钥对并将公钥上传到AWS,则可以使用OpenSSL工具从本地计算机上的私钥文件生成指纹:

复制

$ openssl rsa -in path_to_private_key -pubout -outform DER | openssl md5 -c


输出应该匹配控制台中显示的指纹。

#4 楼

这就是我使用的方法:

openssl rsa -RSAPublicKey_in -in <(ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM) -inform PEM -outform DER 2>/dev/null | openssl md5 -c | awk '{print }'


这与上面的某些方法类似,是根据公钥生成指纹的。

#5 楼

以防万一这可能有用:https://ssh-vault.com/post/fingerprint/

例如:

$ ssh-vault -u bob -f


将为与用户使用的AWS格式匹配的bob打印指纹。

#6 楼

对于使用Python的我们来说

from Crypto.PublicKey import RSA
import hashlib
import base64

#Load your key from disk, or a string, or generate.
my_key = RSA.importKey(open(my_rsa_private_key, 'r').read())

# Normal md5 fingerprint
fp_plain = hashlib.md5(base64.b64decode(my_key.exportKey('OpenSSH').strip().split()[1].encode('ascii'))).hexdigest()
print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))

#AWS' EC2 fingerprint
public_only_key = RSA.importKey(my_key.exportKey('OpenSSH'))
fp_plain = hashlib.md5(public_only_key.exportKey('DER')).hexdigest()
print ':'.join(a+b for a,b in zip(fp_plain[::2], fp_plain[1::2]))


评论


不幸的是,这在使用最新的Homebrew Python 2.7.13的macOS 10.11上对我失败,出现以下错误:ValueError:不支持PEM加密格式。

– RichVel
17年4月7日在5:45

@RichVel,我无法重现该错误。我刚刚在virtualenv中使用自制python 2.7.13在macOS 10.12上进行了测试,并且工作正常。如果我不得不猜测,也许您不满足pycrypto的一些C要求。也许这会有所帮助?

–安迪
17年4月11日在21:14



#7 楼

#!/bin/bash
key_file=
if [[ -n $key_pub_file ]]; then
    ssh-keygen -e -f $key_pub_file -m pkcs8 | openssl pkey -pubin -outform der | openssl md5 -c
else
    echo "pass the pub file as argument"
fi


这是我使用的脚本,将脚本路径添加到环境中。
感谢J.Doe提供了答案

#8 楼

Java(使用BouncyCastle)。如果AWS控制台显示较短的键,请尝试使用MD5。 (SHA1:20个字节,MD5:16个字节)。

  /**
   * @return the SHA1 digest of the DER encoded RSA private key, e.g. 16:61:7d:1c:e7:d1:3b:93:b6:81:bf:64:7a:a0:38:fa:b6:6c:9e:e4
   */
  private String getAwsFingerprint(File rsaPrivateKeyFileFromAws) throws Exception {
    try(FileReader reader = new FileReader(rsaPrivateKeyFileFromAws)) {
      java.security.KeyPair keyPair = new JcaPEMKeyConverter().getKeyPair((PEMKeyPair) new PEMParser(reader).readObject());
      String hex = Hex.toHexString(MessageDigest.getInstance("SHA1").digest(keyPair.getPrivate().getEncoded()));
      StringBuilder sb = new StringBuilder();
      for(int i = 0; i < hex.length();) {
        sb.append(hex.charAt(i++));
        sb.append(hex.charAt(i++));
        sb.append(i % 2 == 0 && i != hex.length() ? ":" : "");
      }
      return sb.toString();
    }
  }