Fehlermeldung
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: CA cert does not include key usage extension
Erscheint nach einem Upgrade auf Python 3.13 oder neuer; frühere Versionen setzen das Strict-Flag nicht. Danach folgt eine Quellcode-Position wie „(_ssl.c:1082)“. openssl verify -x509_strict meldet dieselbe Prüfung als „error 92 at 1 depth lookup: CA cert does not include key usage extension“.
Python 3.13+ ssl module — VERIFY_X509_STRICT in create_default_context(), X509_V_ERR_CA_CERT_MISSING_KEY_USAGE (92)
Was der Fehler bedeutet
Seit Python 3.13 aktiviert ssl.create_default_context() die strikten X.509-Prüfungen von OpenSSL (VERIFY_X509_STRICT). Eine davon verlangt, wie RFC 5280 es vorschreibt, dass jedes CA-Zertifikat eine Erweiterung keyUsage enthält, die das Signieren von Zertifikaten erlaubt. Dein CA-Zertifikat hat kein keyUsage, deshalb wird eine Kette, die unter Python 3.12 funktionierte, jetzt abgelehnt, obwohl der CA ausdrücklich vertraut wird.
Warum der Fehler auftritt
Eine mit einem schlichten openssl req -x509 erstellte CA
häufigDie Standardkonfiguration von OpenSSL versieht selbstsignierte Zertifikate mit basicConstraints, aber nicht mit keyUsage. Unzählige Anleitungen erstellen private CAs genau auf diese Weise, ebenso manche Test-Fixtures und Entwicklungstools.
Der Client ist auf Python 3.13 oder neuer umgestiegen
häufigDas Zertifikat hat sich nicht geändert, die prüfende Seite ist strenger geworden. Container-Basis-Images und CI-Runner, die auf python:3.13+ umsteigen, bringen das Problem ans Licht, ohne dass sich an der PKI etwas geändert hat.
Ältere interne PKI oder CAs von Appliances
gelegentlichManche von Appliances erzeugte und ältere Unternehmens-CA-Zertifikate lassen keyUsage weg. In Clients ohne strikte Prüfungen funktionieren solche Zertifikate weiterhin.
So behebst du den Fehler
- 1.
Feststellen, welche Erweiterung fehlt
Gib basicConstraints und keyUsage der CA aus und führe openssl verify -x509_strict aus, um alle Fehler des strikten Modus auf einmal zu sehen.
bash openssl x509 -in ca.pem -noout -ext basicConstraints,keyUsage # Same strict checks as Python 3.13+, without Python: openssl verify -x509_strict -CAfile ca.pem server.pem - 2.
CA-Zertifikat mit keyUsage neu ausstellen
Signiere die CA neu mit keyUsage = critical, keyCertSign, cRLSign (und basicConstraints als critical). Behältst du denselben Schlüssel und dasselbe Subject bei, bilden die bereits von ihr ausgestellten Zertifikate weiterhin eine Kette zum neuen CA-Zertifikat; verteile die neue CA-Datei an die Clients.
bash # A CA certificate with the extensions RFC 5280 requires openssl req -x509 -new -key ca.key -days 3650 -subj "/CN=Example Private CA" \ -addext "basicConstraints=critical,CA:TRUE" \ -addext "keyUsage=critical,keyCertSign,cRLSign" \ -out ca.pem # Reusing the old key and subject keeps already issued certificates verifiable. - 3.
Übergangslösung: VERIFY_X509_STRICT für diesen Kontext entfernen
Das Entfernen des Flags stellt für einen einzelnen Kontext das Verhalten von Python 3.12 wieder her. Das ist nicht dasselbe wie eine abgeschaltete Prüfung, aber es werden Zertifikate akzeptiert, die gegen RFC 5280 verstoßen; nimm die Änderung zurück, sobald die CA korrigiert ist.
python # Temporary workaround while the CA is reissued: the chain, dates and host name # are still verified, only the RFC 5280 profile checks are relaxed. import ssl ctx = ssl.create_default_context(cafile="ca.pem") ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
Verwandte Fehler
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Basic Constraints o…Python 3.13+ ssl module[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Missing Authority K…Python 3.13+ ssl module[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local…Python ssl module (OpenSSL)