Mensagem de erro
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Basic Constraints of CA cert not marked critical
Só clientes que ativam a verificação estrita imprimem esta mensagem: o Python 3.13 e posteriores, por padrão, e o openssl verify -x509_strict. O Python acrescenta uma localização no código-fonte, como “(_ssl.c:1082)”.
Python 3.13+ ssl module — VERIFY_X509_STRICT in create_default_context(), X509_V_ERR_CA_BCONS_NOT_CRITICAL
O que significa
O Python 3.13+ verifica com o modo X.509 estrito do OpenSSL, que aplica a regra da RFC 5280 segundo a qual a extensão basicConstraints de um certificado de CA precisa estar marcada como crítica. A CA da sua cadeia tem basicConstraints CA:TRUE, mas a extensão não está marcada como crítica, então o OpenSSL rejeita a cadeia mesmo que a CA seja confiável.
Por que acontece
A CA foi criada a partir de um perfil sem “critical”
comumUma seção de configuração do OpenSSL com basicConstraints = CA:TRUE (em vez de critical,CA:TRUE), ou uma ferramenta de CA com um modelo fora da norma, produz certificados de CA assim.
O cliente passou para o Python 3.13 ou mais recente
comumVersões anteriores do Python não definiam VERIFY_X509_STRICT, então a mesma CA funcionava até a atualização.
Uma CA intermediária da cadeia tem o defeito
ocasionalA verificação vale para todo certificado de CA no caminho, inclusive intermediários emitidos por uma raiz em conformidade com a norma.
Como corrigir
- 1.
Encontrar o certificado fora da norma
Imprima o basicConstraints de cada CA da cadeia; a que não tiver “critical” precisa ser reemitida. O openssl verify -x509_strict mostra todos os problemas do modo estrito.
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.
Reemitir a CA com basicConstraints crítico
Assine de novo o certificado da CA com basicConstraints = critical, CA:TRUE e uma extensão keyUsage. Manter a mesma chave e o mesmo titular permite que os certificados existentes continuem sendo verificados com ele.
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.
Solução temporária: desativar VERIFY_X509_STRICT
Restaura o comportamento anterior ao 3.13 em um único contexto enquanto a CA é corrigida. A verificação da cadeia, das datas de validade e do nome do host continua ativa.
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