![如何让 Putty 请求远程 SHA256 blob 作为密钥指纹?](https://linux22.com/image/1498220/%E5%A6%82%E4%BD%95%E8%AE%A9%20Putty%20%E8%AF%B7%E6%B1%82%E8%BF%9C%E7%A8%8B%20SHA256%20blob%20%E4%BD%9C%E4%B8%BA%E5%AF%86%E9%92%A5%E6%8C%87%E7%BA%B9%EF%BC%9F.png)
当我从 Mac 通过 ssh 连接到新的远程 Ubuntu 服务器时,它会要求我确认密钥指纹为 SHA256 base64 blob。
但是当我尝试使用 Windows 或 Ubuntu 上的 Putty 连接到新的远程 Ubuntu 服务器时,它要求我确认密钥指纹为 MD5。我更愿意使用 SHA256 base64 blob 进行确认。
这密钥交换配置面板的 Putty 文档表示它知道 base64 blob,但参考的是假设我事先知道指纹的设置(手动配置)。
当连接到远程服务器并且远程指纹与本地存储的先前值不匹配时,我可以/如何告诉 Putty 显示新的远程 base64 blob 密钥指纹而不是新的远程 MD5 密钥指纹?
答案1
注意区分 blob 和 hashes。公钥斑点OpenSSH 和 PuTTY 使用的密钥对给定密钥而言是相同的,无论使用的哈希值如何。密钥 blob 是存储OpenSSH 在其xxx_key.pub known_hosts authorized_keys
文件中以 base64 格式显示,部分原因是这样可以更轻松地使用诸如剪切粘贴之类的技术复制这些文件和值,并且(尤其是较旧的)电子邮件可能无法处理“二进制”又称“8 位”数据。OpenSSH 显示的“指纹”(默认情况下,除非您要求VisualHostKey
)过去是以十六进制显示的 MD5(blob),现在是以 base64 显示的 SHA256(blob)。PuTTY 遵循了 OpenSSH 的原始领先优势,但(截至 0.67)没有更新。
您可以按照手册中的说明请求增强功能,并在http://www.chiark.greenend.org.uk/~sgtatham/putty/feedback.html#feedback-features。或者它是开源的;您可以自己进行更改,然后将其提交回给他们(请参阅 B.4 之后的 B.5)。'指纹'代码目前在 中的一个地方sshdsa.c
和 中的两个sshrsa.c
地方,但我在网站上看到下一个版本将包括 ecdsa 和 ed25519 密钥,这可能意味着至少有一个甚至几个新的地方可以创建指纹。为了保持一致,也允许在 中对哈希(不仅仅是像现在一样对 blob)进行 base64 加密validate_manual_key
。misc.c
如果您无条件更改为 SHA256-b64 并且从不执行 MD5-hex,那么这很容易;对于其他人可用的提交或功能,这可能必须是可配置和/或交互式的,这两者看起来都比较困难。
对于 Windows,我可以看到一个非常笨重的解决方法。使用plink
连接到主机并接受新密钥,将其放入注册表中。(如果有旧密钥,请先保存它。)从注册表中获取新密钥(分块),构建 blob、哈希和 base64 并显示以供确认。如果没有确认,请从注册表中删除密钥(并恢复任何先前的密钥)。
对于 Unix,一个稍微不那么笨拙的方法是使用ssh
来StrictHostKeyChecking=no
接受新密钥并将 base64 blob 放入 中known_hosts
,或者使用ssh-keyscan
直接获取 base64 blob。然后进行 base64 解码、哈希、base64 编码(哈希)并显示;如果ssh
强制接受后为坏的,则从 中删除坏的条目known_hosts
;如果 之后为好的ssh-keyscan
,则添加好的条目。OpenSSL 可以方便地完成计算的两个部分:
awk <.ssh/known_hosts '$1~/thehostname/{print $3}' |openssl base64 -d |openssl sha256 |openssl base64
但是如果您没有 OpenSSL,那么结合其他 base64 和 sha256 工具应该很容易。