Ich habe eine einfache Kettenkonfiguration und kann in diesem Fall erfolgreich überprüfen:
%Vor%Allerdings bekomme ich in diesen Fällen Fehler:
%Vor%Insbesondere kann das Ausstellerzertifikat nicht erhalten .
Bekomm es auch hier:
%Vor%Schließlich bekomme ich es in Node.js, wenn ich die Schlüssel an einen HTTPS-Server übergebe:
%Vor% Ich habe versucht, es mit { key, cert, ca }
, aber immer noch gleichen Fehler.
Ich frage mich, wie ich das Problem beheben oder beheben kann, damit ein HTTPS-Server läuft.
Wenn ich eine pfx
Datei verwende, bekomme ich folgendes:
Wenn ich nur das cert.pem in der cert-Datei belasse und das ca
-Attribut als ca-cert.pem deklariert, gibt es:
Nicht sicher, was zu tun ist.
Hier wird gesagt:
OpenSSL kann kein lokales Zertifikat für den Aussteller (oder den Aussteller des ersten Zertifikats in der Kette, das während des TLS-Handshakes vom Webserver empfangen wird) finden, mit dem die Signatur (en) verifiziert werden können.
Nicht sicher, was das bedeutet.
Dieser Fehler bedeutet, dass der Zertifikatspfad oder die Zertifikatkette beschädigt ist und Sie keine Zertifikatsdateien mehr haben.
- Ссылка
Aktualisieren
Etwas mehr Hilfe:
Dieses Problem wird normalerweise durch Protokollmeldungen angezeigt, die etwas wie "Kann kein lokales Ausstellerzertifikat" oder "selbstsigniertes Zertifikat" erhalten. Wenn ein Zertifikat verifiziert wird, muss seine Stammzertifizierungsstelle von OpenSSL "vertrauenswürdig" sein. Dies bedeutet in der Regel, dass das Zertifikat der Zertifizierungsstelle in einem Verzeichnis oder einer Datei gespeichert und das entsprechende Programm zum Lesen konfiguriert werden muss. Das OpenSSL-Programm 'verify' verhält sich ähnlich und gibt ähnliche Fehlermeldungen aus: Weitere Informationen finden Sie auf der Handbuchseite verify (1) program.
Aber hilft immer noch nicht sehr.
Sieht so aus, als ob Node.js 1.0.2l statt 1.0.2m benutzt, aber das scheint keine große Sache zu sein.
%Vor%Update 2
Seltsam, ich bekomme das, wenn ich eine Anfrage von Node.js:
mache %Vor%Aber wenn ich zum Browser gehe, sehe ich nicht die Seite "Mit Vorsicht fortfahren" und kann erfolgreich eine Anfrage in Node.js protokollieren. Vielleicht hilft das etwas. Bitte helfen Sie: D
(Diese Antwort wurde aus X509_verify_cert
at crypto/x509/x509_vfy.c:204
extrahiert, in openssl-1.0.2m)
Die OpenSSL verify
-Anwendung verifiziert ein Zertifikat auf folgende Weise: Sie erstellt die Zertifikatskette beginnend mit dem Zielzertifikat und verfolgt die Ausstellerkette und durchsucht zuerst alle nicht vertrauenswürdigen Zertifikate, die zusammen mit dem Ziel-Cert geliefert werden. Wenn ein nicht vertrauenswürdiges Aussteller-Zertifikat nicht gefunden wird, wechselt OpenSSL zum vertrauenswürdigen Zertifikatspeicher und baut die Kette weiter auf. Dieser Prozess stoppt, wenn
An dieser Stelle haben wir eine Kette, die möglicherweise vorzeitig endet (wenn wir keinen Aussteller gefunden haben oder wenn wir die Verifizierungstiefe überschritten haben).
Anschließend scannt OpenSSL jedes vertrauenswürdige Zertifikat in der Kette nach SSLv3-Erweiterungen, die den Zweck des vertrauenswürdigen Zertifikats angeben. Wenn das vertrauenswürdige Zertifikat über die richtigen "Vertrauens" -Attribute für den "Zweck" der Verifikationsoperation verfügt (oder das anyExtendedKeyUsage
-Attribut hat), ist die Kette vertrauenswürdig. (Vergeben Sie die Hand-wave auf Trust-Attribute, dieser Teil des Codes war schwer zu lesen.)
Lass es uns also testen. Lassen Sie uns zunächst die Fehlerfälle des OPs repro- duzieren:
%Vor%ergibt
%Vor% Nun können wir die Option -addtrust
von openssl x509
verwenden, um sicherzustellen, dass wir eines der akzeptablen Vertrauensattribute auf der Zwischenzertifizierungsstelle haben (rufen Sie dieses IntermediateCAWithTrust
auf; wir verwenden es, um AnotherUserCert
zu signieren. ):
Dies ergibt
%Vor%Hey schau! Wir haben gerade AnotherUserCert über IntermediateCAWithTrust erfolgreich verifiziert, obwohl wir nicht die gesamte Kette geliefert haben. Der Schlüssel zu diesem Unterschied liegt darin, dass eines der vertrauenswürdigen Zertifikate in der Kette über ein entsprechendes Vertrauensattribut für die Verify-Operation verfügt.
Ein wenig näher ( via openssl x509 -in ca-crt.pem -noout -text
), hat unser CA-Zertifikat
Ich denke, OpenSSL behandelt dies als generelle Erweiterung "kann für irgendeinen Zweck verifizieren". Der neue IntermediateCAWithTrust
hat nicht X509v3 Basic Constraints
, sondern stattdessen
Weitere Informationen zur Option -addtrust
und zu den Attributen, die hinzugefügt werden können, finden Sie unter Ссылка
Ganz unten auf dieser Seite finden Sie eine kurze Zusammenfassung der vorangegangenen Diskussion:
Das CA-Flag basicConstraints-Erweiterung wird verwendet, um zu bestimmen, ob Das Zertifikat kann als CA verwendet werden. Wenn das CA-Flag wahr ist, ist es das eine CA, wenn das CA-Flag falsch ist, dann ist es keine CA. Alle CAs sollten haben Das CA-Flag wurde auf "True" gesetzt.
Wenn die Erweiterung basicConstraints nicht vorhanden ist, lautet das Zertifikat Als "mögliche CA" werden andere Erweiterungen geprüft entsprechend der beabsichtigten Verwendung des Zertifikats. Eine Warnung wird gegeben in diesem Fall, weil das Zertifikat wirklich nicht als angesehen werden sollte eine CA: allerdings darf es eine CA sein, um einige kaputte zu umgehen Software.
Kurz gesagt, stellen Sie sicher, dass Ihre Zwischenzertifizierungsstellen ordnungsgemäß CAs sind (in ihrem X509v3 Basic Constraints
). Dies scheint ein hervorragendes Tutorial zu sein (und es generiert explizit die Zwischenzertifizierungsstelle als CA): Ссылка
Als Backup-Plan können Sie immer die gesamte Kette angeben, oder Sie können Ihre Zwischen-CAs mit dem -addtrust
-Hack erstellen.
Ссылка ist wirklich einfach zu benutzen und kostenlos. Führen Sie den Knoten auch ohne SSL an einem lokalen HTTP-Port aus und verwenden Sie NGINX als HTTPS-Proxy.
sudo apt-get installieren Sie certbot nginx
%Vor%Tags und Links node.js openssl certificate x509certificate