Aller au contenu
ecdsa.com
Python ssl module (OpenSSL)cryptography (Python)

Message d’erreur

[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain

Également affiché sous la forme

  • [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain

OpenSSL 3 affiche « self-signed », OpenSSL 1.1.1 « self signed » ; Python ajoute un emplacement dans le code source, comme « (_ssl.c:1082) ». Via urllib, le message apparaît dans « <urlopen error …> », via requests dans « Max retries exceeded … (Caused by SSLError(…)) ».

Python ssl module (OpenSSL) — ssl.SSLCertVerificationError, X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN (19)

Ce que cela signifie

La chaîne présentée par le serveur se termine par un certificat racine auto-signé qui ne figure pas parmi les AC auxquelles ce processus Python fait confiance. La chaîne elle-même est complète ; la racine est simplement inconnue. Lorsque cela se produit pour des sites publics comme pypi.org ou api.github.com, la racine appartient à un proxy d’inspection TLS ou à un antivirus présent sur votre réseau ou sur votre machine.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Identifier à qui appartient la racine

    Affichez la chaîne d’un hôte public. Une racine qui porte le nom de votre entreprise ou d’un produit de sécurité est celle à laquelle faire confiance ; un nom inconnu sur un réseau non fiable est une raison de s’arrêter, pas de lui faire confiance.

    bash
    openssl s_client -connect pypi.org:443 -servername pypi.org -showcerts </dev/null 2>/dev/null \
      | grep -E '^ *[0-9]+ s:|^ *i:'
    # A top certificate named after your company or a security vendor = interception proxy
  2. 2.

    Vérifier avec le magasin de confiance du système d’exploitation

    truststore.inject_into_ssl() fait reposer le TLS de Python sur le magasin de confiance du système d’exploitation, qui contient déjà les racines déployées par votre organisation. C’est la correction la plus propre sur les machines Windows et macOS gérées.

    python
    # pip install truststore==0.10.5
    import truststore
    truststore.inject_into_ssl()   # the proxy root deployed in the OS store is now trusted
    
    import requests
    requests.get("https://api.example.com/")
  3. 3.

    Constituer un fichier d’AC avec les racines publiques et votre racine

    REQUESTS_CA_BUNDLE (requests) et SSL_CERT_FILE (ssl, urllib, httpx) remplacent le fichier d’AC par défaut : concaténez donc les racines de certifi avec la racine de l’entreprise au lieu de pointer uniquement vers la racine de l’entreprise.

    bash
    # Keep the public roots and add the company/proxy root
    cat "$(python3 -m certifi)" corp-root-ca.pem > ~/.config/corp-ca-bundle.pem
    export REQUESTS_CA_BUNDLE=~/.config/corp-ca-bundle.pem   # requests
    export SSL_CERT_FILE=~/.config/corp-ca-bundle.pem        # ssl, urllib, httpx
  4. 4.

    conda : configurer son propre paramètre

    conda lit ssl_verify dans .condarc ; faites-le pointer vers le fichier d’AC combiné pour que conda install et conda update fonctionnent derrière le proxy.

    bash
    # conda keeps its own OpenSSL and CA bundle
    conda config --set ssl_verify /path/to/corp-ca-bundle.pem

Erreurs associées

Parcourir toute la base de données des erreurs de signature