So überprüfen Sie, ob ein öffentliches / privates RSA-Schlüsselpaar übereinstimmt

71

Ich habe zwei Dateien id_rsaund id_rsa.pub. Mit welchem ​​Befehl kann überprüft werden, ob es sich um ein gültiges Paar handelt?

Ryan
quelle
Ich werde Michuelniks Antwort bestätigen; Das ersparte mir ein neues Schlüsselpaar, danke. ssh -vhilft auch sehr.
Chris K

Antworten:

92

Ich würde die ssh-keygen -y -e -f <private key>Art und Weise anstelle der akzeptierten Antwort von Wie teste ich ein öffentliches / privates DSA-Schlüsselpaar? auf Stapelüberlauf.

ssh-keygen -y -e -f <private key>Nimmt einen privaten Schlüssel und druckt den entsprechenden öffentlichen Schlüssel aus, der direkt mit Ihren verfügbaren öffentlichen Schlüsseln verglichen werden kann. (Hinweis: Vorsicht vor Kommentaren oder Schlüsseloptionen.)

(Wie zum Teufel macht es das? Ich kann nur hoffen, dass der öffentliche Schlüssel direkt oder indirekt im privaten Schlüssel verschlüsselt ist ...)

Ich brauchte das selbst und benutzte den folgenden Bash-Einzeiler. Es sollte nichts ausgegeben werden, wenn die Schlüssel zusammengehören. Wenden Sie ein wenig -qauf das diff in Skripten an und diff setzt nur den Rückgabecode entsprechend.

PRIVKEY=id_rsa
TESTKEY=id_rsa.pub
diff <( ssh-keygen -y -e -f "$PRIVKEY" ) <( ssh-keygen -y -e -f "$TESTKEY" )
Michuelnik
quelle
1
@MichaelHampton: jetzt verstehe ich deinen Kommentar. "Die akzeptierte Antwort" sollte sich auf die Frage zum Stackoverflow beziehen, nicht auf diese Frage ...
Michuelnik
1
@ Sirch: Ich dachte, die Entscheidung, welcher Schlüssel privat und welcher öffentlich ist, ist rein zufällig, da die beiden Schlüssel gleich sind. Was ein Schlüssel verschlüsselt, kann nur mit dem anderen entschlüsselt werden. Und wenn ein Schlüssel vom anderen erhalten werden könnte, würde dies alles nicht funktionieren.
Michuelnik
1
@Michuelnik Sie können den öffentlichen Schlüssel vom privaten Schlüssel ableiten. Sie können den privaten Schlüssel nicht vom öffentlichen Schlüssel ableiten. Wir haben nicht über das Material gesprochen, das es verschlüsselt.
Sirch
1
@Michuelnik imho, die Frage ist off Topic auf SO und on Topic hier (und / oder Superuser). imho, es sollte nicht als doppelt markiert und stattdessen für die Migration markiert werden. Aber es geht um beides, also mag ich den umfassenderen Austausch von Informationen.
Chris K
10
Solange id_rsa.pub existiert, ssh-keygen -y -e -f id_rsawird id_rsa nicht überprüft, sondern nur der Wert von id_rsa.pub zurückgegeben. Wenn Sie also zB echo 5 > id_rsaden privaten Schlüssel löschen, dann machen Sie den Diff, der Diff geht vorbei! ssh-keygen -yef fooWenn Sie ausführen , bei dem foo kein gültiger Schlüssel ist (und keine entsprechende Datei foo.pub hat), wird das Warten auf Benutzereingaben blockiert. Gehen Sie daher bei der Verwendung dieses Befehls in einem Skript vorsichtig vor.
32

Abhängig davon, wo Sie die zu testende öffentliche Schlüsseldatei erhalten, kann die akzeptierte Antwort zu falsch positiven Ergebnissen führen. Dies liegt an dem Verhalten, das in dem Kommentar von @drewbenn beschrieben wird. Insbesondere wenn die Option -e mit der privaten Schlüsseldatei als Optionsparameter -f verwendet wird, werden die Inhalte der zugehörigen öffentlichen Schlüsseldatei einfach nachgebildet (aber neu formatiert).

Mit anderen Worten,

ssh-keygen -y -f id_rsa

(anscheinend) erzeugt den öffentlichen Schlüsselwert und

ssh-keygen -y -e -f id_rsa

einfach und Ausgänge (und reformats) der Schlüssel in der bestehenden id_rsa.pub was auch immer es ist .

In meinem Fall muss ich sicherstellen, dass das Paar nicht beschädigt wurde. Deshalb habe ich beschlossen, Folgendes zu vergleichen:

ssh-keygen -y -f id_rsa | cut -d' ' -f 2

mit

cut -d' ' -f 2 id_rsa.pub

Deshalb:

diff <(cut -d' ' -f 2 id_rsa.pub) <(ssh-keygen -y -f id_rsa | cut -d' ' -f 2)

Vielleicht ist das nicht so flexibel, aber es ist besser für meine Bedürfnisse. Vielleicht hilft es jemand anderem.

Zwillingsbäuerin
quelle
5
Dies sollte die akzeptierte Antwort wirklich ersetzen oder zumindest in Bezug auf Upvotes übertreffen.
Thomanski
Danke! Dieser Befehl funktioniert nicht mit Schlüsseln mit einer Passphrase, das wird nicht interaktiv abgefragt. Ich habe die two () -Befehlsinhalte in Dateien extrahiert und diese verteilt, das funktioniert.
Jaroslaw Nikitenko
5

Wenn sie sich auf Ihrem lokalen System befinden, bleiben id_rsa.pubSie bei $HOME/.ssh/authorized_keysund sshund localhostverwenden den id_rsaSchlüssel. Wenn es funktioniert, stimmen sie überein.

cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
ssh -i $HOME/.ssh/id_rsa localhost
Michael Hampton
quelle