Fingerabdruck des PEM-SSH-Schlüssels

30

Ich habe eine PEM-Datei, die ich einem laufenden ssh-Agenten hinzufüge:

$ file query.pem
query.pem: PEM RSA private key

$ ssh-add ./query.pem
Identity added: ./query.pem (./query.pem)

$ ssh-add -l | grep query
2048 ef:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ./query.pem (RSA)

Wie kann ich den Fingerabdruck des Schlüssels (der in ssh-agent angezeigt wird) direkt aus der Datei abrufen? Ich weiß, ssh-keygen -l -f some_keyfunktioniert für "normale" SSH-Schlüssel, aber nicht für PEM-Dateien.

Wenn ich ssh-keygen in der .pem-Datei versuche, erhalte ich:

$ ssh-keygen -l -f ./query.pem                                             
key_read: uudecode PRIVATE KEY----- failed
key_read: uudecode PRIVATE KEY----- failed
./query.pem is not a public key file.

Dieser Schlüssel beginnt mit:

-----BEGIN RSA PRIVATE KEY-----
MIIEp.... etc.

im Gegensatz zu einem "normalen" privaten Schlüssel, der wie folgt aussieht:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E15F2.... etc.
unbekannte
quelle
Warum denkst du, dass es bei PEM-Dateien nicht funktioniert? Welchen Fehler bekommen Sie, wenn Sie es versuchen? Eine .ssh/id_rsavon OpenSSH mit allen Standardeinstellungen erstellte Datei ist eine PEM-Datei. Die privaten Schlüssel sind standardmäßig PEM-codiert. Tatsächlich können Sie RSA-Schlüssel verwenden, die Sie mit OpenSSL direkt mit OpenSSH generieren.
Zoredache
aktualisierte Beschreibung mit Ausgabe von ssh-keygen auf der .pem
Unknown
@Zoredache: Vor 7.2 (2016, nach diesem Q) ssh-keygen -lkann eine Privatekey-Datei nicht gelesen werden, obwohl andere ssh-keygen(und ssh*) Operationen dies tun. Bei der ssh-keygen Generierung eines Schlüssels werden jedoch sowohl die private Schlüsseldatei id_rsa als auch eine entsprechende publickey-Datei mit .pubhinzugefügtem Schlüssel geschrieben id_rsa.pub. Ältere Benutzer ssh-keygen -l werden versuchen .pub, den von Ihnen angegebenen Dateinamen zu ergänzen und diese publickey-Datei zu lesen.
Dave_Thompson_085

Antworten:

34

Wenn Sie den Fingerabdruck Ihrer verlorenen öffentlichen Schlüsseldatei abrufen möchten, können Sie ihn aus der privaten Schlüsseldatei wiederherstellen :

$ ssh-keygen -yf path/to/private_key_file > path/to/store/public_key_file

Dann können Sie den öffentlichen Fingerabdruck ermitteln:

$ ssh-keygen -lf path/to/store/public_key_file
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@host (RSA)

Auf einigen neueren Systemen wird der SHA256-Fingerabdruck des Schlüssels gedruckt. Sie können den MD5-Fingerabdruck des Schlüssels (das Doppelpunktformular) mit der folgenden Option drucken -E:

$ ssh-keygen -E md5 -lf path/to/store/public_key_file
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)

Oder als eine Befehlszeile :

$ ssh-keygen -yf /etc/ssh/ssh_host_ecdsa_key | ssh-keygen -E md5 -lf -
2048 MD5:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx user@host (RSA)
ominug
quelle
@ MikeDs Antwort ist eigentlich die "richtige" Antwort für das, wonach das OP gesucht hat (und wonach ich gesucht habe). AWS stellt den Fingerabdruck in dem von ihm angezeigten Format bereit, wobei die Ziffernpaare durch Doppelpunkte getrennt sind. Seine Lösung (von der bereitgestellten AWS-Seite übernommen) generiert auf dieselbe Weise auch den Fingerabdruck, sodass Sie ihn korrekt überprüfen können.
Mike Williamson
50

AWS bietet unter " Überprüfen des Fingerabdrucks Ihres Schlüsselpaars " zwei Einzeiler, mit denen das Problem behoben werden kann. Dies hängt davon ab, wie Ihr Schlüssel erstellt wurde.

Wenn Sie Ihr Schlüsselpaar mit AWS erstellt haben:

$ openssl pkcs8 -in query.pem -inform PEM -outform DER -topk8 -nocrypt | openssl sha1 -c
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

Oder, wenn Sie Ihr Schlüsselpaar mit einem Drittanbieter-Tool erstellt haben:

$ openssl rsa -in query.pem -pubout -outform DER | openssl md5 -c
writing RSA key
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

(Fingerabdrücke in der obigen Ausgabe korrigiert)

Mike D
quelle
6

Hier ist ein Einzeiler, der tun sollte, was Sie wollen, ohne dass lokal eine öffentliche Schlüsseldatei erstellt werden muss.

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y )
2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

Hierbei wird die Zeichenfolge bash here <<<verwendet, um stdin als reguläre Datei ( /dev/stdin) und nicht als Pipe zur Verfügung zu haben, da ssh-keygennur eine Datei bearbeitet wird.

Ab Release 7.2 von openssh ssh-keygen werden Fingerabdrücke von Standardeingaben unterstützt:

  • ssh-keygen (1): Fingerabdruck von Standardeingabe erlauben, zB "ssh-keygen -lf -"

Beachten Sie, dass dieser Befehl mit privaten Schlüsseln abbricht, die eine Passphrase verwenden und keinen Agenten verwenden. Es sollte mit PEM-Dateien funktionieren, die von AWS oder OpenStack generiert wurden und keine Passphrasen verwenden.

Weitere Informationen finden Sie unter https://stackoverflow.com/questions/2635360/ssh-keygen-accepting-stdin .

htaccess
quelle
Die Release Notes haben aber laut Quelle ab 7.2 -lauch das Lesen einer Privatekey- Datei (aber nicht von stdin) unterstützt.
dave_thompson_085
2

Sie erhalten den Fingerabdruck nicht aus der privaten Schlüsseldatei, sondern aus der öffentlichen Schlüsseldatei.

Tatsächlich hat Ihnen ssh-keygen bereits Folgendes gesagt:

./query.pem ist keine öffentliche Schlüsseldatei.

Führen Sie es gegen die öffentliche Hälfte des Schlüssels aus, und es sollte funktionieren.

Allgemeiner gesagt

Denken Sie darüber nach: Der Grund für die Existenz des Fingerabdrucks ist, dass Sie den öffentlichen Schlüssel identifizieren können. Tatsächlich ist das Abrufen eines Hashs des privaten Schlüssels ein potenzielles Sicherheitsproblem, das nicht nur für den Server unbrauchbar ist (der nicht einmal den fraglichen privaten Schlüssel hat).

Sobald Sie den öffentlichen Schlüssel haben, müssen Sie überprüfen, ob der Client die entsprechende private Hälfte hält. Da Sie bereits wissen, welche Schlüssel Sie überprüfen möchten, benötigen Sie keinen Fingerabdruck.

Stephane
quelle
Das Problem ist, dass ich keinen öffentlichen Schlüssel für diesen privaten habe :( Und eine andere Sache: Funktioniert ssh-keygenmit einer privaten RSA-Schlüsseldatei, die die zusätzlichen Informationen am Anfang enthält (siehe meinen ersten Beitrag), aber nicht mit diesem. .
Unbekannt
Dann können Sie nichts dagegen tun. Sie können die öffentliche Hälfte des Schlüssels nicht mehr vom privaten Teil erhalten, als Sie umgekehrt tun können.
Stephane
3
Das ist falsch Wie @ominug oben ausgeführt hat, ssh-keygen -yffunktioniert dies.
Steve Bennett
4
@Stephane Während es auf einer reinen RSA-Ebene korrekt ist, enthält die Art und Weise, wie Schlüssel in der PKCS-Spezifikation gespeichert werden, in der Praxis beide Schlüssel. Vergleichen Sie die Spezifikationen für private vs public
Håkan Lindqvist
"Sie können die öffentliche Hälfte des Schlüssels nicht vom privaten Teil bekommen ..." - oh ja, das können Sie wahrscheinlich. Nehmen Sie den Modul aus dem privaten Schlüssel und verwenden Sie 65537 als öffentlichen Exponenten. Möglicherweise haben Sie den öffentlichen Schlüssel gefunden.
Jim Flood