Ich baue eine eigene Zertifikatskette mit folgenden Komponenten auf:
Root Certificate - Intermediate Certificate - User Certificate
Das Root-Zertifikat ist ein selbstsigniertes Zertifikat. Das Zwischenzertifikat wird von Root und der Benutzer von Intermediate signiert.
Jetzt möchte ich überprüfen, ob ein Benutzerzertifikat seinen Anker durch das Stammzertifikat hat.
Mit
openssl verify -verbose -CAfile RootCert.pem Intermediate.pem
Die Validierung ist in Ordnung. Im nächsten Schritt validiere ich das Benutzerzertifikat mit
openssl verify -verbose -CAfile Intermediate.pem UserCert.pem
und die Validierung zeigt
error 20 at 0 depth lookup:unable to get local issuer certificate
Was ist falsch?
quelle
man verify
ich verschiedene Optionen ausprobiert hatte , stellte ich fest, dass der-untrusted
Parameter der richtige ist, der bei der Angabe des Zwischenzertifikats verwendet werden soll.-untrusted
prüft nicht, ob die Zertifikatskette vollständig gültig ist. Bitte denken Sie daran, sowohl Intermediate als auch Root an den Befehl zu übergeben,-CAfile
wie andere Fragen vermuten lassen.openssl verify -CAfile /usr/local/etc/openssl/cert.pem -untrusted Intermediate.pem UserCert.pem
Das ist einer der wenigen legitimen Jobs für
cat
:Aktualisieren:
Wie Greg Smethells in den Kommentaren hervorhebt, vertraut dieser Befehl implizit Intermediate.pem . Ich empfehle, den ersten Teil des Beitrags zu lesen, auf den Greg verweist (der zweite Teil befasst sich speziell mit pyOpenSSL und ist für diese Frage nicht relevant).
Für den Fall, dass der Beitrag verschwindet, zitiere ich die wichtigen Absätze:
Es scheint, dass openssl die Überprüfung der Kette beendet, sobald ein Stammzertifikat gefunden wird. Dies kann auch Intermediate.pem sein, wenn es selbstsigniert ist. In diesem Fall wird RootCert.pem nicht berücksichtigt. Stellen Sie daher sicher, dass Intermediate.pem von einer vertrauenswürdigen Quelle stammt, bevor Sie sich auf den obigen Befehl verlassen.
quelle
Das Problem ist, dass
openssl -verify
das nicht funktioniert.Wie Priyadi erwähnt hat ,
openssl -verify
stoppt es beim ersten selbstsignierten Zertifikat, daher überprüfen Sie die Kette nicht wirklich, da das Zwischenzertifikat häufig selbstsigniert ist.Bitte beachten Sie, dass die Antwort von Peter korrekt ist , die Ausgabe von
openssl -verify
jedoch kein Hinweis darauf ist, dass danach wirklich alles funktioniert. Ja, es könnte einige Probleme geben, aber nicht alle.Hier ist ein Skript, mit dem eine Zertifikatkette überprüft wird, bevor Sie sie in Apache installieren. Vielleicht kann dies mit etwas mystischerer OpenSSL-Magie verbessert werden, aber ich bin kein OpenSSL-Guru und folgende Werke:
Es gibt eine GitHub-Liste, die möglicherweise einige Updates enthält
Voraussetzungen dieses Skripts:
/etc/ssl/certs
wie gewohnt, beispielsweise unter UbuntuDIR
in dem Sie 3 Dateien speichern:DIR/certificate.crt
welches das Zertifikat enthältDIR/certificate.key
welches den geheimen Schlüssel für Ihren Webservice enthält (ohne Passphrase)DIR/certificate.bundle
welches das CA-Bundle enthält. Informationen zur Vorbereitung des Bundles finden Sie weiter unten../check DIR/certificate
(Dies setzt voraus, dass das Skriptcheck
im aktuellen Verzeichnis benannt ist.)CA-Bundle is not needed
. Dies bedeutet, dass Sie (read/etc/ssl/certs/
:) bereits dem Signaturzertifikat vertrauen. Dies ist jedoch im WWW höchst unwahrscheinlich.Wie erstelle ich die
certificate.bundle
Datei?Im WWW sieht die Vertrauenskette normalerweise so aus:
/etc/ssl/certs
certificate.crt
)Jetzt erfolgt die Auswertung von unten nach oben. Dies bedeutet, dass zuerst Ihr Zertifikat gelesen wird, dann das unbekannte Zwischenzertifikat benötigt wird, dann möglicherweise das Cross-Signing-Zertifikat und dann
/etc/ssl/certs
konsultiert wird, um das richtige vertrauenswürdige Zertifikat zu finden.Das Ca-Bundle muss in genau der richtigen Verarbeitungsreihenfolge erstellt werden. Dies bedeutet, dass das erste benötigte Zertifikat (das Zwischenzertifikat, das Ihr Zertifikat signiert) an erster Stelle im Bundle steht. Dann wird das Cross-Signing-Zertifikat benötigt.
Normalerweise stellt Ihre Zertifizierungsstelle (die Behörde, die Ihr Zertifikat unterzeichnet hat) bereits eine solche ordnungsgemäße Ca-Bundle-Datei zur Verfügung. Wenn nicht, müssen Sie alle erforderlichen Zwischenzertifikate und
cat
diese zusammen in einer einzigen Datei (unter Unix) auswählen . Unter Windows können Sie einfach einen Texteditor (wienotepad.exe
) öffnen und die Zertifikate in die Datei einfügen. Das erste wird oben benötigt und folgt den anderen.Es gibt noch eine andere Sache. Die Dateien müssen im PEM-Format vorliegen. Einige Zertifizierungsstellen geben das DER-Format (ein Binärformat) aus. PEM ist leicht zu erkennen: Es ist ASCII-lesbar. Weitere Informationen zum Konvertieren von etwas in PEM finden Sie unter Konvertieren von .crt in .pem und Folgen der gelben Backsteinstraße.
Beispiel:
Du hast:
intermediate2.crt
das Zwischenzertifikat, das Ihr unterschrieben hatcertificate.crt
intermediate1.crt
ein weiteres Zwischenzertifikat, das sangintermediate2.crt
crossigned.crt
Dies ist ein Cross-Signing-Zertifikat einer anderen Zertifizierungsstelle, die signiert hatintermediate1.crt
crossintermediate.crt
Das ist ein weiteres Zwischenprodukt der anderen CA, die unterschrieben hatcrossigned.crt
(so etwas werden Sie wahrscheinlich nie sehen).Dann würde das richtige
cat
so aussehen:Und wie können Sie herausfinden, welche Dateien in welcher Reihenfolge benötigt werden oder nicht?
Nun, experimentiere, bis
check
dir sagt, dass alles in Ordnung ist. Es ist wie ein Computer-Puzzlespiel, um das Rätsel zu lösen. Jeden. Single. Zeit. Auch für Profis. Aber Sie werden jedes Mal besser, wenn Sie dies tun müssen. Sie sind also definitiv nicht allein mit all dem Schmerz. Es ist SSL, weißt du? SSL ist wahrscheinlich eines der schlechtesten Designs, die ich je in über 30 Jahren professioneller Systemadministration gesehen habe. Haben Sie sich jemals gefragt, warum Krypto in den letzten 30 Jahren nicht zum Mainstream geworden ist? Deshalb. 'nuff sagte.quelle
Ich musste ein letsencrypt-Zertifikat überprüfen und habe es so gemacht:
Geben Sie diesen Befehl ein:
quelle
Nachdem ich einen ganzen Tag mit genau demselben Problem verbracht hatte und keine Vorkenntnisse zu SSL-Zertifikaten hatte, lud ich das herunter unterbrochen hatte, lud CERTivity Keystores Manager importierte meinen Keystore in diesen und erhielt eine übersichtliche Visualisierung der Zertifikatkette.
Bildschirmfoto :
quelle
openssl verify
.Wenn Sie nur überprüfen möchten, ob der Aussteller von
UserCert.pem
tatsächlich ist,Intermediate.pem
gehen Sie wie folgt vor (Beispiel verwendet :)OpenSSL 1.1.1
:und du wirst bekommen:
oder
quelle
openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pem
Python 3.7?Sie können eine Zertifikatskette einfach mit openssl überprüfen. Die vollständige Kette enthält das CA-Zertifikat, sodass Sie Details zur CA und zum Zertifikat selbst sehen sollten.
openssl x509 -in fullchain.pem -text -noout
quelle