Gibt es eine Möglichkeit, programmgesteuert einen Fingerabdruck des SSH-Serverschlüssels abzurufen, ohne dazu?

Ich versuche ssh -v user@host false 2>&1 | grep "Server host key", aber dies hängt vom Warten auf ein Kennwort ab, wenn keine schlüsselbasierte Authentifizierung eingerichtet ist.

Antwort

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 funktioniert das viel einfachere ssh-keyscan host | ssh-keygen -l -f /dev/stdin nicht)

Kommentare

  • Vielleicht ssh-keygen -l -f - <(ssh-keyscan host) jedoch?
  • OpenSSH > = 7.2 ssh-keyscan kann von stdin lesen: ssh-keyscan host | ssh-keygen -lf -
  • Führen Sie einfach Folgendes aus: ssh-keygen -l -f <(ssh-keyscan host)
  • ssh-keygen -l -f - funktioniert in ssh-keygen 7.2 und höher wie erwartet. Es werden einige Kommentarzeilen zu STDERR erstellt, die herausgefiltert werden können, wie in der Antwort erwähnt er von Anthony Geoghegan oder ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Neue Versionen von openssh (mindestens 7.2) zeigen den Fingerabdruck als SHA256 an (Beispiel: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Wenn Sie es im alten Format möchten, geben Sie -E md5 an und ‚ sehen Sie so etwas wie 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

Antwort

Ich musste dies kürzlich selbst tun, also dachte ich, ich Fügen Sie eine Antwort hinzu, die zeigt, wie dies (mit Versionen von OpenSSH 7.2 oder neuer ) in einer Zeile mithilfe der Prozessersetzung durchgeführt werden kann:

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. Auf der Manpage:

ssh-keyscan ist ein Dienstprogramm zum Sammeln der öffentlichen SSH-Hostschlüssel einer Reihe von Gastgeber. Es wurde entwickelt, um das Erstellen und Überprüfen von ssh_known_hosts -Dateien zu unterstützen.

Schlüsseltyp

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

  • rsa1 (veraltet) SSH-Protokoll Version 1)
  • rsa
  • dsa
  • ecdsa (aktuelle Versionen von OpenSSH)
  • ed25519 (aktuelle Versionen von OpenSSH)

In modernen OpenSSH-Versionen sind die Standard -Schlüsseltypen, die abgerufen werden sollen, rsa (seit Version 5.1), ecdsa (seit Version 6.0) und ed25519 (seit Version 6.7).

Mit älteren Versionen von ssh-keyscan (vor OpenSSH Version 5.1) war der Standard -Schlüsseltyp der veraltete rsa1 (SSH-Protokoll 1) Die Schlüsseltypen müssten explizit angegeben werden:

ssh-keyscan -t rsa,dsa hostname 

Fingerabdruck-Hashes von Base64-Schlüsseln abrufen

ssh-keyscan druckt den Hostschlüssel des SSH-Servers in Base64-codiertes Format. 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 die Prozesssubstitution für einen praktischen Einzeiler verwendet werden:

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

Hinweis : Bei Versionen von OpenSSH vor 7.2 werden die Funktionen von ssh-keygen zum Lesen verwendet Dateien haben mit Named Pipes (FIFOs) nicht sehr gut umgegangen, sodass diese Methode nicht funktioniert und daher temporäre Dateien verwendet werden müssen.

Hashing-Algorithmen

Neueste Versionen von ssh-keygen print SHA256 Fingerabdruck-Hashes der Tasten. Um MD5 Hashes der Serverschlüssel-Fingerabdrücke (das alte Verhalten) zu erhalten, wird die -E kann der Hash-Algorithmus angegeben werden:

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

Verwenden einer Pipeline

Bei Verwendung einer POSIX-Shell (z. B. dash) ohne Prozessersetzung. Die anderen Lösungen mit temporären Dateien funktionieren. Bei neueren Versionen von OpenSSH (seit 7.2) kann jedoch eine einfache Pipeline verwendet werden, da ssh-keygen - als Dateinamen für das akzeptiert Standardeingabestream, der einen einzeiligen Pipeline-Befehl zulässt.

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

Kommentare

  • Schön und gründlich Antwort, das ist sicherlich besser als eine temporäre Datei!Darf ich vorschlagen, dass Sie zu Beginn der Prozessersetzungsversion eine TL; DR bereitstellen, damit ungeduldige Leute sie schneller finden? 🙂
  • Scheint unter Ubuntu 14.04 LTS nicht zu funktionieren; Ich erhalte die Fehlermeldung “ / dev / fd / 63 ist keine Datei mit öffentlichem Schlüssel „. Der Unterprozess funktioniert.
  • @melleb Ich habe dasselbe auf einem 12.04-System gefunden, auf das ich Zugriff habe. Ich vermute, dass ssh-keygen aus älteren Versionen von OpenSSH Probleme beim Lesen aus dem FIFO / Named Pipe hat. Ich ‚ werde dies untersuchen (und meine Antwort aktualisieren), wenn ich etwas Freizeit habe.
  • @melleb Nachdem ich meine Zeit damit verbracht habe, verschiedene Quellcode-Releases herunterzuladen Beim Einfügen von Debugging-Anweisungen printf in die Funktion do_fingerprint() stellte ich fest, dass bei Versionen von OpenSSH vor 7.2 die von ssh-keygen zum Lesen von Dateien hat Named Pipes (FIFOs) nicht sehr gut verarbeitet, sodass die Prozessersetzungsmethode nicht funktioniert.
  • Dies funktioniert, aber wenn Sie sie zum Überprüfen eines Fingerabdrucks verwenden, Benutzer sollten sich darüber im Klaren sein, dass ‚ eine Racebedingung ist: Der Fingerabdruck, den Sie mit diesem Befehl überprüfen, ist nicht unbedingt der des Schlüssels, den Sie verwenden. ‚ Abrufen, es sei denn, Sie geben den Schlüssel aus, bevor Sie ssh-keygen darauf aufrufen.

Antwort

nmap bietet diese Funktion mithilfe des Skripts ssh-hostkey.

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 

So geben Sie die visuelle Blase des Schlüssels zurück

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

So geben Sie alle oben genannten Punkte zurück:

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

Quelle: nmap docs

Kommentare

  • Gehen diese Beispiele davon aus, dass SSH immer auf Port 22 ausgeführt wird? Was ist, wenn ssh einen nicht standardmäßigen Port abhört?
  • @MartinVegter (umschrieben Guarin42, der ‚ t Kommentar 🙂 nmap verfügt über die Option -p, mit der ein Port angegeben werden kann, z. B. -p 22000 ‚ Es ist auch möglich, die Option -vv zu verwenden, um die Ausführlichkeit (Menge der angegebenen Informationen) zu erhöhen.

Antwort

filezilla zeigt Schlüssel an, die mit md5 hexadezimal Format.

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.

Kommentare

  • Dies hat unter Ubuntu 18 bei mir funktioniert, aber beachten Sie, dass Sie unterschiedliche Ergebnisse für localhost 127.0.0.1 erhalten oder domain.tld. Überprüfen Sie den Fingerabdruck auf die URL, mit der Sie sich befassen ~!

Antwort

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. Ich habe dafür geschrieben. 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 angeben „oder“ sha256 „als zweites Argument, um nur dieses bestimmte Format anzuzeigen.

Es wird eine temporäre Datei anstelle von Piping verwendet, um sie mit älteren OpenSSH-Paketen kompatibel zu machen (wie in anderen Antworten beschrieben). Die temporäre Datei verwendet /dev/shm (gemeinsam genutzter 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 "$@" 

Kommentare

  • Dies ist eine nette Demo zum Umschließen von Werkzeugen der unteren Ebene mit Befehlszeilenoptionen. Enthält einen Bonus für die Verwendung Shared Memory /dev/shm, von dem ich nie wusste, dass es so bequem ist. Vielen Dank für das Teilen !

Antwort

Für meinen eigenen Server verwende ich Folgendes:

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) 

Antwort

Die einfache Antwort , wenn Sie bereits Zugriff haben zum Server lautet:

ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub 

Jetzt verwenden Sie möglicherweise nicht den RSA-Schlüssel: Wenn beim Verbinden ssh teilt Ihnen mit,

ECDSA Schlüsselfingerabdruck ist SHA256: XXXXX

Sie müssen stattdessen /etc/ssh/ssh_host_ecdsa_key.pub verwenden. (Beachten Sie _ecdsa_ ). Auf diese Weise kann ein universellerer Befehl erstellt werden, der alle Schlüssel auflistet ( source ):

for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done 

Sie können die Liste beim Einrichten des Servers zur späteren Bezugnahme aufschreiben.Eine andere Möglichkeit besteht darin, sie in DNS-Einträgen zu speichern


Auf der Manpage ssh-keygen (1):

-l Fingerabdruck der angegebenen öffentlichen Schlüsseldatei anzeigen. Für RSA- und DSA-Schlüssel versucht ssh-keygen, die passende öffentliche Schlüsseldatei zu finden, und druckt ihren Fingerabdruck. In Kombination mit -v wird eine visuelle ASCII-Grafikdarstellung des Schlüssels mit dem Fingerabdruck geliefert.

-f filename Gibt den Dateinamen der Schlüsseldatei an.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.