Fehlermeldung
verify error:num=18:self-signed certificate
Auch ausgegeben als
- verify error:num=18:self signed certificate
- Verify return code: 18 (self-signed certificate)
- error 18 at 0 depth lookup: self-signed certificate
OpenSSL 3.x gibt „self-signed“ aus, 1.1.1 „self signed“. s_client zeigt „verify error:num=18:…“ und „Verify return code: 18 (…)“; openssl verify zeigt „error 18 at 0 depth lookup: …“.
OpenSSL CLI (openssl s_client / openssl verify) — X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
Was der Fehler bedeutet
OpenSSL-Fehler 18 (X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT): Das Zertifikat auf Tiefe 0 ist selbstsigniert – sein Aussteller ist es selbst – und steht nicht im Trust Store. Über ihm gibt es keine CA, deshalb hilft weder ein Zwischenzertifikat noch ein Bundle; dem Zertifikat muss direkt vertraut werden, oder es muss durch eines ersetzt werden, das eine CA ausgestellt hat.
Warum der Fehler auftritt
Der Server verwendet ein selbstsigniertes Zertifikat
häufigEntwicklungsserver, Appliances, Admin-Oberflächen und frisch installierte Dienste starten oft mit einem generierten Zertifikat.
Für einen unbekannten Namen wird ein Standardzertifikat ausgeliefert
gelegentlichReverse Proxys und Ingresses beantworten Namen, für die sie keine Konfiguration haben, mit einem selbstsignierten Standardzertifikat; prüfe SNI und Routing.
openssl verify auf ein Root-Zertifikat angewendet
gelegentlichopenssl verify root.pem ohne -CAfile root.pem meldet für jedes selbstsignierte Root-Zertifikat Fehler 18, selbst für ein gültiges.
So behebst du den Fehler
- 1.
Bestätigen, dass Subject und Aussteller identisch sind
Stimmt das Subject mit dem Aussteller überein, ist das Zertifikat selbstsigniert; seinen Fingerabdruck vergleichst du mit dem erwarteten Wert.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null \ | openssl x509 -noout -subject -issuer -fingerprint -sha256 # subject == issuer: self-signed - 2.
Für Tests genau diesem Zertifikat vertrauen
Übergibst du das Zertifikat selbst als -CAfile, akzeptiert OpenSSL genau dieses Zertifikat. Bestätige vorher den Fingerabdruck über einen vertrauenswürdigen Kanal.
bash # Trust this exact certificate for a check (after confirming the fingerprint out of band) echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null | openssl x509 -out api.pem echo | openssl s_client -connect api.example.com:443 -servername api.example.com -CAfile api.pem 2>&1 | grep 'Verify return code' - 3.
Root-Zertifikat gegen sich selbst prüfen
Die Prüfung eines selbstsignierten Root-Zertifikats gelingt nur, wenn es selbst der Vertrauensanker ist: Übergib es als -CAfile.
bash # Verifying a root CA certificate itself needs the root as its own trust anchor openssl verify -CAfile root.pem root.pem # root.pem: OK