获取 SSH 公钥的 SHA1 摘要

Dus*_*rea 7 ssh ssh-keygen digest

看起来这应该很容易。我运行“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)
Run Code Online (Sandbox Code Playgroud)

两种尝试的 SHA 算法都返回不透明但不同的 ASCII 字符串。

我错过了什么?如何在无需将我的密钥复制到 Linux 系统的情况下获得 SHA1 十六进制摘要?

谢谢。

dav*_*085 6

更新:这个答案是关于OpenSSH指纹的。根据 OP 的评论,实际问题显然是AWS指纹,当时我不知道这是不同的;对于为什么我的OpenSSH密钥指纹不匹配AWS EC2控制台密钥对的指纹?/sf/ask/1347609371/等等。


传统上,OpenSSH 使用十六进制的 MD5 显示(公共)密钥指纹,或者可选地显示为“ASCII art”或“bubblebabble”(一系列无意义但可发音的 5 个字母准词);2015 年 3 月的 6.8 在(PEMstyle) base64 中添加了 SHA1 和 SHA256 选项,后者现在是默认值,并且在所有三种情况下,哈希名称都带有前缀,以便您知道它是哪个。ssh-keygen -l-E选项只从那时起,和Ubuntu从2015年3月前14.04日期。

您不应该需要十六进制的 SHA1 摘要来验证主机,因为ssh客户端从不显示它,只有 MD5-hex 或 SHA1-base64(不是默认情况下)或 SHA256-base64。如果您无论如何都想要一个,除了“rsa1”密钥之外,您可以很容易地做到这一点,并且您应该在巴拉克奥巴马成为美国总统之前停止使用 SSHv1 协议和 rsa1 密钥。

从 base64 'blob' 中取出

  • id_$alg.pub或类似文件的字段 2 ,或输出ssh-keygen -y
  • known_hosts文件中第3 行的第 3 行,除非它有一个标记,然后是第 4 行
  • authorized_keys文件中第2 行的字段 2,除非它有选项,然后是字段 3

并将其从 base64 转换为二进制,使用所需的散列对其进行散列并以所需的表示形式显示。由于openssl默认情况下以十六进制显示哈希值,并且可以从(和到)base64 进行转换,因此您可以执行以下操作

awk '{print $2}' ~/.ssh/id_xxx.pub | openssl base64 -d -A | openssl sha1
Run Code Online (Sandbox Code Playgroud)

注意-A; 否则,openssl(取决于版本)可能无法解码超过 76 个字符的 base64——并且 OpenSSH 公钥 blob 除 ed25519 外更长。(感谢Bernhard Wagner捕捉到一个错误——并将我的注意力拉回到这个旧答案上,所以我可以添加上面的范围修复。)

另请注意,您可以告诉较新的ssh客户端使用-o FingerprintHash=MD5或等效ssh_config设置显示旧的 MD5-hex 指纹。


归档时间:

查看次数:

12325 次

最近记录:

5 年,3 月 前