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 EC2 显示的是 SSH2 指纹,而不是大家期望的 OpenSSH 指纹。用户界面中没有这样说。
它还显示两种完全不同的指纹,具体取决于密钥是在 AWS 上生成并下载的,还是您是否上传了自己的公钥。
生成的指纹
与 EC2 显示的不匹配。您可以使用 AWS API 工具通过
ec2-fingerprint-key
命令生成指纹,也可以使用 OpenSSL 来执行此操作。请注意,如果您最初在 AWS 上生成了密钥,但随后再次上传(例如,到另一个区域),那么您将获得不同的指纹,因为它将采用 SSH2 RSA 指纹,而不是它为您显示的密钥的 sha1在 AWS 上生成。
好玩,嘿?
在上面,
test-generated
是使用 AWS EC2 生成的。是 AWS 生成、提取并再次上传test-generated-reuploaded
的私钥中的公钥。ssh-keygen -y
第三个密钥test-uploaded
是本地生成的密钥……但本地ssh-keygen -l
指纹是b2:2c:86:d6:1e:58:c0:b0:15:97:ab:9b:93:e7:4e:ea
。上传到 AWS 的密钥
当您将密钥上传到 AWS 时,您仅上传公钥,AWS 会显示公钥的 MD5 哈希值。
您可以使用 OpenSSL(如Daniel 在 AWS 论坛上演示的那样)以 AWS使用的格式生成指纹,以显示上传的公钥 (SSH2 MD5) 的指纹,例如:
如果您有私钥,您可以通过从私钥中提取公共部分并使用以下方法对其进行散列来生成指纹:
如果您只有公钥,并且它是 OpenSSH 格式,您需要先将其转换为 PEM,然后是 DER,然后是哈希,使用:
在 AWS 上生成的密钥
当您在 AWS 上生成密钥对时,AWS 会显示私钥的 SHA1 哈希,该哈希更长,例如:
在这种情况下,您需要使用以下命令(也由 Daniel 在 AWS 论坛上展示)根据私钥生成 sha1 哈希:
在下载的 AWS 生成的私钥/证书文件上。它也适用于您转换为 OpenSSH 格式的密钥。但是,这确实要求您拥有私钥,因为哈希是私钥的。如果您只有公钥,则无法在本地生成哈希。
参考
看:
如果您只有公钥,您可以按如下方式生成 AWS 指纹:
AWS 文档上有一个资源http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html#verify-key-pair-fingerprints
如果您使用 AWS 创建了密钥对,则可以使用 OpenSSL 工具从私有密钥文件生成指纹:
复制
如果您使用第三方工具创建了密钥对并将公钥上传到 AWS,则可以使用 OpenSSL 工具从本地计算机上的私钥文件生成指纹:
复制
输出应与控制台中显示的指纹匹配。
这就是我使用的:
这从公钥生成指纹,类似于上面的一些。
以防万一这可能有用:https ://ssh-vault.com/post/fingerprint/
例如:
将打印与 AWS 使用的格式匹配的用户 bob 的指纹。
对于我们这些使用 Python 的人
这是我使用的一个脚本,将脚本路径添加到env。感谢 J.Doe 的回答
Java(使用 BouncyCastle)。如果 AWS 控制台显示较短的密钥,请尝试使用 MD5。(SHA1:20 字节,MD5:16 字节)。