it-swarm.com.de

Fingerabdruck des SSH-Serverschlüssels abrufen

Gibt es eine Möglichkeit, programmgesteuert einen SSH-Serverschlüssel-Fingerabdruck zu erhalten ohne sich zu authentifizieren dazu?

Ich versuche ssh -v [email protected] false 2>&1 | grep "Server Host key", aber dies hängt und wartet auf ein Passwort, wenn die schlüsselbasierte Authentifizierung nicht eingerichtet ist.

89
goncalopp

Sie können dies tun, indem Sie ssh-keyscan und 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

(leider das viel einfachere ssh-keyscan Host | ssh-keygen -l -f /dev/stdin funktioniert nicht)

74
Andreas Wiese

Ich musste dies kürzlich selbst tun, also dachte ich, ich würde eine Antwort hinzufügen, die zeigt, wie dies (mit Versionen von OpenSSH 7.2 oder neuer) in einer Zeile mithilfe der Prozessersetzung möglich ist:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)

Im folgenden Text wird die Funktionsweise dieser Befehle erläutert und einige der Unterschiede im Verhalten zwischen älteren und neueren Versionen der OpenSSH-Dienstprogramme hervorgehoben.

Öffentliche Hostschlüssel abrufen

Der Befehl ssh-keyscan Wurde entwickelt, damit Benutzer öffentliche Hostschlüssel erhalten können, ohne sich beim SSH-Server authentifizieren zu müssen. Von seiner Manpage:

ssh-keyscan Ist ein Dienstprogramm zum Sammeln der öffentlichen ssh-Hostschlüssel einer Reihe von Hosts. Es wurde entwickelt, um das Erstellen und Überprüfen von ssh_known_hosts - Dateien zu erleichtern.

Schlüsselart

Der Typ des abzurufenden Schlüssels wird mit der Option -t Angegeben.

  • rsa1 (Veraltete SSH-Protokollversion 1)
  • rsa
  • dsa
  • ecdsa (aktuelle Versionen von OpenSSH)
  • ed25519 (Neueste Versionen von OpenSSH)

In modernen OpenSSH-Versionen sind die abzurufenden Schlüsseltypen Standardrsa (seit Version 5.1), ecdsa (seit Version 6.0) und ed25519 (Seit Version 6.7).

Mit ältere Versionen von ssh-keyscan (Vor OpenSSH Version 5.1) war der Schlüsseltyp Standard der veraltete rsa1 (SSH-Protokoll 1), daher müssten die Schlüsseltypen explizit angegeben werden:

ssh-keyscan -t rsa,dsa hostname

Holen Sie sich Fingerabdruck-Hashes von Base64-Schlüsseln

ssh-keyscan Gibt den Host-Schlüssel des SSH-Servers im Format Base64-codiert aus. Um dies in einen Fingerabdruck-Hash zu konvertieren, kann das Dienstprogramm ssh-keygen Mit der Option -l Verwendet werden, um den Fingerabdruck des angegebenen öffentlichen Schlüssels zu drucken.

Wenn Sie Bash, Zsh (oder die Korn-Shell) verwenden, kann Prozessersetzung für einen handlichen Einzeiler verwendet werden:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)

Hinweis: Mit OpenSSH-Versionen vor 7.2 haben die von ssh-keygen Zum Lesen von Dateien verwendeten Funktionen Named Pipes (FIFOs) nicht sehr gut verarbeitet, sodass diese Methode nicht funktioniert. Dies erfordert die Verwendung temporärer Dateien.

Hashing-Algorithmen

Aktuelle Versionen von ssh-keygen Drucken SHA256 Fingerabdruck-Hashes der Schlüssel. Um MD5 - Hashes der Serverschlüssel-Fingerabdrücke (das alte Verhalten) abzurufen, kann der Hash-Algorithmus mit der Option -E Angegeben werden:

ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)

Verwenden einer Pipeline

Wenn Sie eine POSIX-Shell (z. B. dash) verwenden, die keine Prozessersetzung bietet, funktionieren die anderen Lösungen mit temporären Dateien. Bei neueren Versionen von OpenSSH (seit 7.2) kann jedoch eine einfache Pipeline verwendet werden, da ssh-keygen- Als Dateinamen für den Standardeingabestream akzeptiert und einen einzeiligen Pipeline-Befehl zulässt.

ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
63

nmap bietet diese Fähigkeit mithilfe von ssh-hostkey Skript.

So geben Sie den hexadezimalen Fingerabdruck des Schlüssels zurück:

$ nmap [SERVER] --script ssh-hostkey

So geben Sie den Inhalt des Schlüssels zurück:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full

Rückgabe der visuellen Blase des Schlüssels

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey='visual bubble'

Um alle oben genannten Punkte zurückzugeben:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all

Quelle: nmap docs

21
Creek

filezilla zeigt Schlüssel an, die mit md5 im hexadezimalen Format gehasht wurden.

um dies auf Ihrem Ubuntu Linux Computer zu finden, verwenden Sie diesen Befehl:

ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)

hinweis: Ersetzen Sie "localhost" durch die IP des Computers, den Sie überprüfen möchten.

3
Cameron

Hier ist ein Shell-Skript (hauptsächlich Bourne Shell, aber mit dem Schlüsselwort local, das in den meisten modernen /bin/sh Verfügbar ist), das ich dazu geschrieben habe. Verwenden Sie es wie ssh-hostkey hostname. Es werden sowohl die Fingerabdrücke im sha256- als auch im md5-Format für alle Hostschlüssel für den angegebenen Hostnamen oder die angegebene IP-Adresse angezeigt. Sie können auch manuell "md5" Oder "sha256" Als zweites Argument angeben, um nur dieses bestimmte Format anzuzeigen.

Es verwendet eine temporäre Datei anstelle von Piping, um sie mit älteren OpenSSH-Paketen kompatibel zu machen (wie in anderen Antworten beschrieben). Die temporäre Datei verwendet /dev/shm (Gemeinsamer Speicher), falls verfügbar.

#!/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 "[email protected]"
1
ejm