Fehlermeldung
verify error:num=19:self-signed certificate in certificate chain
Auch ausgegeben als
- verify error:num=19:self signed certificate in certificate chain
- error 19 at 2 depth lookup: self-signed certificate in certificate chain
OpenSSL 3.x gibt „self-signed“ aus, 1.1.1 „self signed“. openssl verify meldet den Fehler als „error 19 at <depth> depth lookup: …“, wobei die Tiefe die Position des Root-Zertifikats in der Kette ist.
OpenSSL CLI (openssl s_client / openssl verify) — X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN
Was der Fehler bedeutet
OpenSSL-Fehler 19 (X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN): Die Kette wurde bis zu einem selbstsignierten Root-Zertifikat aufgebaut, das von der Gegenstelle kam, und dieses Root-Zertifikat steht nicht im Trust Store. Anders als bei Fehler 18 gibt es eine echte CA-Hierarchie; anders als bei Fehler 20 fehlt nichts. Entweder muss dem Root-Zertifikat lokal vertraut werden, oder die Verbindung wird abgefangen.
Warum der Fehler auftritt
Ein Proxy mit TLS-Inspektion
häufigFirmen-Proxys senden ihr eigenes Root-Zertifikat in der Kette mit. Nennt das Subject des obersten Zertifikats deine Firma oder einen Security-Anbieter, wird die Verbindung inspiziert.
Eine private CA, deren Root-Zertifikat der Server mitsendet
häufigInterne Dienste senden oft die vollständige Kette samt Root-Zertifikat; Clients brauchen das Root-Zertifikat trotzdem als installierten Vertrauensanker.
Der Test lief ohne den erwarteten Trust Store
gelegentlichEin Test, bei dem -CAfile auf die falsche Datei zeigt, oder ein Test in einem Image, in dessen Trust Store das Root-Zertifikat der Firma fehlt, liefert diesen Code für einen korrekt konfigurierten internen Dienst.
So behebst du den Fehler
- 1.
Root-Zertifikat und seinen Fingerabdruck ermitteln
Zerlege die ausgelieferte Kette und gib für jedes Zertifikat Subject, Aussteller und SHA-256-Fingerabdruck aus; vergleiche den Fingerabdruck des Root-Zertifikats mit dem, den dein IT- oder PKI-Team veröffentlicht.
bash openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \ | awk '/BEGIN CERT/{n++} {print > ("cert" n ".pem")}' for f in cert[0-9]*.pem; do openssl x509 -in "$f" -noout -subject -issuer -fingerprint -sha256 2>/dev/null; done - 2.
Mit dem richtigen Root-Zertifikat testen, dann installieren
Liefert -CAfile mit dem veröffentlichten Root-Zertifikat „Verify return code: 0 (ok)“, installiere dieses Root-Zertifikat im Trust Store des Systems.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com \ -CAfile corp-root-ca.pem 2>&1 | grep 'Verify return code' sudo cp corp-root-ca.pem /usr/local/share/ca-certificates/corp-root-ca.crt && sudo update-ca-certificates - 3.
Eigener Server: nur Leaf- und Zwischenzertifikate senden
Das Root-Zertifikat mitzusenden verschwendet bei jedem Handshake Bytes und macht es nie vertrauenswürdig; verteile das Root-Zertifikat stattdessen an die Clients.
bash # Server owners: the root does not belong in the served chain cat server.pem intermediate.pem > fullchain.pem
Verwandte Fehler
verify error:num=18:self-signed certificateOpenSSL CLI (openssl s_client / openssl verify)verify error:num=20:unable to get local issuer certificateOpenSSL CLI (openssl s_client / openssl verify)curl: (60) SSL certificate problem: self-signed certificate in certificate chaincurl (OpenSSL backend)self-signed certificate in certificate chainNode.js tls / https / fetch