SHA256 ssh-Fingerabdruck vom Client angegeben, aber nur md5-Fingerabdruck für Server bekannt

118

Wenn Sie sich mit einem neuen / unbekannten Server verbinden (mit neuem OpenSSH), zum Beispiel:

ssh example.com

Sie erhalten den Fingerabdruck wie folgt:

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

Fingerabdrücke werden für den Server jedoch normalerweise in der folgenden Form angegeben:

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

Wie kann ich die Authentizität überprüfen (ohne die Serveradministratoren zu nerven, um einen SHA256-Fingerabdruck bereitzustellen)?

JonnyJD
quelle

Antworten:

151

Zuvor wurde der Fingerabdruck als hexadezimaler md5-Hash angegeben. Ab OpenSSH 6.8 wird der Fingerabdruck nun standardmäßig als base64 SHA256 angezeigt. Sie können diese nicht direkt vergleichen.

Sie haben auch eine neue Konfigurationsoption hinzugefügt FingerprintHash. Du kannst Geben

FingerprintHash md5

in Ihrem ~/.ssh/configzu den alten (zurückzukehren weniger sicher ) Standard oder verwenden Sie diese Option für den einmaligen Gebrauch:

ssh -o FingerprintHash=md5 example.org

was würde den Fingerabdruck als geben

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

Serveradministratoren stellen hoffentlich in naher Zukunft beide Arten von Fingerabdrücken zur Verfügung.

BEARBEITEN:

Wie in den Arch Linux-Foren angegeben , gibt es auch eine dritte Option:

Host example.org
    FingerprintHash md5

BEARBEITEN:

Sie können den Hash eines beliebigen Schlüssels wie im OpenSSH-Kochbuch angegeben generieren :

Rufen Sie den Schlüssel ab:

  • Laden Sie den Schlüssel mit herunter ssh-keyscan example.org > key.pub
  • oder: finde die Schlüssel auf dem Server in /etc/ssh

Generiere den Hash:

  • Stellen Sie sicher, dass Sie nur eine Zeile / einen Typ haben. Löschen Sie also entweder alle anderen Zeilen key.puboder führen Sie sie ausssh-keyscan -t rsa example.org > key.pub
  • ssh-keygen -l -f key.pub (Standard-Hash, abhängig von der OpenSSH-Version)
  • ssh-keygen -l -f key.pub -E md5 (md5 auf aktuellem OpenSSH)
  • awk '{print $2}' ssh_host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64 (sha256 auf alten OpenSSH)
  • (Möglicherweise müssen Sie die Zeile awk '{print $3}'für neuere Versionen von ssh-keyscan mit beginnen, da sich das Format geändert hat.)
JonnyJD
quelle
4
Wissen Sie zufällig, wie ich den sha256-Fingerabdruck auf dem Server abrufen kann, falls ich dort Zugriff habe? ssh-keygen -lf auf dem Server gibt mir nur den md5 Druck, und für das Leben von mir kann ich nicht finden , wie man den sha256 man entweder in den man - Seiten oder das www so weit kommen ...
codeling
6
Ich habe einen Ausschnitt aus dem OpenSSH-Kochbuch mit sha256sum zur Antwort hinzugefügt.
JonnyJD
2
Vielen Dank, Sie sind der einzige, der eine Antwort gibt, die tatsächlich von Wert ist.
Florian Heigl
1
Leider erhalte ich einen anderen SHA-256-Hash, wenn ich Ihren awk1-Liner verwende (entspricht nicht dem von meinem Kunden angezeigten Hash)
Jonathan Cross
2
sha256sum -b | awk '{print $1}' | xxd -r -pkann ersetzt werden, indem openssl sha256 -binarykein vim installiert wird. Resultierende Befehlszeile wäre:awk '{print $2}' ~/.ssh/id_rsa.pub | base64 -d | openssl sha256 -binary | base64
Alexander Tumin
27

Gerade wurde ein kleines Bash-Skript erstellt, das eine Tabelle mit Fingerabdrücken für alle Schlüsselchiffren druckt, die auf dem Server (gemäß /etc/ssh/sshd_config) in beiden SSH-256und in MD5algo zulässig sind . Hier ist eine Beispielausgabe:

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

Das Skript wird auch auf Servern mit der folgenden SSHVersion ausgeführt 6.8(bevor die -E md5Option hinzugefügt wurde).

Bearbeiten: Aktualisierte Versionen für noch neuere Versionen von SSH, bei denen die Standard-Verschlüsselung jetzt mit Unterstützung für ASCII-Bilder umgestellt wurde.

#!/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

Dies ist nur ein hübscher Ausdruck unter Verwendung der Informationen aus JonnyJDder Antwort. Vielen Dank.

Käppi
quelle
1
Ich habe es robuster gemacht und die Funktionalität leicht verbessert. version 0.3 (mit changelog) hier: github.com/unixnut/scripts/blob/master/ssh_fprint Danke, dass du das geschrieben hast , es ist großartig!
Alastair Irvine
6

Es stellt sich heraus, dass ssh-keygen (irgendwann nach Version 6.6; vermutlich 6.8) eine -E md5Option hat, mit der der Fingerabdruck als md5-Fingerabdruck ausgegeben wird. Wenn Sie also die öffentliche Schlüsseldatei des Servers selbstständig abrufen können, können Sie sie füttern ssh-keygen -E md5 -l -f ssh_host_rsa_key.pubund Ihren vertrauten Fingerabdruck abrufen.

Greg Minshall
quelle
2
das alles ist schon in der vorigen antwort gut formatiert.
Jakuje
3

Der folgende Einzeiler arbeitet (zumindest) an Ubuntu 16.04,18.04 / Centos >= 7

(Getestet mit Servern: 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-

Ausgabe:

# 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
quelle
1

versuchte zu modifizieren, um auch zufällige Kunst in die Tabelle zu bekommen:

# 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

... aber ich bin eigentlich kein Programmierer und das Skript funktioniert nicht wie erwartet. Würde mich freuen, wenn jemand helfen kann, zu beheben (auch aufzuräumen). Es wäre schön, zufällige sha256- und md5-Kunstbilder nebeneinander zu haben, um den Platz effizienter zu nutzen. Ich habe auch md5- und sha256-Befehle geändert, da die ursprünglichen Befehle für mich nicht funktionierten (wahrscheinlich zu neues System) - nur sha256 erschien in der Tabelle mit dem "=" - Zeichen am Ende, das nicht Teil des tatsächlichen Fingerabdrucks war und ihn nicht entfernen konnte.

(Entschuldigung, ich konnte keinen Kommentar abgeben, da ich mich vor kurzem registriert habe.)

nullkonf
quelle
Wenn Sie eine neue Frage haben, fragen Sie es bitte durch Klicken Frage stellen Taste. Fügen Sie einen Link zu dieser Frage hinzu, wenn dies zur Bereitstellung des Kontexts beiträgt.
Donald Duck
Nun, wie Sie sehen, ist es eine nicht neue Frage, aber tatsächlich zugeben, dass das vorgeschlagene Skript nicht wie erwartet funktioniert hat und eine neue und immer noch nicht vollständige Version vorgeschlagen wurde. Ich könnte das vorhandene Skript so ändern, dass es wie erwartet funktioniert, aber ich habe versucht, die zufällige Grafik hinzuzufügen, und diese Teil-ID ist nicht vollständig. Tatsächlich gibt es einen Vorschlag zum Vergleichen bestimmter öffentlicher und angebotener Schlüssel, aber diese Variante ist nicht MITM-sicher: ssh-keyscan -t ecdsa xxx.xxx.xxx.xxx | ssh-keygen -lv -f - && ssh -X -o VisualHostKey = yes -i ~ / .ssh / key [email protected]
zeroconf
Ich habe Ihre Kommentare nicht gesehen, aber heute habe ich die gleiche Idee. Daher wird meine Antwort jetzt mit der Arbeitsversion für neuere OpenSSH-Versionen aktualisiert, einschließlich ASCII-Grafik.
Kepi