ECDSA 密钥指纹 - 看起来像是 base64 编码的,但字符太少

ECDSA 密钥指纹 - 看起来像是 base64 编码的,但字符太少

我已经设置了一个GitLab 虚拟机,并在其上创建了一个项目。现在我尝试使用我的 git 客户端从另一台机器连接到它(适用于 Windows 的 Gitv2.7.1...也尝试升级到最新版本 2.15.1,但没有变化)。

在 Windows 机器上,我尝试:

git push -u origin --all
The authenticity of host 'localgit.local (10.1.2.3)' can't be established.
ECDSA key fingerprint is SHA256:twmcV7LjBtI9vUsDeFEHeH0lUcBAihWtGye0K9vHCrk.
Are you sure you want to continue connecting (yes/no)? no

我选择“否”,因为当我在虚拟机上仔细检查时,我发现了不同的指纹:

ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 7e:e4:4e:7f:47:b0:41:75:2c:45:bd:be:f5:44:77:d7 /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA)

好的,它是十六进制格式,所以我只需将其转换为 base64,对吗?

hex: 7ee44e7f47b041752c45bdbef54477d7
base64: fuROf0ewQXUsRb2+9UR31w==

嗯,这不匹配……如果我换个方式,将 base64 指纹转换为十六进制,看看它是什么样子,会怎么样?结果我不能,它有 43 个字符,而 base64 字符串的长度必须是 4 的倍数。

对于我在这里遗漏了什么有什么想法吗?

答案1

以冒号分隔的八位字节格式是 MD5 指纹,而不是 SHA256 指纹。您无法直接将两者相互转换(好吧,如果您反转 MD5 指纹,也许可以,但这仍然需要一点 CPU 能力)。

也就是说ssh-keygen,输出 MD5 指纹表明该机器可能正在运行相当老版本的 OpenSSH,因为现在默认的输出格式是 SHA256。您可以尝试传递-E sha256ssh-keygen使其输出 SHA256 哈希,以防有一个版本支持 SHA256 但默认为 MD5,而您恰好正在运行它,但我不想说它一定会起作用。

如果您无法让您的版本ssh-keygen输出 SHA256,另一个选项是“降级”SSH 客户端以在连接时输出 MD5 指纹。为此,您需要-o FingerprintHash=md5在命令行(或FingerprintHash md5在 SSH 配置中)进行设置。考虑到您是通过 git 运行 SSH,究竟如何最好地做到这一点,留给精明的读者去练习吧。<笑>

补充:base64 SHA256 哈希的字符数不“正确”的原因是,SHA256 哈希的字符数不“正确”,无法放入没有尾随符号的 base64 字符串中=。由于最后几个字符“始终”是=符号,因此它们会被删除,从而节省了几个无用的字符。

答案2

我也有同样的疑问,因此我进行了更深入的研究。

在 Linux 服务器上,你可以运行

awk '{print $2}' /etc/ssh/ssh_host_ecdsa_key.pub | base64 -d | sha256sum -b | sed 's/ .*$//' | xxd -r -p | base64

生成SHA256+Base64与客户端尝试连接时显示的指纹相同的指纹。

来源: https://www.lastbreach.com/blog/ssh-public-key-verification-with-fingerprinthash

相关内容