147 votes

empreinte SHA256 ssh donnée par le client mais seulement empreinte md5 connue pour le serveur

Lors de la connexion à un serveur nouveau/inconnu (avec un OpenSSH récent), par exemple :

ssh example.com

Vous obtenez l'empreinte digitale comme ci-dessous :

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

Cependant, les empreintes digitales sont généralement données pour le serveur dans ce formulaire :

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

Comment puis-je vérifier l'authenticité (sans embêter les administrateurs du serveur pour qu'ils fournissent une empreinte SHA256) ?

183voto

JonnyJD Points 3513

Auparavant, l'empreinte digitale était donnée sous la forme d'un hash md5 hexé. À partir de OpenSSH 6.8 l'empreinte digitale est maintenant affichée en base64 SHA256 (par défaut). Vous ne pouvez pas les comparer directement.

Ils ont également ajouté une nouvelle option de configuration FingerprintHash . Vous pouvez mettre

FingerprintHash md5

dans votre ~/.ssh/config pour revenir à l'ancien système ( moins sécurisé ) par défaut ou utilisez simplement cette option pour un usage unique :

ssh -o FingerprintHash=md5 example.org

ce qui donnerait l'empreinte digitale suivante

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

Espérons que les administrateurs de serveurs fournissent les deux types d'empreintes digitales dans un avenir proche.

EDIT :

Comme indiqué dans le Forums Arch Linux il existe également une troisième option :

Host example.org
    FingerprintHash md5

EDIT :

Vous pouvez générer le hachage d'une clé arbitraire telle qu'indiquée sur le fichier Livre de recettes OpenSSH :

Récupérer la clé :

  • télécharger la clé avec ssh-keyscan example.org > key.pub
  • ou : trouver les clés sur le serveur dans /etc/ssh

Générer le hachage :

  • assurez-vous que vous n'avez qu'une seule ligne/un seul type, donc supprimez toutes les autres dans key.pub ou courir ssh-keyscan -t rsa example.org > key.pub
  • ssh-keygen -l -f key.pub (hachage par défaut, selon la version d'OpenSSH)
  • ssh-keygen -l -f key.pub -E md5 (md5 sur OpenSSH actuel)
  • awk '{print $2}' ssh_host_rsa_key.pub | base64 -d | sha256sum -b | awk '{print $1}' | xxd -r -p | base64 (sha256 sur l'ancien OpenSSH)
  • (Vous devrez peut-être commencer la ligne par awk '{print $3}' pour les versions plus récentes de ssh-keyscan car le format a changé)

36voto

Kepi Points 465

Je viens de créer un petit script bash script qui imprimera une table avec les empreintes digitales de tous les chiffres-clés autorisés sur le serveur (selon la norme /etc/ssh/sshd_config ) dans les deux SSH-256 y MD5 algo. Voici un exemple de sortie :

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

script s'exécutera également sur les serveurs avec SSH version ci-dessous 6.8 (avant -E md5 a été ajoutée).

Edition : Mise à jour des versions pour les versions encore plus récentes de SSH qui ont changé de chiffrement par défaut avec maintenant le support des images 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

C'est juste une impression qui utilise les informations de JonnyJD Réponse de la Commission. Merci.

10voto

Greg Minshall Points 189

Il s'avère que ssh-keygen (quelque temps après la version 6.6 ; probablement 6.8) a une fonction -E md5 qui lui permettra d'imprimer l'empreinte digitale sous forme d'empreinte md5. Ainsi, si vous pouvez récupérer de manière indépendante le fichier de clé publique du serveur, vous pouvez le transmettre à ssh-keygen -E md5 -l -f ssh_host_rsa_key.pub et obtenir votre empreinte digitale familière.

3voto

sai_ekkaldevi Points 41

La phrase suivante fonctionne (au moins) sur Ubuntu 16.04,18.04 / Centos >= 7

(Testé avec des serveurs : 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

2voto

loco.loop Points 173

J'aimais l'idée de Kepi mais malheureusement cela ne fonctionne plus pour moi donc j'ai revu le script et l'ai fait fonctionner, je l'ai aussi simplifié et supprimé l'art ASCII car je n'en ai pas besoin.

Pour exécuter mon script directement exécuter :

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

Voici mon script (qui pourrait changer dans le futur en GitHub ):

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X