
看來 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 [email protected] (ECDSA)
在我看來,現在顯示的是指紋的 Base64 編碼版本,而不是十六進位數字。
如何取得與(舊)客戶端報告的格式相同的伺服器金鑰的校驗和(冒號分隔的十六進位數字,sha1 雜湊),以便檢查它們是否相同?
編輯: 舊版的 SSH 給了MD5校驗和,不是我錯誤地認為 sha1 校驗和。在 -E 選項中使用該校驗和(如現在接受的答案所示)可提供所需的輸出。
答案1
客戶端將伺服器金鑰的 sha1 雜湊報告為 16 對十六進位數字的序列,如下所示:
a7:b1:3e:3d:84:24:a2:5a:91:5f:6f:e9:cf:dd:2b:6a
這是 MD5 哈希值。
正如你所看到的運行
ssh-keygen -l -E md5 -f ssh_host_ecdsa_key.pub
將為您提供所需的相同指紋,而無需您在答案中解釋的切腹。
答案2
在這種情況下,我使用以下小腳本(在 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
用法範例:
$ 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
答案3
事實證明,SSH 食譜有一種方法可以手動產生舊的十六進位格式的金鑰。我在 freebsd 伺服器上使用了這個。
awk '{print $2}' key.pub | awk '{print $2}' key.pub | Base64-d| md5 | sed 的/../&:/g; s/: .*$//'
分解一下:
awk '{print $2}' key.pub
列印出「key.pub」中的第二列(空格分隔),這是金鑰本身
Base64-d
密鑰是 base64 編碼的。這將輸出密鑰的實際位元組
MD5
這相當於 freebsd 中 ssh 食譜頁面上的配方中指定的“md5sum -b”
sed 的/../&:/g; s/: .*$//'
這裡有兩個 sed 指令:
s/../&:/g;
將行中的每一對字元(感謝末尾的“g”標誌)替換為同一對後跟冒號
s/: .*$//'
刪除任何尾隨冒號(將冒號後面跟著一個空格,後面跟著任何內容替換為直到行尾的任何內容)。
答案4
對於新增至 ssh-agent 的金鑰,此命令將列出其 MD5 公鑰指紋:
ssh-add -l -E md5
若要列印目錄中所有公鑰的 MD5 指紋,請使用以下命令:
find ~/.ssh/ -name *.pub -printf '%f\t' -exec ssh-keygen -l -E md5 -f {} \;
這也將列印文件名,以便於識別。