这似乎很简单。我运行“ssh-keygen -l -f”(默认似乎是 SHA1)。所有示例都显示它打印十六进制格式的摘要,其中包含一些额外的无害信息。然而,在我的 Mac 上,我得到的是一个无用的、不透明的字符串。
我应该提到,“-E”参数在 Mac (10.10) 上可用,但在 Ubuntu (14.04) 上不可用。如果它不适用于你,请记住这一点。
$ ssh-keygen -l -E md5 -f dustin.pem
2048 MD5:29:ed:da:d3:5a:8c:78:4f:62:d3:fd:0c:77:5b:6d:d9 dustin.pem.pub (RSA)
$ ssh-keygen -l -E sha1 -f dustin.pem
2048 SHA1:x2ENPL+vzVdlgkIyu0tAhVQ+H4U dustin.pem.pub (RSA)
$ ssh-keygen -l -E sha256 -f dustin.pem
2048 SHA256:agJs/axI8QPzet/eoPMDxLSf37fd1bgsMX4Di0gqMy4 dustin.pem.pub (RSA)
两种尝试的 SHA 算法均返回不透明但不同的 ASCII 字符串。
我遗漏了什么?如何获取 SHA1 十六进制摘要,而无需将密钥复制到 Linux 系统来执行此操作?
谢谢。
答案1
更新:这个答案是关于OpenSSH指纹。根据 OP 的评论,实际问题显然是AWS指纹,当时我不知道它们有什么不同;那看为什么我的 OpenSSH 密钥指纹与 AWS EC2 控制台密钥对指纹不匹配?和https://stackoverflow.com/questions/19251562/importing-key-pair-into-amazon-aws-wrong-fingerprint甚至可能更多。
传统上,OpenSSH 使用十六进制的 MD5 显示(公共)密钥指纹,或者可选地显示为“ASCII 艺术”或“bubblebabble”(一系列无意义但可发音的 5 个字母的准词);2015 年 3 月的 6.8 版本添加了 SHA1 和 SHA256 选项(PEM风格)base64,后者现在是默认值,并且在这三种情况下,哈希名称都带有前缀,因此您知道它是什么。从那时起才有选项,而 Ubuntu 14.04 的日期是 2015 年 3 月之前ssh-keygen -l
。-E
您不需要十六进制的 SHA1 摘要来验证主机,因为ssh
客户端从不显示该摘要,只需要 MD5-hex 或 SHA1-base64(默认情况下不是)或 SHA256-base64。如果您无论如何都需要一个,除了“rsa1”密钥外,您可以相当轻松地做到这一点,并且您应该在巴拉克·奥巴马成为美国总统之前停止使用 SSHv1 协议,因此停止使用 rsa1 密钥。
从中获取 base64 'blob'
- 或类似文件的字段 2
id_$alg.pub
,或输出ssh-keygen -y
- 文件中行的字段 3,
known_hosts
除非它有标记,否则为字段 4 - 文件中行的字段 2,
authorized_keys
除非它有选项,否则为字段 3
并将其从 base64 转换为二进制,使用所需哈希值对其进行哈希处理,并以所需表示形式显示。由于openssl
默认情况下以十六进制显示哈希值,并且可以从 base64 转换为 base64,因此您可以执行以下操作
awk '{print $2}' ~/.ssh/id_xxx.pub | openssl base64 -d -A | openssl sha1
注意-A
;否则 openssl(取决于版本)可能无法解码长度超过 76 个字符的 base64 —— 并且 OpenSSH 公钥 blob(ed25519 除外)更长。(谢谢伯恩哈德·瓦格纳捕获错误——并将我的注意力拉回到这个旧答案上,以便我可以添加上面的范围修复。)
另请注意,您可以告诉较新的ssh
客户端使用旧的 MD5-hex 指纹-o FingerprintHash=MD5
或等效ssh_config
设置显示。
答案2
这些字符串看起来base64编码的哈希值。