2008-11-08 11 views
139

Gibt es eine einfache Möglichkeit zu überprüfen, ob ein bestimmter privater Schlüssel mit einem bestimmten öffentlichen Schlüssel übereinstimmt? Ich habe ein paar * .pub und ein paar * .key-Dateien, und ich muss überprüfen, welche mit denen gehen.Wie testen Sie ein öffentliches/privates DSA-Schlüsselpaar?

Auch dies sind Pub/Key-Dateien, DSA.

ich wirklich einen Einzeiler irgendeiner Art bevorzugen würde ...

Antwort

222

fand ich einen Weg, der für mich besser zu funktionieren scheint:

ssh-keygen -y -f <private key file> 

das ausgeben wird der öffentliche Schlüssel für den gegebenen privaten Schlüssel gebiete, so vergleichen Sie dann nur die Ausgabe in jeder * PUB-Datei.

+0

Was genau macht das? Warum SSH? – sammiwei

+2

wahrscheinlich, weil er Schlüsselpaare für ssh-Authentifizierung verwendet – etarion

+2

In meinem Fall hat ein zentraler Arbeitsserver ein paar Dutzend 'id_rsa.pub.blahhost' Dateien und ich wusste nicht, welche mit dem einzigen' id_rsa' privaten Schlüssel & ich bin passwortloses scp einrichten, damit ich von alten websites migrieren kann. Das Erstellen eines neuen Schlüsselpaars ist keine Option. Ich habe meine Schlüssel gut eingerichtet und werde das nicht durcheinander bringen. –

0

Encrypt etwas mit dem öffentlichen Schlüssel, und sieht es die privaten Schlüssel dechiffriert.

Diese code project article von niemand Geringerem als Jeff Atwood implementiert einen vereinfachten Wrapper um die .NET-Crypto-Klassen. Angenommen, diese Schlüssel wurden für die Verwendung mit RSA erstellt, verwenden Sie die asymmetrische Klasse mit Ihrem öffentlichen Schlüssel zum Verschlüsseln und die gleiche mit Ihrem privaten Schlüssel zum Entschlüsseln.

+0

Ich bin auf der Suche nach etwas einfacher. Sprich, ein Shell One Liner oder ähnliches. Ich bin auf Linux und habe die normalen Sachen wie openssl installiert. – Loki

+3

Das ist fast so nützlich wie zu sagen, fügen Sie einen öffentlichen Schlüssel zu Ihrer Datei authorized_keys und verwenden Sie ssh, um zu sehen, welcher private Schlüssel funktioniert. Die Methode funktioniert, aber es ist ein Schmerz. –

12

Vorausgesetzt, dass Sie die öffentlichen Schlüssel innerhalb von X.509-Zertifikaten haben, und vorausgesetzt, sie RSA-Schlüssel sind, dann für jeden öffentlichen Schlüssel, tun

openssl x509 -in certfile -modulus -noout 

Für jeden privaten Schlüssel tun

openssl rsa -in keyfile -modulus -noout 

Dann passen Sie die Schlüssel nach Modulus an.

45

Für DSA-Schlüssel verwenden

openssl dsa -pubin -in dsa.pub -modulus -noout 

die öffentlichen Schlüssel zu drucken, dann

openssl dsa -in dsa.key -modulus -noout 

die öffentlichen Schlüssel angezeigt werden, zu einem privaten Schlüssel entspricht, dann vergleichen.

6

Löschen Sie die öffentlichen Schlüssel und generieren Sie neue Schlüssel aus den privaten Schlüsseln. Bewahren Sie sie in separaten Verzeichnissen auf oder verwenden Sie eine Namenskonvention, um sie direkt zu halten.

+2

Die Frage ist, wie man verifiziert wird und das Gerät, auf dem wir es überprüfen werden, hat möglicherweise nicht die Möglichkeit, ein neues zu erzeugen. – ArmenB

48

ich immer einen MD5-Hash des Moduls vergleichen diese Befehle:

Certificate: openssl x509 -noout -modulus -in server.crt | openssl md5 
Private Key: openssl rsa -noout -modulus -in server.key | openssl md5 
CSR: openssl req -noout -modulus -in server.csr | openssl md5 

Wenn die Hashes übereinstimmen, dann gehen diese beiden Dateien zusammen.

+0

Funktioniert nicht für DSA-Schlüssel – thomasrutter

-1

Verwenden Sie einfach puttygen und laden Sie Ihren privaten Schlüssel hinein. Bietet verschiedene Optionen, z.B. Exportieren des entsprechenden öffentlichen Schlüssels

+0

Dies erlaubt nicht, private-public Schlüsselpaar zu testen – MatFiz

9

Die Prüfung kann mit diff erleichtert werden:

diff <(ssh-keygen -y -f <private_key_file>) <public key file> 

Das einzige Seltsame ist, dass diff sagt nichts, wenn die Dateien gleich sind, so dass Sie nur dann, wenn der öffentliche und privater don gesagt werden 't übereinstimmen.

+2

Um Ausgabe zu erhalten, wenn Dateien übereinstimmen: 'diff -s' – Roland

+0

Dies ist eine ausgezeichnete Antwort. (1) 'diff -qs' gibt eine einfache" identische/nicht identische Antwort zurück. (2) Sie sollten den Kommentar in der öffentlichen Schlüsseldatei löschen, bevor Sie das diff ausführen. – emory

1

Alle oben genannten Antworten gehen davon aus, dass der angegebene private Schlüssel - von dem Sie nichts wissen und herausfinden möchten, ob er mit dem angegebenen öffentlichen Schlüssel übereinstimmt - KEINE PASSPHRASE hat.Wenn der private Schlüssel hat eine Passphrase, die beide dann

ssh-keygen -y -f PrivateKey

und

openssl (rsa oder dsa) -in PrivateKey -Modul -noout

verlangen die Passphrase. Wenn Sie einen unbekannten privaten Schlüssel haben, wissen Sie nicht , ob es eine Passphrase hat oder nicht - geschweige denn, was die Passphrase ist, wenn der Schlüssel einen hat.

So praktisch ist es wert, die oben genannten Befehle zu versuchen, aber wenn sie dann nach einer Passphrase fragen, stecken Sie fest: Sie können den öffentlichen Schlüssel nicht extrahieren und sein Modulus mit dem zweiten Feld der öffentlichen Schlüsseldatei übereinstimmen . Kennt jemand einen Weg um dies?

+0

Das ist wahr. Darüber hinaus, wenn die Schlüsseldatei beschädigt ist, ssh-keygen fragt nach einer Passphrase, in der nicht erwartet wird (Ich suche nach einem Weg, um zu überprüfen, ob ein öffentliches/privates Schlüsselpaar im Allgemeinen gültig ist) – Curt

2

Wenn Sie in Windows sind und eine GUI verwenden möchten, mit puttygen können Sie Ihren privaten Schlüssel in sie importieren:

enter image description here

Nach dem Import können Sie seinen öffentlichen Schlüssel speichern und zu Ihnen zu vergleichen.

0

diff es < (ssh-keygen -y -f ~/.ssh/id_rsa) < (cut -d '' -f 1,2 ~/.ssh/id_rsa.pub)

+0

Ich denke, du solltest es ausarbeiten, dein Beitrag ist wirklich nah dran https://stackoverflow.com/a/22595408/3102264 – mpromonet