web-dev-qa-db-fra.com

Obtenir l'empreinte digitale de la clé du serveur SSH

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.

89
goncalopp

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)

74
Andreas Wiese

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.

Récupérer les clés d'hôte publiques

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 fichiers ssh_known_hosts.

Type de clé

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

Obtenez des hachages d'empreintes digitales de clés Base64

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.

Algorithmes de hachage

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)

Utiliser un 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 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 -
63

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

21
Creek

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.

3
Cameron

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 "$@"
1
ejm