Existe-t-il un moyen par programmation dobtenir une empreinte digitale de clé de serveur SSH sans authentification ?
Jessaye ssh -v user@host false 2>&1 | grep "Server host key"
, mais cela se bloque en attendant un mot de passe si lauthentification par clé nest pas configurée.
Réponse
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 ssh-keyscan host | ssh-keygen -l -f /dev/stdin
beaucoup plus simple ne fonctionne pas)
Commentaires
Réponse
Jai récemment dû le faire moi-même alors jai 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 le fonctionnement de ces commandes et met en évidence certaines des différences de comportement entre les anciennes et les nouvelles versions des utilitaires OpenSSH.
Récupérer les clés dhôte publiques
La commande ssh-keyscan
a été développée pour que les utilisateurs puissent obtenir des clés dhôte publiques sans avoir besoin de sauthentifier auprès du serveur SSH. Depuis sa page de manuel:
ssh-keyscan
est un utilitaire permettant de rassembler les clés dhôte ssh publiques dun certain nombre de hôtes. Il a été conçu pour aider à créer et à vérifier les fichiersssh_known_hosts
.
Type de clé
Le type de clé à récupérer est spécifié à laide de loption -t
.
-
rsa1
(obsolète Protocole SSH version 1) -
rsa
-
dsa
-
ecdsa
(versions récentes dOpenSSH) -
ed25519
(versions récentes dOpenSSH)
Dans les versions modernes dOpenSSH, 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 les anciennes versions de ssh-keyscan
(avant OpenSSH version 5.1), le type de clé par défaut était le rsa1
obsolète (protocole SSH 1) donc les types de clés devraient être explicitement spécifiés:
ssh-keyscan -t rsa,dsa hostname
Obtenir les hachages dempreintes digitales des clés Base64
ssh-keyscan
imprime la clé dhôte du serveur SSH dans Format encodé en base64 . Pour le convertir en hachage dempreinte digitale, lutilitaire ssh-keygen
peut être utilisé avec son option -l
pour imprimer lempreinte digitale de la clé publique spécifiée.
Si vous utilisez Bash, Zsh (ou le shell Korn), la substitution de processus peut être utilisée pour un one-liner pratique:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Remarque : Avec les versions dOpenSSH antérieures à 7.2, les fonctions utilisées par ssh-keygen
pour lire ne géraient pas très bien les tubes nommés (FIFO), cette méthode ne fonctionnait donc pas, nécessitant ainsi lutilisation de fichiers temporaires.
Algorithmes de hachage
Versions récentes de ssh-keygen
print SHA256 hachages dempreintes digitales des clés. Pour obtenir les hachages MD5 des empreintes digitales des clés du serveur (ancien comportement), le -E
peut être utilisée pour spécifier lalgorithme de hachage:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Utilisation dun pipeline
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 dOpenSSH (depuis 7.2), un simple pipeline peut être utilisé car ssh-keygen
acceptera -
comme nom de fichier pour le flux dentrée standard, permettant une commande de pipeline sur une ligne.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
Commentaires
- Sympa et complet réponse, cest certainement mieux que davoir un fichier temporaire!Puis-je vous suggérer de fournir un TL; DR au début avec la version de substitution de processus, pour que les gens impatients le trouvent plus rapidement? 🙂
- Ne semble pas fonctionner sur Ubuntu 14.04 LTS; Jobtiens une erreur » / dev / fd / 63 nest pas un fichier de clé publique « . Le sous-processus fonctionne.
- @melleb Jai trouvé la même chose sur un système 12.04 auquel jai accès. Je soupçonne que
ssh-keygen
des anciennes versions dOpenSSH ont un problème de lecture à partir du FIFO / tube nommé. Je ‘ examinerai ceci (et mettre à jour ma réponse) quand jaurai du temps libre. - @melleb Après avoir passé mon temps à télécharger diverses versions de code source et en insérant des instructions de débogage
printf
dans la fonctiondo_fingerprint()
, jai trouvé quavec les versions dOpenSSH antérieures à 7.2, les fonctions utilisées parssh-keygen
pour lire les fichiers, ne gère pas très bien les tubes nommés (FIFO), donc la méthode de substitution de processus ne fonctionnera pas. - Cela fonctionne, mais si vous lutilisez pour vérifier une empreinte digitale, les utilisateurs doivent être conscients quil existe ‘ une condition de concurrence: lempreinte digitale que vous vérifiez avec cette commande nest ‘ pas nécessairement celle de la clé que vous récupérer, sauf si vous videz la clé avant dappeler ssh-keygen dessus.
Réponse
nmap
fournit cette capacité en utilisant le script ssh-hostkey
.
Pour renvoyer lempreinte 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 renvoyer tout ce qui précède:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Source: nmap docs
Commentaires
- Ces exemples supposent-ils que SSH est toujours en cours dexécution sur le port 22? Et si ssh écoute sur un port non standard?
- @MartinVegter (paraphrasant Guarin42, qui ne pourrait pas ‘ t comment 🙂 nmap a loption
-p
qui peut spécifier un port, par exemple-p 22000
. Il ‘ est également possible dutiliser loption-vv
pour augmenter la verbosité (quantité dinformations fournies)
Réponse
filezilla affiche clés hachées avec md5 en hexadécimal .
pour trouver ceci sur votre machine ubuntu linux , utilisez cette commande:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
note: remplacez « localhost » par lip de la machine que vous souhaitez vérifier.
Commentaires
- Cela a fonctionné pour moi sur Ubuntu 18, mais notez que vous obtiendrez des résultats de différence pour
localhost
127.0.0.1
oudomain.tld
. Vérifiez lempreinte de lURL qui vous intéresse ~!
Réponse
Voici un script shell (principalement Bourne shell mais en utilisant le mot-clé local
, qui est disponible dans la plupart des /bin/sh
) modernes que jai écrit pour le faire. Utilisez-le comme ssh-hostkey hostname
. Il affichera les empreintes digitales au format sha256 et md5 pour toutes les clés dhôte pour le nom dhôte ou ladresse IP donnés. 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 piping pour le rendre compatible avec les anciens packages OpenSSH (comme décrit dans dautres 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 "$@"
Commentaires
- Ceci est une belle démonstration dencapsulation doutils de niveau inférieur avec des options de ligne de commande. Inclut un bonus sur la façon dutiliser mémoire partagée
/dev/shm
que je ne savais pas si pratique à faire. Merci pour partage !
Réponse
Pour mon propre serveur, jutilise ceci:
ssh-keygen -l -E md5 -f <(cat /etc/ssh/ssh_host_*_key.pub) ssh-keygen -l -E sha256 -f <(cat /etc/ssh/ssh_host_*_key.pub)
Réponse
La réponse simple lorsque vous avez déjà accès au serveur est:
ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
Maintenant, vous nutilisez peut-être pas la clé RSA: si lors de la connexion, ssh
vous le dit
ECDSA lempreinte digitale clé est SHA256: XXXXX
Vous devez utiliser /etc/ssh/ssh_host_ecdsa_key.pub
à la place. (remarquez _ecdsa_ ). Une commande plus universelle répertoriant toutes les clés peut ainsi être construite ( source ):
for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done
Vous pouvez écrire la liste lors de la configuration du serveur, pour référence future.Une autre option consiste à les stocker dans des enregistrements DNS
Depuis la page de manuel ssh-keygen (1):
-l
Afficher lempreinte digitale du fichier de clé publique spécifié. Pour les clés RSA et DSA, ssh-keygen essaie de trouver le fichier de clé publique correspondant et imprime son empreinte digitale. Sil est combiné avec -v, une représentation visuelle ASCII de la clé est fournie avec lempreinte digitale.
-f
filename
Spécifie le nom de fichier du fichier de clé.
ssh-keygen -l -f - <(ssh-keyscan host)
le fait, cependant?ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
fonctionne comme prévu dans ssh-keygen 7.2 et supérieur. Il produit des lignes de commentaires vers STDERR qui peuvent être filtrées, comme indiqué dans la réponse er par Anthony Geoghegan oussh-keyscan host 2>/dev/null | ssh-keygen -l -f -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
) Si vous le souhaitez dans lancien format, indiquez-E md5
et vous ‘ verrez quelque chose comme2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33
.