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

  • Peut-être que ssh-keygen -l -f - <(ssh-keyscan host) le fait, cependant?
  • OpenSSH > = 7.2 ssh-keyscan est capable de lire depuis stdin: ssh-keyscan host | ssh-keygen -lf -
  • Il suffit de faire: 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 ou ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Les nouvelles versions de openssh (7.2 au moins) afficheront lempreinte digitale sous la forme SHA256 (ex: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Si vous le souhaitez dans lancien format, indiquez -E md5 et vous ‘ verrez quelque chose comme 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

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 fichiers ssh_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 fonction do_fingerprint(), jai trouvé quavec les versions dOpenSSH antérieures à 7.2, les fonctions utilisées par ssh-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 ou domain.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é.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *