Message d’erreur
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Basic Constraints of CA cert not marked critical
Seuls les clients qui activent la vérification stricte affichent ce message : Python 3.13 et les versions ultérieures par défaut, ainsi qu’openssl verify -x509_strict. Python ajoute un emplacement dans le code source, comme « (_ssl.c:1082) ».
Python 3.13+ ssl module — VERIFY_X509_STRICT in create_default_context(), X509_V_ERR_CA_BCONS_NOT_CRITICAL
Ce que cela signifie
Python 3.13+ vérifie avec le mode X.509 strict d’OpenSSL, qui applique la règle de la RFC 5280 selon laquelle l’extension basicConstraints d’un certificat d’AC doit être marquée critique. L’AC de votre chaîne a basicConstraints CA:TRUE sans l’indicateur critical, donc OpenSSL rejette la chaîne alors même que l’AC est approuvée.
Pourquoi cela se produit
L’AC a été créée à partir d’un profil sans « critical »
fréquenteUne section de configuration OpenSSL avec basicConstraints = CA:TRUE (au lieu de critical,CA:TRUE), ou un outil d’AC doté d’un modèle non conforme, produit de tels certificats d’AC.
Le client est passé à Python 3.13 ou à une version plus récente
fréquenteLes versions antérieures de Python ne définissaient pas VERIFY_X509_STRICT : la même AC fonctionnait donc jusqu’à la mise à jour.
Une AC intermédiaire de la chaîne présente le défaut
occasionnelleLa vérification s’applique à chaque certificat d’AC du chemin, y compris aux certificats intermédiaires émis par une racine conforme.
Comment corriger l’erreur
- 1.
Trouver le certificat non conforme
Affichez basicConstraints pour chaque AC de la chaîne ; celle qui n’a pas « critical » doit être réémise. openssl verify -x509_strict affiche tous les problèmes du mode strict.
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.
Réémettre l’AC avec une extension basicConstraints critique
Re-signez le certificat d’AC avec basicConstraints = critical, CA:TRUE et une extension keyUsage. Conserver la même clé et le même sujet permet aux certificats existants de se vérifier par rapport à lui.
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.
Contournement temporaire : retirer VERIFY_X509_STRICT
Rétablit le comportement antérieur à Python 3.13 pour un seul contexte, le temps de corriger l’AC. La vérification de la chaîne, des dates de validité et du nom d’hôte reste active.
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