Pular para o conteúdo
ecdsa.com
Python 3.13+ ssl modulePython (cryptography)

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

Como corrigir

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

Erros relacionados

Ver toda a base de erros de assinatura