it-swarm.com.de

Bestimmen Sie, ob der private Schlüssel zum Zertifikat gehört?

Wie kann ich bei einem Zertifikat¹ und einer Datei mit privatem Schlüssel² feststellen, ob der öffentliche Schlüssel auf dem Zertifikat mit dem privaten Schlüssel übereinstimmt?

Mein erster Gedanke war, einfach einen Text mit dem öffentlichen Schlüssel auf dem Zertifikat zu verschlüsseln und zu versuchen, ihn mit dem privaten Schlüssel zu entschlüsseln. Wenn es Roundtrips gibt, haben wir einen Gewinner. Ich kann einfach nicht herausfinden, wie das mit OpenSSL geht.

Wenn ich alternativ den öffentlichen Schlüssel aus dem privaten Schlüssel generieren könnte, könnte ich einfach ihre Fingerabdrücke vergleichen. SSH scheint einen Befehl dafür zu haben (ssh-keygen -y -f my_key > my_key.pub), Aber die Hashes stimmen nicht überein. (Ich bin fast sicher, dass ich den Schlüssel habe, der dem Zertifikat entspricht, da der Webserver damit arbeitet, aber ich möchte eine einfachere Möglichkeit, das Hochfahren eines Servers zu überprüfen.)

¹ eine .crt-Datei im x509-Format, denke ich. OpenSSL kann es mit openssl x509 -text -in that_cert.crt Lesen.
² Ein privater RSA-Schlüssel

41
Thanatos

Ich gehe davon aus, dass Sie ssl.crt und ssl.key in Ihrem aktuellen Verzeichnis haben.

Wenn Sie sehen möchten, was in Ihrem Zertifikat enthalten ist, ist es

# openssl x509 -in ssl.crt -text -noout

Zwei der Dinge hier sind der Modul und der Exponent des öffentlichen RSA-Schlüssels (in hex).

Wenn Sie sehen möchten, was sich in Ihrem privaten Schlüssel befindet, ist es

# openssl rsa -in ssl.key -text -noout

Beachten Sie, dass sich der öffentliche Schlüssel normalerweise dort befindet (zumindest muss der Modul vorhanden sein, damit der private Schlüssel funktioniert, und der öffentliche Exponent ist normalerweise 65537 oder 3). Sie können also einfach überprüfen, ob der Modul und der öffentliche Exponent übereinstimmen. Zugegeben, wenn Sie überprüfen möchten, ob der private Schlüssel tatsächlich gültig ist (d und e sind gültige RSA-Exponenten für den Modul m), müssen Sie ihn ausführen

# openssl rsa -check -in ssl.key -noout

EDIT (2018):Bitte beachten Sie, dass Sie PRÜFEN MÜSSEN, ob der private Schlüssel gültig ist, wenn Sie überprüfen, ob ein privater Schlüssel, der von einer nicht vertrauenswürdigen Quelle stammt, einem Zertifikat entspricht. Siehe hier für ein Beispiel, bei dem die Nichtprüfung der Gültigkeit eines "durchgesickerten" privaten Schlüssels dazu führt, dass eine Zertifizierungsstelle ein Zertifikat nicht ordnungsgemäß widerruft. Sie können diesen Schritt überspringen, wenn Sie wissen, dass Sie das Schlüsselpaar gültig generiert haben.

Jetzt können Sie einfach den öffentlichen Schlüssel sowohl aus dem Zertifikat als auch aus dem privaten Schlüssel generieren und dann mit diff überprüfen, ob sie sich nicht unterscheiden:

# openssl x509 -in ssl.crt -pubkey -noout > from_crt.pub
# openssl rsa -in ssl.key -pubout > from_key.pub
# diff from_crt.pub from_key.pub

Oder als Einzeiler, der keine Dateien erstellt (mit Prozessersetzung ):

# diff  <(openssl x509 -in ssl.crt -pubkey -noout) <(openssl rsa -in ssl.key -pubout)

Wenn die Schlüssel übereinstimmen, sollte diff nichts zurückgeben. (Wahrscheinlich wird vom zweiten Befehl die Ausgabe "RSA-Schlüssel schreiben" an stderr ausgegeben.).

Beachten Sie, dass Ihr Webserver sich wahrscheinlich lautstark beschweren würde, wenn das Zertifikat und der private Schlüssel nicht übereinstimmen würden. Zum Beispiel, wenn nginx den falschen Schlüssel (gleiche Größe, gleicher öffentlicher Exponent, aber Schlüssel des letzten Jahres) für das Zertifikat verwendet, verwendet nginx:

# Sudo /etc/init.d/nginx restart
* Restarting nginx nginx                                                                                         
nginx: [emerg] SSL_CTX_use_PrivateKey_file("/etc/nginx/ssl/private/wrong_key.key") failed 
(SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
nginx: configuration file /etc/nginx/nginx.conf test failed
52
dr jimbob

Die akzeptierte Antwort ist korrekt, funktioniert jedoch nur für RSA-Schlüssel.

Zumindest seit openssl 1.1.1 ist es möglich, die Gültigkeit aller Arten von privaten Schlüsseln zu testen. Hier ist ein Einzeiler, der für alle Arten von Schlüsseln funktioniert, die openssl unterstützt

 cmp <(openssl x509 -pubkey -in certificate.pem -noout) <(openssl pkey -check -pubout -in private-key.pem -outform PEM)

Es wird nur dann 'true' zurückgegeben, wenn der private Schlüssel mit dem öffentlichen Schlüssel im Zertifikat übereinstimmt.

11
Manish