Zum Inhalt springen
ecdsa.com
Python 3.13+ ssl modulePython cryptography

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

So behebst du den Fehler

  1. 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. 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. 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

Gesamte Signaturfehler-Datenbank durchsuchen