Отпечаток SHA256 ssh предоставляется клиентом, но для сервера известен только отпечаток md5

118

Например, при подключении к новому / неизвестному серверу (с недавним OpenSSH):

ssh example.com

Вы получаете отпечаток, как показано ниже:

The authenticity of host 'example.org (192.0.2.42)' can't be established.
RSA key fingerprint is SHA256:7KMZvJiITZ+HbOyqjNPV5AeC5As2GSZES5baxy1NIe4.
Are you sure you want to continue connecting (yes/no)?

Тем не менее, отпечатки пальцев обычно предоставляются для сервера в этой форме:

f6:fc:1c:03:17:5f:67:4f:1f:0b:50:5a:9f:f9:30:e5

Как я могу проверить подлинность (без ошибок администраторов сервера для предоставления отпечатка пальца SHA256)?

JonnyJD
источник

Ответы:

151

Ранее отпечаток был задан как шестнадцатеричный хэш md5. Начиная с OpenSSH 6.8, отпечаток пальца теперь отображается как base64 SHA256 (по умолчанию). Вы не можете сравнить их напрямую.

Они также добавили новую опцию конфигурации FingerprintHash. Вы можете положить

FingerprintHash md5

в вашем случае, ~/.ssh/configчтобы вернуться к старому ( менее безопасному ) значению по умолчанию или просто использовать эту опцию для одноразового использования:

ssh -o FingerprintHash=md5 example.org

который дал бы отпечаток пальца как

MD5:f6:fc:1c:03:17:5f:67:4f:1f:0b:50:5a:9f:f9:30:e5

Надеемся, что администраторы сервера предоставят оба типа отпечатков пальцев в ближайшем будущем.

РЕДАКТИРОВАТЬ:

Как указано на форумах Arch Linux , есть и третий вариант:

Host example.org
    FingerprintHash md5

РЕДАКТИРОВАТЬ:

Вы можете сгенерировать хеш произвольного ключа, как это указано в кулинарной книге OpenSSH :

Получить ключ:

  • скачать ключ с ssh-keyscan example.org > key.pub
  • или: найти ключи на сервере в /etc/ssh

Создайте хеш:

  • убедитесь, что у вас есть только одна строка / тип, поэтому либо удалите все остальные, key.pubлибо выполнитеssh-keyscan -t rsa example.org > key.pub
  • ssh-keygen -l -f key.pub (по умолчанию хеш, в зависимости от версии OpenSSH)
  • ssh-keygen -l -f key.pub -E md5 (MD5 на текущий OpenSSH)
  • awk '{print $2}' ssh_host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64 (sha256 на старом OpenSSH)
  • (Возможно, вам придется начать строку с awk '{print $3}'для более новых версий ssh-keyscan, потому что формат изменился)
JonnyJD
источник
4
Вы случайно не знаете, как я могу получить отпечаток sha256 на сервере, если у меня есть доступ к нему? ssh-keygen -lf на сервере только дает мне распечатку md5, и до сих пор я не могу найти, как получить sha256 ни на страницах руководства, ни на www ...
кодирование
6
Я добавил отрывок из кулинарной книги OpenSSH, используя сумму sha256 к ответу.
JonnyJD
2
спасибо, вы единственный, кто дает ответ, который имеет реальную ценность.
Флориан Хейгл
1
К сожалению, я получаю другой хэш SHA-256 при использовании awk1-строчного (не совпадает с хешем, показанным моим клиентом)
Джонатан Кросс
2
sha256sum -b | awk '{print $1}' | xxd -r -pможет быть заменен openssl sha256 -binaryне требующим vim установлен. Результирующая командная строка будет такой:awk '{print $2}' ~/.ssh/id_rsa.pub | base64 -d | openssl sha256 -binary | base64
Александр Тумин
27

Просто создан небольшой Баш скрипт , который будет печатать таблицу с отпечатками пальцев для всех ключевых шифров , разрешенных на сервере ( в соответствии с /etc/ssh/sshd_config) в обоих SSH-256и MD5алгоритме. Вот пример вывода:

 +---------+---------+-----------------------------------------------------+
 | Cipher  | Algo    | Fingerprint                                         |
 +---------+---------+-----------------------------------------------------+
 | RSA     | MD5     | MD5:15:66:80:fd:79:d8:c0:92:e8:39:4a:bc:4e:c4:00:15 |
 | RSA     | SHA-256 | SHA256:G+rKuLGk+8Z1oxUV3cox0baNsH0qGQWm/saWPr4qZMM  |
 +---------+---------+-----------------------------------------------------+
 | ECDSA   | MD5     | MD5:f5:90:5c:03:2e:38:1b:c9:86:bd:86:47:5d:22:79:17 |
 | ECDSA   | SHA-256 | SHA256:GGmuOzsG4EGeRV9KD1WK7tRf3nIc40k/5jRgbTZDpTo  |
 +---------+---------+-----------------------------------------------------+
 | ED25519 | MD5     | MD5:d1:5a:04:56:37:f4:75:19:22:e6:e5:d7:41:fd:79:fa |
 | ED25519 | SHA-256 | SHA256:QVdqYeVzvsP4n5yjuN3D2fu8hDhskOxQCQAV5f9QK7w  |
 +---------+---------+-----------------------------------------------------+

 +---[RSA 2048]----+ +---[RSA 2048]----+ +---[ECDSA 256]---+ +---[ECDSA 256]---+ +--[ED25519 256]--+ +--[ED25519 256]--+
 |.oE.   +.++      | |        .o+=     | |      ... Eoo    | |  .. o.o..      .| |        ooo++o.+*| |   .o++o. +oo    |
 |  .   o +oo.     | |        .o= =    | |     +.=.=.o .   | | . .o *..      ..| |       . oo.+o.o=| |      ...o.+     |
 |   + . . o.=     | |       ... X +   | |    . X.o.*      | |o o  ++o      .. | |        . o. ...+| |       ..oo.o .  |
 |    = +  .+ o    | |      ..  = + o  | |     + = o o     | |.+  .o.o     .o  | |         +    ..o| |        =oo .+   |
 |   o o .S  .     | |     . .S  o o   | |    . = S   .    | |...  oo.S  .E* * | |        S      ..| |       .SO .  .  |
 |    +            | |    . E. =o..    | |     o           | | .. o.  . o *.O o| |              .  | |        o B .o.. |
 |   o             | | .o. *.o. *.     | |                 | |   ...   . o * * | |               . | |         E *..=.o|
 |    .            | | oo=...  +.      | |                 | |    +.      o + o| |                E| |          . +.+B+|
 |                 | |o+=.o....o+o     | |                 | |   .o+         . | |                 | |           o.ooOX|
 +------[MD5]------+ +----[SHA256]-----+ +------[MD5]------+ +----[SHA256]-----+ +------[MD5]------+ +----[SHA256]-----+

Скрипт будет работать и на серверах с SSHверсией ниже 6.8(до -E md5добавления опции).

Редактировать: Обновленные версии для еще более новых версий SSH, которые теперь переключают шифры по умолчанию с поддержкой изображений ASCII.

#!/bin/bash
# server_ssh_fingerprints
#
# Version 0.2
#
# 2016 Kepi <kepi@igloonet.cz
# MIT License
#
# Print fingerprint matrix for all allowed Host Keys
# with all allowed ciphers and MD5 and SHA-256 algos
#
# Changelog:
#
# 2018-03-11 (0.2):
# - Support for newer versions of OpenSSH
# - Added visual keys for all algos too - only in recent OpenSSH versions

# standard sshd config path
SSHD_CONFIG=/etc/ssh/sshd_config

# helper functions
function tablize {
    awk '{printf(" | %-7s | %-7s | %-51s |\n", $1, $2, $3)}'
}
LINE=" +---------+---------+-----------------------------------------------------+"

# header
echo "$LINE"
echo "Cipher" "Algo" "Fingerprint" | tablize
echo "$LINE"

declare -A ALGOS
declare -a ASCII

# fingerprints
while read -r host_key; do
    cipher=$(echo "$host_key" | sed -r 's/^.*ssh_host_([^_]+)_key\.pub$/\1/'| tr 'a-z' 'A-Z')
    if [[ -f "$host_key" ]]; then
        if ssh-keygen -E md5 -l -f "$host_key" &>/dev/null; then
        IFS=$'\n'

        for algo in md5 sha256; do
            n=0
            for line in $(ssh-keygen -E $algo -lv -f "$host_key"); do
                n=$(( n + 1))
                if [[ $n -eq 1 ]]; then
                    ALGOS[$algo]=$(echo "$line" | awk '{print $2}')
                else
                    ASCII[$n]="${ASCII[$n]} ${line}"
                fi
            done
        done
        else
            ALGOS[md5]=$(ssh-keygen -l -f "$host_key" | awk '{print $2}')
            ALGOS[sha256]=$(awk '{print $2}' "$host_key" | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64)
        fi

        echo "$cipher" MD5 "${ALGOS[md5]}" | tablize
        echo "$cipher" SHA-256 "${ALGOS[sha256]}" | tablize
        echo "$LINE"
    fi
 done < <(awk '/^HostKey/ {sub(/^HostKey\s+/,"");print $0".pub"};' $SSHD_CONFIG)

echo
for line in "${ASCII[@]}"; do
    echo "$line"
done

Это просто красивая распечатка с использованием информации из JonnyJDответа. Благодарю.

Кепи
источник
1
Я сделал его более надежным и немного улучшил функциональность; версия 0.3 (с журналом изменений) здесь: github.com/unixnut/scripts/blob/master/ssh_fprint Спасибо за написание, это потрясающе!
Аластер Ирвин
6

оказывается, у ssh-keygen (когда-то после версии 6.6; предположительно 6.8) есть -E md5опция, которая заставит его распечатать отпечаток как отпечаток md5. Таким образом, если вы можете самостоятельно получить файл открытого ключа сервера, вы можете передать его ssh-keygen -E md5 -l -f ssh_host_rsa_key.pubи получить свой привычный отпечаток.

Грег Миншалл
источник
2
все это уже в предыдущем ответе хорошо отформатировано.
Jakuje
3

Следующая однострочная работа (как минимум) на Ubuntu 16.04,18.04 / Centos >= 7

(Протестировано с серверами: openssh 3.9- openssh 7.4)

ssh-keygen -l -E md5 -f <(ssh-keyscan -t rsa 192.168.2.1) \
| awk '{print $2}' | cut -d":" -f 2-

Выход:

# 192.168.2.1:22 SSH-2.0-OpenSSH_5.3
65:2c:c4:03:03:2f:6d:c0:c0:09:79:e7:33:c4:f1:78
Маринос Ан
источник
1

попытался изменить, чтобы получить случайное искусство в таблицу:

# standard sshd config path
SSHD_CONFIG=/etc/ssh/sshd_config

# helper functions
function tablize {
        awk '{printf("| %-7s | %-51s |\n", $1, $3)}'
}
LINE="+---------+-----------------------------------------------------+"

# header
echo $LINE
echo "Cipher" "Fingerprint" "Fingerprint" | tablize
echo $LINE

# fingerprints
for host_key in $(awk '/^HostKey/ {sub(/^HostKey\s+/,"");print $0".pub"};' $SSHD_CONFIG); do
        cipher=$(echo $host_key | sed -r 's/^.*ssh_host_([^_]+)_key\.pub$/\1/'| tr '[a-z]' '[A-Z]')
        if [[ -f "$host_key" ]]; then
                md5=$(ssh-keygen -l -f $host_key -E md5 | awk '{print $2}')
                sha256=$(ssh-keygen -l -f $host_key | awk '{print $2}')
                art_sha256=$(ssh-keygen -lv -f $host_key | grep -v -w "256 SHA256" | grep -v -w "1024 SHA256" | grep -v -w "2048 SHA256")
                art_md5=$(ssh-keygen -lv -f $host_key -E md5 | grep -v "256 MD5" | grep -v "1024 MD5" | grep -v "2048 MD5")

                echo $cipher MD5 $md5 | tablize
                echo $cipher SHA-256 $sha256 | tablize
                echo $art_sha256 | tablize
                echo $art_md5 | tablize
                echo $LINE
        fi
done

... но на самом деле я не программист, и скрипт не работает должным образом. Был бы признателен, если кто-нибудь может помочь исправить (также очистка). Было бы неплохо располагать случайные художественные изображения sha256 и md5 для более эффективного использования пространства. Я также изменил команды md5 и sha256, так как оригинальные команды у меня не работали (возможно, слишком новая система) - в таблицу попал только sha256 со знаком «=», который не был частью фактического отпечатка пальца и не мог его удалить.

(извините, я не смог прокомментировать, как я недавно зарегистрировался)

Zeroconf
источник
Если у вас есть новый вопрос, задайте его, нажав кнопку « Задать вопрос» . Включите ссылку на этот вопрос, если это помогает обеспечить контекст.
Дональд Дак
Ну, как вы видите, это не новый вопрос, но на самом деле он признает, что предложенный скрипт не работал должным образом, и была предложена новая и еще не полная версия. Я мог изменить существующий скрипт так, чтобы он работал как положено, но я попытался добавить случайный рисунок, и этот идентификатор не завершен. На самом деле есть одно предложение, как сравнить определенный открытый ключ и предложенный ключ, но этот вариант не является MITM-стойким: ssh-keyscan -t ecdsa xxx.xxx.xxx.xxx | ssh-keygen -lv -f - && ssh -X -o VisualHostKey = да -i ~ / .ssh / key user@xxx.xxx.xxx.xxx
zeroconf
Я не видел ваши комментарии, но сегодня получил ту же идею, поэтому мой ответ теперь дополнен рабочей версией для более поздних версий OpenSSH, включая искусство ASCII.
Кепи