%20%D1%88%D0%B5%D1%81%D1%82%D0%BD%D0%B0%D0%B4%D1%86%D0%B0%D1%82%D0%B5%D1%80%D0%B8%D1%87%D0%BD%D0%BE%D0%BC%20%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B5%20%D0%B2%20%D0%BD%D0%BE%D0%B2%D0%BE%D0%B9%20%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B8%20openssh.png)
Похоже, openssh изменил способ отображения отпечатков ключей.
Я пытаюсь подключиться по ssh с клиентской машины к серверу:
- клиент: Ubuntu 14.04 с OpenSSH 6.6.1
- сервер: FreeBSD с OpenSSH 7.2p2.
Клиент сообщает 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 | base64 -d | md5 | sed 's/../&:/g; s/: .*$//'
Разбираем это подробнее:
awk '{print $2}' ключ.pub
распечатать второй (разделенный пробелом) столбец в "key.pub", который является самим ключом
base64 -д
ключ закодирован в base64. Это выведет фактические байты ключа
md5
это эквивалент команды «md5sum -b» для freebsd, указанной в рецепте на странице кулинарной книги ssh
sed 's/../&:/g; s/: .*$//'
Здесь есть две команды sed:
с/../&:/г;
замените каждую пару символов в строке (благодаря флагу «g» в конце) той же парой, за которой следует двоеточие
с/: .*$//'
удалите все завершающие двоеточия (замените двоеточие, за которым следует пробел, а затем что-либо до конца строки ничем).
решение4
Для ключей, добавленных в ssh-agent, эта команда выведет список их отпечатков открытых ключей MD5:
ssh-add -l -E md5
Чтобы распечатать отпечатки MD5 для всех открытых ключей в каталоге, используйте это:
find ~/.ssh/ -name *.pub -printf '%f\t' -exec ssh-keygen -l -E md5 -f {} \;
При этом также будет напечатано имя файла для облегчения его идентификации.