Odcisk palca ssh SHA256 podany przez klienta, ale tylko odcisk palca md5 znany serwerowi

118

Podczas łączenia z nowym / nieznanym serwerem (z najnowszym OpenSSH), na przykład:

ssh example.com

Otrzymasz odcisk palca, jak poniżej:

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)?

Jednak odciski palców są zwykle podawane serwerowi w następującej formie:

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

Jak mogę sprawdzić autentyczność (bez błędów administratorów serwera w celu dostarczenia odcisku palca SHA256)?

JonnyJD
źródło

Odpowiedzi:

151

Wcześniej odcisk palca był podawany jako heksadecymalny skrót md5. Począwszy od OpenSSH 6.8 odcisk palca jest teraz wyświetlany jako base64 SHA256 (domyślnie). Nie można ich bezpośrednio porównać.

Dodali także nową opcję konfiguracji FingerprintHash. Możesz włożyć

FingerprintHash md5

w ~/.ssh/configcelu przywrócenia starej ( mniej bezpiecznej ) wartości domyślnej lub po prostu użyj tej opcji do jednorazowego użytku:

ssh -o FingerprintHash=md5 example.org

co dałoby odcisk palca jako

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

Mamy nadzieję, że administratorzy serwerów udostępnią oba rodzaje odcisków palców w najbliższej przyszłości.

EDYTOWAĆ:

Jak podano na forach Arch Linux , istnieje również trzecia opcja:

Host example.org
    FingerprintHash md5

EDYTOWAĆ:

Możesz wygenerować skrót dowolnego klucza podany w książce kucharskiej OpenSSH :

Odzyskaj klucz:

  • pobierz klucz za pomocą ssh-keyscan example.org > key.pub
  • lub: znajdź klucze na serwerze w /etc/ssh

Wygeneruj skrót:

  • upewnij się, że masz tylko jedną linię / typ, więc usuń wszystkie inne w key.publub uruchomssh-keyscan -t rsa example.org > key.pub
  • ssh-keygen -l -f key.pub (domyślny skrót, w zależności od wersji OpenSSH)
  • ssh-keygen -l -f key.pub -E md5 (md5 na bieżącym OpenSSH)
  • awk '{print $2}' ssh_host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64 (sha256 na starym OpenSSH)
  • (Może być konieczne rozpoczęcie linii od awk '{print $3}'nowszych wersji ssh-keyscan, ponieważ format się zmienił)
JonnyJD
źródło
4
Czy wiesz, jak mogę uzyskać odcisk palca Sha256 na serwerze, jeśli mam tam dostęp? ssh-keygen -lf na serwerze daje mi tylko wydruk md5, a przez całe moje życie nie mogę znaleźć, jak zdobyć sha256 ani na stronach podręcznika, ani na stronie www ...
kodowanie
6
Do odpowiedzi dodałem wycinek z książki kucharskiej OpenSSH przy użyciu sha256sum.
JonnyJD,
2
dziękuję, jesteś jedynym, który udzieli odpowiedzi, która ma rzeczywistą wartość.
Florian Heigl
1
Niestety dostaję inny skrót SHA-256 podczas używania awk1-liniowej linii (nie pasuje do skrótu pokazanego przez mojego klienta)
Jonathan Cross
2
sha256sum -b | awk '{print $1}' | xxd -r -pmożna zastąpić openssl sha256 -binarynie wymagając zainstalowanego vima. Wynikająca z tego komenda brzmiałaby:awk '{print $2}' ~/.ssh/id_rsa.pub | base64 -d | openssl sha256 -binary | base64
Alexander Tumin
27

Właśnie stworzyłem mały skrypt bash, który wydrukuje tabelę z odciskami palców dla wszystkich szyfrów kluczowych dozwolonych na serwerze (zgodnie z /etc/ssh/sshd_config) zarówno w algo, jak SSH-256i w MD5algo. Oto przykładowy wynik:

 +---------+---------+-----------------------------------------------------+
 | 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]-----+

Skrypt będzie działał również na serwerach z SSHwersją poniżej 6.8(przed dodaniem -E md5opcji).

Edycja: Zaktualizowano wersje jeszcze nowszych wersji SSH, które przełączały teraz domyślne szyfry z obsługą obrazów ASCII.

#!/bin/bash
# server_ssh_fingerprints
#
# Version 0.2
#
# 2016 Kepi <[email protected]
# 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

To jest po prostu ładny wydruk z wykorzystaniem informacji z JonnyJDodpowiedzi. Dzięki.

Kepi
źródło
1
Uczyniłem go bardziej niezawodnym i poprawiłem nieco funkcjonalność; wersja 0.3 (z dziennikiem zmian) tutaj: github.com/unixnut/scripts/blob/master/ssh_fprint Dziękujemy za napisanie tego, jest niesamowite!
Alastair Irvine
6

okazuje się, że ssh-keygen (kiedyś po wersji 6.6; przypuszczalnie 6.8) ma -E md5opcję, która spowoduje wydrukowanie odcisku palca jako odcisku palca md5. Jeśli więc możesz samodzielnie pobrać plik klucza publicznego serwera, możesz go ssh-keygen -E md5 -l -f ssh_host_rsa_key.pubpodać i uzyskać znajomy odcisk palca.

Greg Minshall
źródło
2
wszystko to jest już dobrze sformatowane w poprzedniej odpowiedzi.
Jakuje
3

Następująca linijka działa (przynajmniej) na Ubuntu 16.04,18.04 / Centos >= 7

(Testowane na serwerach: 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-

Wynik:

# 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
Marinos An
źródło
1

próbował zmodyfikować, aby również losowa grafika znalazła się w tabeli:

# 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

... ale tak naprawdę nie jestem programistą, a skrypt nie działa zgodnie z oczekiwaniami. Byłbym wdzięczny, jeśli ktoś może pomóc w naprawie (również czyszczenie). Byłoby miło mieć obok siebie losowe obrazy artystyczne sha256 i md5, aby efektywniej wykorzystać przestrzeń. Zmodyfikowałem również polecenia md5 i sha256, ponieważ oryginalne nie działały dla mnie (prawdopodobnie zbyt nowy system) - tylko sha256 był zapisany w tabeli ze znakiem „=” na końcu, który nie był częścią rzeczywistego odcisku palca i nie mógł go usunąć.

(przepraszam, nie mogłem komentować, ponieważ niedawno się zarejestrowałem)

zeroconf
źródło
Jeśli masz nowe pytanie, zadaj je, klikając przycisk Zadaj pytanie . Dołącz link do tego pytania, jeśli pomaga to w zapewnieniu kontekstu.
Donald Duck
Cóż - jak widzisz - nie jest to nowe pytanie, ale faktem jest, że zaproponowany skrypt nie działał zgodnie z oczekiwaniami i zaproponowano nową i wciąż jeszcze niepełną wersję. Mógłbym zmodyfikować istniejący skrypt, aby działał zgodnie z oczekiwaniami, ale próbowałem dodać losową grafikę i ta część nie jest kompletna. W rzeczywistości istnieje jedna propozycja porównania pewnego klucza publicznego i klucza oferowanego, ale ten wariant nie jest odporny na MITM: ssh-keyscan -t ecdsa xxx.xxx.xxx.xxx | ssh-keygen -lv -f - && ssh -X -o VisualHostKey = tak -i ~ / .ssh / key uż[email protected]
zeroconf
Nie widziałem twoich komentarzy, ale dzisiaj wpadłem na ten sam pomysł, więc moja odpowiedź jest teraz zaktualizowana o działającą wersję dla nowszych wersji OpenSSH, w tym grafiki ASCII.
Kepi