在新版本的 openssh 上以(旧)十六进制格式获取 SSH 密钥指纹

sto*_*tic 55 linux ssh freebsd openssh

openssh 似乎改变了它显示关键指纹的方式。

我正在尝试从客户端机器 ssh 到服务器:

  • 客户端:运行 OpenSSH 6.6.1 的 ubuntu 14.04
  • 服务器:运行 OpenSSH 7.2p2 的 FreeBSD。

客户端将服务器密钥的 md5 哈希报告为 16 对十六进制数字的序列,如下所示:

a7:b1:3e:3d:84:24:a2:5a:91:5f:6f:e9:cf:dd:2b:6a

服务器默认使用 sha256 哈希,但由于这个答案,我可以通过运行强制它提供 sha1 哈希:

[root@host /etc/ssh]# ssh-keygen -l -E sha1 -f ssh_host_ecdsa_key.pub

我希望结果如下所示:

a7:b1:3e:3d:84:24:a2:5a:91:5f:6f:e9:cf:dd:2b:6a

但我得到了这个:

256 SHA1:KIh0ejR4O+RqrSq7JdGAASddRfI root@host.local (ECDSA)

在我看来,现在显示的是指纹的 base64 编码版本,而不是十六进制数字。

如何以与(旧)客户端报告的格式(冒号分隔的十六进制数字,sha1 哈希)相同的格式获取服务器密钥的校验和,以检查它们是否相同?

编辑: 旧版本的 SSH 提供md5校验和,而不是我错误地认为的 sha1 校验和。在 -E 选项中使用该校验和(正如现在接受的答案应该说明的那样)可提供所需的输出。

Jak*_*uje 78

客户端将服务器密钥的 sha1 哈希报告为 16 对十六进制数字的序列,如下所示:

    a7:b1:3e:3d:84:24:a2:5a:91:5f:6f:e9:cf:dd:2b:6a
Run Code Online (Sandbox Code Playgroud)

这是 MD5 哈希。

正如你所看到的运行

ssh-keygen -l -E md5 -f ssh_host_ecdsa_key.pub
Run Code Online (Sandbox Code Playgroud)

将为您提供所需的相同指纹,而无需您在回答中解释的这种 harakiri。

  • 不幸的是,这不起作用。我的问题包含运行您建议的命令的结果。较新版本的 ssh-keygen 将 md5 哈希值作为(base64 编码?)字符串而不是十六进制字符串提供。“All that harakiri”(一个恰当的描述!)是我能找到的从新版本的 openssh 工具获取旧式十六进制字符串的最简单方法。 (2认同)
  • md5 而不是 sha1 ......不知道我是怎么错过的。这确实提供了匹配的输出。 (2认同)

sto*_*tic 5

事实证明,SSH Cookbook有一种方法可以手动生成旧十六进制格式的密钥。我在 freebsd 服务器上使用了它。

awk '{print $2}' key.pub | base64 -d | md5 | sed 's/../&:/g; s/: .*$//'

打破这个:

awk '{print $2}' key.pub

打印出“key.pub”中的第二个(空格分隔)列,这是密钥本身

base64 -d

密钥是 base64 编码的。这将输出密钥的实际字节

MD5

这是 freebsd 相当于 ssh 食谱页面上的配方中指定的“md5sum -b”

sed 's/../&:/g; s/: .*$//'

这里有两个 sed 命令:

s/../&:/g;

用同一对后跟冒号替换该行上的每一对字符(感谢末尾的 'g' 标志)

s/: .*$//'

删除任何尾随冒号(将冒号后跟空格后跟任何直到行尾的任何内容替换为空)。


rpr*_*rpr 5

在这种情况下,我使用以下小脚本(在 Debian 和 Ubuntu 上测试):

#!/bin/sh

# Gather the public ssh host keys for the given host
# and for each key print the fingerprint in hex format using the given
# checksum command (e.g. md5sum, sha256sum, ...)

if [ "$#" != 2 ]; then
  echo "usage: $0 hostname checksum_command"
  exit 1
fi

ssh-keyscan $1 2>/dev/null | while read -r line; do
  echo "Scanned key:"
  echo $line
  echo "$2 fingerprint:"
  echo $line | awk '{print $3}' | base64 -d | $2 -b | awk '{print $1}' | sed 's/../&:/g' | sed 's/:$//'
  echo
done
Run Code Online (Sandbox Code Playgroud)

用法示例:

$ myscript host.example.com md5sum
Scanned key:
host.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJUXq7vpcEpnZQxxiLw/tdg8ui4LoqbW1O5nGyLtGw49
md5sum fingerprint:
6c:ef:26:f7:98:ad:ed:5b:cc:ff:83:13:46:c9:f6:79

Scanned key:
host.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC4aLMajBvisnWNR2VX5K1KEkNeRmzlcs+svbY6/DiumMTZNtqB5duZjGkMmEbIclHaT7rQG9efAWsNhai5cJVRZ4VX1Gu/TLycEk4OY56MrrWjQYweSUr/W6E0eVCf7gh/ym2vMcevct4373fGDdlogk9Wa97lDV6PUXRy/znxRlo3tBc6KMOZIBoPu8UjeLr2ZPNPjO6hXX/96HbYfboxjhMl5eb8AWR0MGd4qU7RZZa2XhT4/4eSo8h9gEq8V3tasB24fMdw3K+HRiDyZm8uoNq+IrJlC22pBpzxRQtsv0Nd+uC5pK/UPVI3AFfdHMrmn7IHRio8aEaTloM6MRysGMtXE0kFQ/pV2U3TBmK/9wxID83qMDsQeUH4oTyjSJ0dCBuqgVQUg44z5qXVOK7gruvZSTyH7DsIyAXhlvLNwdtXPJ4HPQ90ZxLpiFWYgSPErQgbfgKeFkoSQiSP1M+UMkITCGRKMeUeDINheRJh/5y8+C3DjE54xyI4903ztyI7HqgVTOOFCtf+dlhCuS6+J20PFXEHDMdGCwmPQrKOG9Rb4NBxuvtn7MxJnwnlIu3nhDjr8SlZDOTvuK+bLpc4AZwEsNY7ANKFvj2mqE6hjkhu+x7khg84VQ6BKOmHIQnMrCpqICaNgB7Vz2d183BETrnfKQaPh79G5cQox5vwvw==
md5sum fingerprint:
b2:9c:cd:30:b1:38:e3:d1:17:d6:73:eb:03:9a:80:83

$ myscript host.example.com sha256sum
Scanned key:
host.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC4aLMajBvisnWNR2VX5K1KEkNeRmzlcs+svbY6/DiumMTZNtqB5duZjGkMmEbIclHaT7rQG9efAWsNhai5cJVRZ4VX1Gu/TLycEk4OY56MrrWjQYweSUr/W6E0eVCf7gh/ym2vMcevct4373fGDdlogk9Wa97lDV6PUXRy/znxRlo3tBc6KMOZIBoPu8UjeLr2ZPNPjO6hXX/96HbYfboxjhMl5eb8AWR0MGd4qU7RZZa2XhT4/4eSo8h9gEq8V3tasB24fMdw3K+HRiDyZm8uoNq+IrJlC22pBpzxRQtsv0Nd+uC5pK/UPVI3AFfdHMrmn7IHRio8aEaTloM6MRysGMtXE0kFQ/pV2U3TBmK/9wxID83qMDsQeUH4oTyjSJ0dCBuqgVQUg44z5qXVOK7gruvZSTyH7DsIyAXhlvLNwdtXPJ4HPQ90ZxLpiFWYgSPErQgbfgKeFkoSQiSP1M+UMkITCGRKMeUeDINheRJh/5y8+C3DjE54xyI4903ztyI7HqgVTOOFCtf+dlhCuS6+J20PFXEHDMdGCwmPQrKOG9Rb4NBxuvtn7MxJnwnlIu3nhDjr8SlZDOTvuK+bLpc4AZwEsNY7ANKFvj2mqE6hjkhu+x7khg84VQ6BKOmHIQnMrCpqICaNgB7Vz2d183BETrnfKQaPh79G5cQox5vwvw==
sha256sum fingerprint:
f4:61:58:e4:90:65:c4:70:98:7f:d1:40:0a:d8:d9:79:14:e6:91:dc:b6:ed:91:8c:c0:df:d9:65:db:dd:a0:18

Scanned key:
host.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJUXq7vpcEpnZQxxiLw/tdg8ui4LoqbW1O5nGyLtGw49
sha256sum fingerprint:
4b:73:d1:d7:80:87:46:64:56:71:64:10:7a:66:83:9b:c7:58:39:0b:16:74:dd:9b:d9:4b:e5:d5:61:7e:99:45
Run Code Online (Sandbox Code Playgroud)

  • oneliner: `ssh-keygen -l -Emd5 -f <(ssh-keyscan host.example.com)` 如果命令就可以,为什么还要使用脚本? (2认同)