Python >> Tutoriel Python >  >> Python Tag >> Requests

Impossible d'obtenir le certificat de l'émetteur local lors de l'utilisation de requêtes en python

Ce n'est pas recommandé utiliser verify = False dans les environnements de votre organisation. Cela désactive essentiellement la vérification SSL.

Parfois, lorsque vous êtes derrière un proxy d'entreprise, il remplace la chaîne de certificats par celles de Proxy. L'ajout des certificats dans cacert.pem utilisé par certifi devrait résoudre le problème. J'ai eu un problème similaire. Voici ce que j'ai fait pour résoudre le problème -

  1. Trouvez le chemin où se trouve cacert.pem -

Installez certifi, si vous n'en avez pas. Commande :pip install certifi

import certifi
certifi.where()
C:\\Users\\[UserID]\\AppData\\Local\\Programs\\Python\\Python37-32\\lib\\site-packages\\certifi\\cacert.pem
  1. Ouvrez l'URL sur un navigateur. Téléchargez la chaîne de certificats à partir de l'URL et enregistrez-la sous forme de fichiers .cer encodés en Base64.

  2. Ouvrez maintenant le cacert.pem dans un bloc-notes et ajoutez simplement chaque contenu de certificat téléchargé (---Begin Certificate--- *** ---End Certificate--- ) à la fin.


Si vous avez déjà essayé de mettre à jour le certificat CA (racine) à l'aide de pip :

pip install --upgrade certifi

ou avez déjà téléchargé la dernière version de cacert.pem depuis https://curl.haxx.se/docs/caextract.html et remplacé l'ancienne dans {Python_Installation_Location}\\lib\\site-packages\\certifi\\cacert.pem mais cela ne fonctionne toujours pas, alors il manque probablement à votre client le certificat intermédiaire dans la chaîne de confiance.

La plupart des navigateurs peuvent télécharger automatiquement le certificat intermédiaire à l'aide de l'URL dans la section "Accès aux informations d'autorité" du certificat, mais Python, Java et openssl s_client ne le peuvent pas. Ils comptent sur le serveur pour leur envoyer de manière proactive le certificat intermédiaire.

Si vous parlez chinois vous pouvez lire ce blog génial :https://www.cnblogs.com/sslwork/p/5986985.html et utiliser cet outil pour vérifier si le certificat intermédiaire est envoyé par/installé sur le serveur ou non :https ://www.myssl.cn/tools/check-server-cert.html

Si ce n'est pas le cas, vous pouvez consulter cet article :https://www.ssl.com/how-to/install-intermediate-certificates-avoid-ssl-tls-not-trusted/

Nous pouvons également utiliser openssl sous Linux pour vérifier ce problème :

openssl s_client -connect garis.com.mx:444

Le message d'erreur est même le même -- "unable to get local issuer certificate". Je doute que "local" signifie ici "intermédiaire".

Ma solution actuelle à ce problème ressemble à la suggestion de @ Indranil (https://stackoverflow.com/a/57466119/4522434):Exporter le certificat intermédiaire dans le navigateur en utilisant le format base64 X.509 CER; puis utilisez Notepad++ pour l'ouvrir et copiez le contenu à la fin de cacert.pem dans {Python_Installation_Location}\\lib\\site-packages\\certifi\\cacert.pem


Si vous utilisez macOS, recherchez le fichier « Install Certificates.command » (il se trouve généralement dans Macintosh HD> Applications> your_python_dir).

Vous pouvez également le trouver avec "command" + "break space" et coller "Install Certificates.command" dans le champ.

Si vous avez utilisé brew pour installer python, votre solution est là :brew installation of Python 3.6.1 :[SSL :CERTIFICATE_VERIFY_FAILED] certificate verification failed