Fehlermeldung
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Basic Constraints of CA cert not marked critical
Diese Meldung geben nur Clients aus, die die strikte Prüfung aktivieren: Python 3.13 und neuer standardmäßig sowie openssl verify -x509_strict. Python hängt eine Quellcode-Position wie „(_ssl.c:1082)“ an.
Python 3.13+ ssl module — VERIFY_X509_STRICT in create_default_context(), X509_V_ERR_CA_BCONS_NOT_CRITICAL
Was der Fehler bedeutet
Python 3.13+ prüft im strikten X.509-Modus von OpenSSL, der die Regel aus RFC 5280 durchsetzt, dass die Erweiterung basicConstraints eines CA-Zertifikats als kritisch markiert sein muss. Die CA in deiner Kette hat basicConstraints CA:TRUE ohne das Flag critical, deshalb lehnt OpenSSL die Kette ab, obwohl der CA vertraut wird.
Warum der Fehler auftritt
Die CA wurde aus einem Profil ohne „critical“ erstellt
häufigEin Abschnitt der OpenSSL-Konfiguration mit basicConstraints = CA:TRUE (statt critical,CA:TRUE) oder ein CA-Tool mit einer nicht konformen Vorlage erzeugt solche CA-Zertifikate.
Der Client ist auf Python 3.13 oder neuer umgestiegen
häufigFrühere Python-Versionen setzten VERIFY_X509_STRICT nicht, deshalb funktionierte dieselbe CA bis zum Upgrade.
Eine Zwischen-CA in der Kette hat den Mangel
gelegentlichDie Prüfung gilt für jedes CA-Zertifikat im Pfad, auch für Zwischenzertifikate, die von einer konformen Root-CA ausgestellt wurden.
So behebst du den Fehler
- 1.
Nicht konformes Zertifikat finden
Gib basicConstraints für jede CA in der Kette aus; diejenige ohne „critical“ muss neu ausgestellt werden. openssl verify -x509_strict zeigt alle Probleme im strikten Modus.
bash openssl x509 -in ca.pem -noout -ext basicConstraints # X509v3 Basic Constraints: <- no "critical" here is the problem # CA:TRUE openssl verify -x509_strict -CAfile ca.pem server.pem - 2.
CA mit als kritisch markiertem basicConstraints neu ausstellen
Signiere das CA-Zertifikat neu mit basicConstraints = critical, CA:TRUE und einer Erweiterung keyUsage. Behältst du denselben Schlüssel und dasselbe Subject bei, lassen sich bestehende Zertifikate weiterhin dagegen prüfen.
bash 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 - 3.
Übergangslösung: VERIFY_X509_STRICT entfernen
Stellt für einen einzelnen Kontext das Verhalten vor 3.13 wieder her, solange die CA korrigiert wird. Die Prüfung von Kette, Gültigkeitszeitraum und Hostname bleibt aktiv.
python # Temporary workaround until the CA is reissued (chain, dates and name are still checked) import ssl ctx = ssl.create_default_context(cafile="ca.pem") ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT