SHA256 SSH-Fingerabdruck vom Client angegeben, aber nur MD5-Fingerabdruck für Server bekannt

Wenn Sie eine Verbindung zu einem neuen/unbekannten Server herstellen (mit kürzlich geöffnetem 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)?

Normalerweise werden jedoch Fingerabdrücke für den Server in dieser 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 veranlassen, einen SHA256-Fingerabdruck bereitzustellen)?

 130
Author: Gaff, 2015-06-18

6 answers

Zuvor wurde der Fingerabdruck als hexed md5 Hash angegeben. Beginnend mit OpenSSH 6.8 wird der Fingerabdruck nun als base64 SHA256 angezeigt (standardmäßig). Sie können diese nicht direkt vergleichen.

Sie haben auch eine neue Konfigurationsoption FingerprintHash hinzugefügt. Sie können

FingerprintHash md5

In Ihrem ~/.ssh/config auf die alte (weniger sicher) Standard zurückzukehren oder einfach nur diese Option für den einmaligen Gebrauch verwenden:

ssh -o FingerprintHash=md5 example.org

Was den Fingerabdruck als

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

Hoffentlich server admins bieten beide Arten von Fingerabdrücken in naher Zukunft.

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 generieren, wie im OpenSSH-Kochbuch angegeben:

Rufen Sie den Schlüssel ab:

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

Generieren Sie die hash:

  • stellen Sie sicher, dass Sie nur eine Zeile/einen Typ haben, löschen Sie also entweder alle anderen in key.pub oder führen Sie ssh-keyscan -t rsa example.org > key.pub
  • ssh-keygen -l -f key.pub (Standard-Hash, abhängig von OpenSSH-Version)
  • ssh-keygen -l -f key.pub -E md5 (md5 auf aktuelle 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 mit awk '{print $3}' für neuere Versionen von ssh-keyscan starten, da sich das Format geändert hat)
 164
Author: JonnyJD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-10-31 17:29:47

Hat gerade ein kleines Bash-Skript erstellt, das eine Tabelle mit Fingerabdrücken für alle auf dem Server zulässigen Schlüsselchiffren (gemäß /etc/ssh/sshd_config) in SSH-256 und MD5 algo druckt. 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]-----+

Skript wird auch auf Servern mit SSH Version unter 6.8 ausgeführt (bevor die Option -E md5 hinzugefügt wurde).

Bearbeiten:Aktualisierte Versionen für noch neuere Versionen von SSH, die Standard-Chiffren jetzt mit ASCII-Bildern unterstützen.

#!/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 ziemlich drucken mit informationen aus der Antwort von JonnyJD. Danke.

 28
Author: Kepi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-03-11 19:54:02

Es stellt sich heraus, dass ssh-keygen (irgendwann nach Version 6.6; vermutlich 6.8) eine -E md5 Option hat, die dazu führt, dass der Fingerabdruck als MD5-Fingerabdruck ausgedruckt wird. Wenn Sie also die öffentliche Schlüsseldatei des Servers unabhängig voneinander abrufen können, können Sie sie ssh-keygen -E md5 -l -f ssh_host_rsa_key.pub und Ihren vertrauten Fingerabdruck abrufen.

 7
Author: Greg Minshall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-01-08 07:00:18

Der folgende Einzeiler funktioniert (zumindest) auf 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
 3
Author: Marinos An,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-04-30 09:54:10

Versucht zu ändern, 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, das Problem zu beheben (auch bereinigen). Es wäre schön, sha256 - und MD5-Zufallskunstbilder nebeneinander zu haben, um den Speicherplatz effizienter zu nutzen. Ich habe auch md5-und sha256-Befehle geändert, da die ursprünglichen für mich nicht funktionierten (wahrscheinlich zu neues System) - nur sha256 wurde am Ende mit dem Zeichen "=" in die Tabelle eingefügt, was nicht teil der tatsächlichen fingerabdruck und konnte es nicht entfernen.

(leider konnte ich nicht kommentieren, da ich mich registriert habe vor kurzem)

 1
Author: zeroconf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-07-02 23:36:50

, mochte ich Kepi Idee, aber leider geht das nicht funktioniert für mich nicht mehr so ich liest das Skript und es funktioniert, auch habe ich es vereinfacht und entfernt die ASCII-art wie ich brauchen das nicht.

Um mein Skript direkt auszuführen, führen Sie Folgendes aus:

curl -sS https://raw.githubusercontent.com/caballerofelipe/scripts/master/ssh/ssh_fingerprint.sh | bash

Hier ist mein Skript (könnte sich in Zukunft in GitHub ändern):

#!/bin/bash

# To run this file directly from a computer without downloading run this:
# curl -sS https://raw.githubusercontent.com/caballerofelipe/scripts/master/ssh/ssh_fingerprint.sh | bash

# Used to show SSH fingerprints
# Inspired by this post: http://superuser.com/a/1030779/369045

# standard sshd config path
SSH_DIR=/etc/ssh/

# Helper functions
function tablize {
    printf "| %-7s | %-7s | %-47s |\n" $1 $2 $3
}
LINE="+---------+---------+-------------------------------------------------+"

# Header
echo $LINE
tablize "Cipher" "Algo" "Fingerprint"
echo $LINE

# Fingerprints
for i in $(ls $SSH_DIR/*.pub); do
    md5_result=$(ssh-keygen -l -f $i -E md5)
    sha256_result=$(ssh-keygen -l -f $i -E sha256)
    cipher=$(echo $md5_result | sed 's/.*(//' | sed 's/)[^)]*//')
    md5=$(echo $md5_result | awk '{print $2}' | sed 's/^[^:]*://g')
    sha256=$(echo $sha256_result | awk '{print $2}' | sed 's/^[^:]*://g')
    tablize $cipher MD5 $md5
    tablize $cipher SHA-256 $sha256
    echo $LINE
done
 1
Author: loco.loop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-03-14 22:00:51