Existe-t-il un moyen pour par programme obtenir une empreinte digitale de clé de serveur SSH sans authentification pour cela?
J'essaie ssh -v user@Host false 2>&1 | grep "Server Host key"
, mais cela se bloque en attendant un mot de passe si l'authentification par clé n'est pas configurée.
Vous pouvez le faire en combinant ssh-keyscan
et ssh-keygen
:
$ file=$(mktemp)
$ ssh-keyscan Host > $file 2> /dev/null
$ ssh-keygen -l -f $file
521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef Host (ECDSA)
4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d Host (RSA)
$ rm $file
(malheureusement, le plus simple ssh-keyscan Host | ssh-keygen -l -f /dev/stdin
ne marche pas)
J'ai récemment dû le faire moi-même, j'ai donc pensé ajouter une réponse qui montre comment cela peut être fait (avec les versions de OpenSSH 7.2 ou plus récent) sur une ligne en utilisant la substitution de processus:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Le texte suivant explique comment ces commandes fonctionnent et met en évidence certaines des différences de comportement entre les versions plus anciennes et plus récentes des utilitaires OpenSSH.
La commande ssh-keyscan
A été développée pour que les utilisateurs puissent obtenir des clés d'hôte publiques sans avoir à s'authentifier auprès du serveur SSH. Depuis sa page de manuel:
ssh-keyscan
Est un utilitaire pour rassembler les clés d'hôte ssh publiques d'un certain nombre d'hôtes. Il a été conçu pour faciliter la création et la vérification des fichiersssh_known_hosts
.
Le type de clé à récupérer est spécifié à l'aide de l'option -t
.
rsa1
(Obsolète SSH Protocol version 1)rsa
dsa
ecdsa
(versions récentes d'OpenSSH)ed25519
(Versions récentes d'OpenSSH)Dans les versions OpenSSH modernes, les types de clés par défaut à récupérer sont rsa
(depuis la version 5.1), ecdsa
(depuis la version 6.0) et ed25519
(Depuis la version 6.7).
Avec anciennes versions de ssh-keyscan
(Avant OpenSSH version 5.1), le type de clé par défaut était le rsa1
Périmé (Protocole SSH 1), les types de clés devraient donc être explicitement spécifiés:
ssh-keyscan -t rsa,dsa hostname
ssh-keyscan
Imprime la clé Host du serveur SSH au format encodé en Base64. Pour le convertir en un hachage d'empreinte digitale, l'utilitaire ssh-keygen
Peut être utilisé avec son option -l
Pour imprimer l'empreinte digitale de la clé publique spécifiée.
Si vous utilisez Bash, Zsh (ou le Korn Shell), substitution de processus peut être utilisé pour un one-liner pratique:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Remarque: Avec les versions d'OpenSSH antérieures à 7.2, les fonctions utilisées par ssh-keygen
Pour lire les fichiers, ne géraient pas très bien les canaux nommés (FIFO), donc cette méthode ne fonctionnerait pas, nécessitant ainsi l'utilisation de fichiers temporaires.
Les versions récentes de ssh-keygen
Impriment SHA256 les empreintes digitales des touches. Pour obtenir les hachages MD5 des empreintes digitales des clés du serveur (l'ancien comportement), l'option -E
Peut être utilisée pour spécifier l'algorithme de hachage:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Si vous utilisez un shell POSIX (tel que dash
) qui ne comporte pas de substitution de processus, les autres solutions utilisant des fichiers temporaires fonctionneront. Cependant, avec les versions plus récentes d'OpenSSH (depuis 7.2), un simple pipeline peut être utilisé car ssh-keygen
Acceptera -
Comme nom de fichier pour le flux d'entrée standard, permettant une commande de pipeline sur une ligne.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
nmap
fournit cette capacité en utilisant le ssh-hostkey
script.
Pour renvoyer l'empreinte hexadécimale de la clé:
$ nmap [SERVER] --script ssh-hostkey
Pour renvoyer le contenu de la clé:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
Pour renvoyer la bulle visuelle de la clé
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'
Pour retourner tout ce qui précède:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Source: documents nmap
filezilla affiche les clés hachées avec md5 au format hexadécimal .
pour le trouver sur votre machine ubuntu linux utilisez cette commande:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
remarque: remplacez "localhost" par l'ip de la machine que vous souhaitez vérifier.
Voici un script Shell (principalement Bourne Shell mais utilisant le mot clé local
, qui est disponible dans la plupart des versions modernes /bin/sh
) J'ai écrit pour faire ça. Utilisez-le comme ssh-hostkey hostname
. Il montrera les empreintes digitales au format sha256 et md5 pour toutes les clés d'hôte pour le nom d'hôte ou l'adresse IP donné. Vous pouvez également spécifier manuellement "md5
" ou "sha256
"comme deuxième argument pour afficher uniquement ce format particulier.
Il utilise un fichier temporaire au lieu de la tuyauterie pour le rendre compatible avec les anciens packages OpenSSH (comme décrit dans d'autres réponses). Le fichier temporaire utilise /dev/shm
(mémoire partagée) si disponible.
#!/bin/sh
usage () {
printf '%s\n' "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]"
}
ssh_hostkey () {
local Host="$1"
local fprinthash="$2"
local tmp=
case "$Host" in
-h|--help|'')
usage >&2
return 1
;;
esac
case "$fprinthash" in
md5|sha256|'') true;;
*)
usage >&2
printf '%s\n' "Fingerprint hash may be 'md5' or 'sha256'" >&2
return 2
;;
esac
if test -d /dev/shm
then tmp="$(mktemp -d -p /dev/shm)"
else tmp="$(mktemp -d)"
fi
trap 'trap - INT TERM EXIT; rm -rf "$tmp"' INT TERM EXIT
ssh-keyscan "$Host" > "$tmp/f" 2> /dev/null
case "$fprinthash" in
sha256|'') ssh-keygen -l -f "$tmp/f" 2> /dev/null;;
esac
case "$fprinthash" in
md5|'') ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;;
esac
trap - INT TERM EXIT
rm -rf "$tmp" > /dev/null 2>&1
}
ssh_hostkey "$@"