Warum kann ich diese Zertifikatskette nicht überprüfen?

16

Ich habe drei Zertifikate in einer Kette:

  • root.pem
  • intermediär.pem
  • john.pem

Wenn ich sie mit untersuche, sehen openssl x509 -in [filename] -text -nooutsie gut aus. Root.pem scheint selbstsigniert zu sein (Aussteller == Betreff), und der Betreff jedes Zertifikats ist erwartungsgemäß der Aussteller des nächsten Zertifikats.

Und tatsächlich kann ich die Kette bis zum Zwischenzertifikat überprüfen:

$ openssl verify -CAfile root.pem root.pem
root.pem: OK
$ openssl verify -CAfile root.pem intermediate.pem
intermediate.pem: OK

John.pem schlägt jedoch fehl:

$ openssl verify -CAfile root.pem -CAfile intermediate.pem john.pem
john.pem: C = CL, [...redacted data...]
error 2 at 1 depth lookup:unable to get issuer certificate

Nach meinem besten Wissen bedeutet dies, dass openssl den Aussteller für intermediär.pem nicht finden kann. Was keinen Sinn macht, da root.pem tatsächlich der Aussteller für intermediäre.pem ist.

Was vermisse ich?


Bearbeiten: Ich hatte ursprünglich eine Antwort gepostet, die besagt, dass root.pem und intermediäre.pem in einer Datei verkettet werden sollten, und dann sollte man diese Datei als Parameter für verwenden -CAfile. Dies ist FALSCH, weil dies implizit Intermediate.pem vertraut, wie Johannes Pille betont . Lesen Sie den Link, den er in meiner gelöschten Antwort gepostet hat: https://mail.python.org/pipermail/cryptography-dev/2016-August/000676.html

Jong Bor
quelle
Bitte löschen Sie Ihre Antwort, es ist gefährliche Fehlinformation!
Johannes Pille
1
@ JohannesPille Fertig, danke für die Information
Jong Bor
Ein großes Lob dafür und die schnelle Reaktion.
Johannes Pille

Antworten:

14

Sie müssen die beiden Zertifikate nicht zusammen katzen, um sie zu überprüfen.

Wenn Sie die folgenden drei Zertifikate haben:

  • root.pem - speichert ein selbstsigniertes Zertifikat.
  • intermediär.pem - speichert ein von root.pem signiertes Zertifikat
  • john.pem - speichert ein von intermediär.pem signiertes Zertifikat

Und Sie vertrauen nur root.pem, dann würden Sie john.pemmit dem folgenden Befehl überprüfen :

openssl verify -CAfile root.pem -untrusted intermediate.pem john.pem

Wenn Sie viele Zwischenprodukte hatten, konnten Sie einfach verketten -untrusted intermediate2.pem -untrusted intermediate3.pem ...

Antiduh
quelle
Dies. Ist die einzig richtige Antwort.
Johannes Pille
Ich dachte, wenn ich sowohl das Zwischenzertifikat als auch das Stammzertifizierungsstellenzertifikat im Paket opensslhätte , würde ich diese abholen und die Zertifikate überprüfen. Gibt es einen Grund, warum dies passieren würde? Die Person, die das Benutzerzertifikat signiert hat, hat es nicht mit dem Intermediate signiert, sondern mit dem Root oder so?
Pred
Der letzte Satz dieser Antwort ist falsch. Wenn Sie viele Zwischenprodukte haben, müssen Sie diese zu einer Zwischendatei verketten und dann das untrustedFlag einmal verwenden. Die mehrfache Verwendung des nicht vertrauenswürdigen Flags funktioniert nicht.
AjaxLeung
1
@AjaxLeung - Sowohl mehrere -untrustedOptionen (in beliebiger Reihenfolge) als auch eine einzelne -untrustedOption, die auf ein Bündel von Zwischenprodukten (in beliebiger Reihenfolge verkettet) verweist, funktionieren. Dies ist mit OpenSSL Version 1.1.1c unter Ubuntu.
garethTheRed
Ja, ich habe mich geirrt. Ich glaube, ich habe zum Zeitpunkt des Schreibens des Kommentars einfach nicht die richtigen Dateien verwendet.
AjaxLeung
3

Was @antiduh gesagt hat, funktioniert für mich nur für den Fall eines einzelnen Zwischenzertifikats. Das Hinzufügen von mehr als einem -untrusted intermediate.pemim Befehl scheint nicht zu funktionieren. Ich bin mir nicht sicher, ob es sich um eine bestimmte openssl-Version handelt.

Laut dem openssl-Dokument: [ https://linux.die.net/man/1/verify]

-vertraute Datei

Eine Datei mit nicht vertrauenswürdigen Zertifikaten. Die Datei sollte mehrere Zertifikate enthalten

In meinem Fall habe ich eine Kette wie: root.pem -> intermediate1.pem -> intermediate2.pem -> john.pem

von cat intermedi1.pem & intermedial2.pem in eine einzelne intermediär-chain.pem-Datei und dann laufen openssl verify -CAfile root.pem -untrusted intermediate-chain.pem john.pemfunktioniert für mich.

Außerdem scheint die in ca-Erweiterung, die Sie benötigen, eingestellt zu sein, basicConstraints = CA:trueandernfalls stoße ich immer noch auf openssl-Überprüfungsberichtfehler.

Yang Xu
quelle