为什么我的OpenSSH密钥指纹不符合AWS EC2控制台密钥对指纹?

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

ssh-keygen -l -f my_key 

它是不同的长度和不同的字节。

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

    AWS EC2显示了SSH2指纹,而不是每个人都期望的OpenSSH指纹。 它不会在UI中说这个。

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

    使用生成的指纹

     ssh-keygen -l -f id_rsa 

    符合EC2显示。 您可以使用AWS API工具通过ec2-fingerprint-key命令生成指纹,也可以使用OpenSSL来执行此操作。

    请注意,如果您最初在AWS上生成了一个密钥,然后再次上传(例如,到另一个地区),那么您将得到一个不同的指纹,因为它将采用SSH2 RSA指纹,而不是它显示的密钥在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 

    密钥在本地生成

    您可以使用OpenSSL(如AWS上的Daniel所示)以AWS的forms生成指纹,以显示上载的公钥(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 

    AWS上生成的密钥

    如果AWS控制台上显示的密钥指纹比较长,那么它就是在AWS上生成的私钥,如下所示:

     ea:47:42:52:2c:25:43:76:65:f4:67:76:b9:70:b4:64:12:00:e4:5a 

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

     openssl pkcs8 -in aws_private.pem -nocrypt -topk8 -outform DER | openssl sha1 -c 

    在下载的AWS生成的私钥/证书文件上。 它也能处理你转换成OpenSSH格式的密钥。

    参考

    看到:

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

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

    对于我们这些使用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])) 

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

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

    复制

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

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

    复制

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

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

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

    例如:

     $ ssh-vault -u bob -f 

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

    这是我使用的:

     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 $2}' 

    这从公钥生成指纹,类似于上面的一些。