Fehlermeldung
verify error:num=21:unable to verify the first certificate
Auch ausgegeben als
- Verify return code: 21 (unable to verify the first certificate)
openssl s_client gibt den Fehler als „verify error:num=21:…“ und „Verify return code: 21 (…)“ aus. Node.js meldet denselben Zustand als UNABLE_TO_VERIFY_LEAF_SIGNATURE („unable to verify the first certificate“).
OpenSSL CLI (openssl s_client) — X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE
Was der Fehler bedeutet
OpenSSL-Fehler 21 (X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE): Die Kette besteht aus einem einzigen Zertifikat, dem eigenen des Servers, und dessen Aussteller wurde nicht gefunden, deshalb lässt sich nicht einmal die Signatur des Leaf-Zertifikats prüfen. s_client gibt direkt davor meist Fehler 20 für Tiefe 0 aus. Die Lösung liegt fast immer beim Server: Er muss sein Zwischenzertifikat senden.
Warum der Fehler auftritt
Der Server ist nur mit dem Leaf-Zertifikat konfiguriert
häufigcert.pem statt fullchain.pem, ein Zertifikat, das ohne seine Kette in einen Load Balancer eingefügt wurde, oder ein Eintrag in einem Java-Keystore, der ohne die ausstellende CA importiert wurde.
Die Kette ist konfiguriert, wird aber nicht gesendet
gelegentlichManche Server brauchen die Kette in einer eigenen Direktive oder einem eigenen Feld (SSLCertificateChainFile bei älterem Apache, das Feld für die Kette bei einem Cloud-Load-Balancer); ein Bundle an der falschen Stelle wird stillschweigend ignoriert.
Der Server sendet ein Zwischenzertifikat, das nicht der Aussteller des Leaf-Zertifikats ist
gelegentlichNachdem eine CA ihre Zwischenzertifikate gewechselt hat, sendet eine alte Kettendatei ein Zertifikat, das nicht der Aussteller des Leaf-Zertifikats ist; OpenSSL kann es dann nicht verwenden.
So behebst du den Fehler
- 1.
Prüfen, was der Server sendet
Ein einzelnes Zertifikat, dessen Aussteller (i:) eine Zwischen-CA ist, bestätigt das Problem.
bash openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' - 2.
Leaf-Zertifikat und Zwischenzertifikate ausliefern
Hänge das Leaf-Zertifikat und das oder die ausstellenden Zwischenzertifikate in der richtigen Reihenfolge aneinander und konfiguriere den Server mit dieser Datei; gib das Bundle aus, um die Reihenfolge zu prüfen.
bash # Build the file the server should use: leaf, then intermediates (issuer of each previous one) cat server.pem intermediate.pem > fullchain.pem openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout # check the order - 3.
Richtiges Zwischenzertifikat finden
Die Erweiterung Authority Information Access des Leaf-Zertifikats nennt die URL des Ausstellerzertifikats; lade es herunter, konvertiere es bei Bedarf in PEM und füge es der Kettendatei hinzu.
bash # Where to download the missing intermediate: the leaf's Authority Information Access URL openssl x509 -in server.pem -noout -ext authorityInfoAccess curl -sS -o intermediate.der http://ca.example.com/issuing-ca.crt openssl x509 -inform der -in intermediate.der -out intermediate.pem