urllib et erreur «SSL: CERTIFICATE_VERIFY_FAILED»

Je reçois cette erreur

Exception in thread Thread-3: Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner self.run() File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run self.__target(*self.__args, **self.__kwargs) File "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", line 271, in process info = urllib2.urlopen(req).read() File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen return opener.open(url, data, timeout) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open response = self._open(req, data) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open '_open', req) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain result = func(*args) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open context=self._context) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open raise URLError(err) URLError:  

C’est le code qui provoque cette erreur:

 if input.startswith("!web"): input = input.replace("!web ", "") url = "https://domainsearch.p.mashape.com/index.php?name=" + input req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXX' }) info = urllib2.urlopen(req).read() Message.Chat.SendMessage ("" + info) 

L’API que j’utilise nécessite que je utilise le https. Comment puis-je le faire contourner la vérification?

    Si vous voulez simplement contourner la vérification, vous pouvez créer un nouveau SSLContext . Par défaut, les nouveaux contextes créés utilisent CERT_NONE .

    Soyez prudent avec ceci comme indiqué dans la section 17.3.7.2.1

    Lorsque vous appelez directement le constructeur SSLContext, CERT_NONE est la valeur par défaut. Comme il n’authentifie pas l’autre pair, il peut être peu sûr, en particulier en mode client où vous souhaitez, la plupart du temps, garantir l’authenticité du serveur auquel vous parlez. Par conséquent, en mode client, il est fortement recommandé d’utiliser CERT_REQUIRED.

    Mais si vous voulez juste que cela fonctionne maintenant pour une autre raison, vous pouvez faire ce qui suit, vous devrez également import ssl :

     input = input.replace("!web ", "") url = "https://domainsearch.p.mashape.com/index.php?name=" + input req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' }) gcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1) # Only for gangstars info = urllib2.urlopen(req, context=gcontext).read() Message.Chat.SendMessage ("" + info) 

    Cela devrait contourner votre problème mais vous ne résolvez pas vraiment les problèmes, mais vous ne verrez pas le [SSL: CERTIFICATE_VERIFY_FAILED] car vous ne le faites pas maintenant!

    Pour append à ce qui précède, si vous souhaitez en savoir plus sur les raisons pour lesquelles vous rencontrez ces problèmes, vous voudrez consulter le PEP 476 .

    Ce PEP propose d’activer la vérification des signatures de certificate X509, ainsi que la vérification du nom d’hôte pour les clients HTTP de Python par défaut, sous réserve de la désactivation par appel. Ce changement serait appliqué à Python 2.7, Python 3.4 et Python 3.5.

    Il y a un retrait conseillé qui n’est pas différent de mes conseils ci-dessus:

     import ssl # This restores the same behavior as before. context = ssl._create_unverified_context() urllib.urlopen("https://no-valid-cert", context=context) 

    Il comporte également une option fortement déconseillée via Monkeypatching que vous ne voyez pas souvent dans Python:

     import ssl ssl._create_default_https_context = ssl._create_unverified_context 

    Qui remplace la fonction par défaut pour la création de contexte avec la fonction pour créer un contexte non vérifié.

    Si vous voulez lire un article sur les raisons pour lesquelles la validation des certs est une mauvaise chose dans le logiciel, vous pouvez la trouver ici !

    Ce n’est pas une solution à votre problème spécifique, mais je le mets ici parce que ce fil est le meilleur résultat de Google pour “SSL: CERTIFICATE_VERIFY_FAILED”, et il me conduit à une chasse aux oies sauvage.

    Si vous avez installé Python 3.6 sur OSX et que vous obtenez l’erreur “SSL: CERTIFICATE_VERIFY_FAILED” lorsque vous tentez de vous connecter à un site https: //, c’est probablement parce que Python 3.6 sous OSX ne possède aucun certificate et ne peut valider aucun SSL les liaisons. Ceci est une modification de la version 3.6 sur OSX et nécessite une étape de post-installation, qui installe le package de certificates de certificates. Ceci est documenté dans le fichier Lisez-moi que vous devriez trouver dans /Applications/Python\ 3.6/ReadMe.rtf

    Le ReadMe vous fera exécuter ce script de post-installation, qui installe simplement certifi : /Applications/Python\ 3.6/Install\ Certificates.command

    Les notes de version ont quelques informations supplémentaires: https://www.python.org/downloads/release/python-360/

    Sous Windows, Python ne regarde pas le certificate du système, il utilise son propre fichier situé sous ?\lib\site-packages\certifi\cacert.pem .

    La solution à votre problème:

    1. télécharger le certificate de validation de domaine en tant que fichier * .crt ou * pem
    2. ouvrir le fichier dans l’éditeur et copier son contenu dans le presse-papier
    3. Trouvez votre emplacement cacert.pem : from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH) from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
    4. éditez le fichier cacert.pem et collez votre certificate de validation de domaine à la fin du fichier.
    5. Enregistrez le fichier et profitez des demandes!

    Pour développer la réponse de Craig Glennie (désolé, pas assez de réputation pour commenter):

    dans Python 3.6.1 sur MacOs Sierra

    Entrer ceci dans le terminal bash a résolu le problème:

     pip install certifi /Applications/Python\ 3.6/Install\ Certificates.command 

    Vous pouvez essayer d’append ceci à vos variables d’environnement:

     PYTHONHTTPSVERIFY=0 

    Notez que cela désactivera toute vérification HTTP, ce qui constitue une approche simpliste, mais si la vérification n’est pas nécessaire, cela peut être une solution efficace.

    Ma solution pour Mac OS X:

    1) Mise à niveau vers Python 3.6.5 en utilisant le programme d’installation natif de l’application Python téléchargé depuis le site officiel de la langue Python https://www.python.org/downloads/

    J’ai trouvé que ce programme d’installation s’occupe de mettre à jour les liens et les liens symboliques pour le nouveau Python beaucoup mieux que l’homebrew.

    2) Installez un nouveau certificate en utilisant “./Install Certificates.command” qui se trouve dans le répertoire Python 3.6 actualisé.

     > cd "/Applications/Python 3.6/" > sudo "./Install Certificates.command" 
     import requests requests.packages.urllib3.disable_warnings() import ssl try: _create_unverified_https_context = ssl._create_unverified_context except AtsortingbuteError: # Legacy Python that doesn't verify HTTPS certificatees by default pass else: # Handle target environment that doesn't support HTTPS verification ssl._create_default_https_context = _create_unverified_https_context 

    Tiré d’ici https://gist.github.com/michaelrice/a6794a017e349fc65d01

    Comme je l’ai écrit dans un commentaire, ce problème est probablement lié à cette réponse SO .

    En bref: il existe plusieurs façons de vérifier le certificate. La vérification utilisée par OpenSSL est incompatible avec les certificates racine de confiance que vous avez sur votre système. OpenSSL est utilisé par Python.

    Vous pouvez essayer d’obtenir le certificate manquant pour l’autorité de certificateion publique primaire de classe 3 de Verisign , puis utiliser l’option cafile conformément à la documentation Python :

     urllib2.urlopen(req, cafile="verisign.pem") 

    J’avais un problème similaire, bien que j’utilisais urllib.request.urlopen dans Python 3.4, 3.5 et 3.6 . (Ceci est une partie de l’équivalent Python 3 de urllib2 , conformément à la note en tête de la page de documentation urllib2 de Python 2.)

    Ma solution consistait à pip install certifi pour installer le certifi , qui a:

    … une collection de certificates racine soigneusement organisée pour valider la fiabilité des certificates SSL tout en vérifiant l’identité des hôtes TLS.

    Ensuite, dans mon code où je viens juste d’avoir:

     import urllib.request as urlrq resp = urlrq.urlopen('https://foo.com/bar/baz.html') 

    Je l’ai révisé à:

     import urllib.request as urlrq import certifi resp = urlrq.urlopen('https://foo.com/bar/baz.html', cafile=certifi.where()) 

    Si je lis correctement la documentation urllib2.urlopen , elle contient également un argument cafile . Ainsi, urllib2.urlopen([...], certifi.where()) peut également fonctionner avec Python 2.7.

    Pour Python 3.4+ sur Centos 6/7, Fedora , installez simplement l’autorité de certificateion de cette façon:

    1. Copiez le fichier CA.crt dans /etc/pki/ca-trust/source/anchors/
    2. update-ca-trust force-enable
    3. update-ca-trust extract

    J’ai la tête dans la demi-honte, car j’avais le même problème, sauf que dans mon cas, l’URL que je frappais était valide, le certificate était valide. Ce qui n’était pas valable était ma connexion au web. Je n’ai pas réussi à append les détails du proxy dans le navigateur (IE dans ce cas). Cela a empêché le processus de vérification de se produire correctement.
    Ajouté dans les détails du proxy et mon python était alors très content.

    Comme vous, j’utilise python 2.7 sur mon ancien iMac (OS X 10.6.8), j’ai également rencontré le problème en utilisant urllib2.urlopen:

     urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] 

    Mes programmes fonctionnaient correctement sans problèmes de certificate SSL et soudainement (après les programmes de téléchargement), ils sont tombés en panne avec cette erreur SSL.

    Le problème était la version de python utilisée:

    1. Pas de problème avec https://www.python.org/downloads et python-2.7.9-macosx10.6.pkg

    2. problème avec celui installé par l’ outil Homebrew : “brew install python”, version située dans / usr / local / bin.

    Un chapitre, appelé Certificate verification and OpenSSL [CHANGED for Python 2.7.9] , dans /Applications/Python 2.7/ReadMe.rtf explique le problème avec de nombreux détails.

    Alors, vérifiez, téléchargez et mettez dans votre PATH la bonne version de python.

    Essayer

    pip install –trusted-host pypi.python.org packagename

    Cela a fonctionné pour moi.

    Je suis surpris que toutes ces instructions n’aient pas résolu mon problème. Néanmoins, le diagnostic est correct (BTW, j’utilise Mac et Python3.6.1). Donc, pour résumer la partie correcte:

    • Sur Mac, Apple abandonne OpenSSL
    • Python utilise désormais son propre ensemble de certificates racine CA
    • L’installation de Python binary a fourni un script pour installer le certificate CA Root requirejs par Python (“/ Applications / Python 3.6 / Install Certificates.command”)
    • Lisez “/ Applications / Python 3.6 / ReadMe.rtf” pour plus de détails.

    Pour moi, le script ne fonctionne pas, et toutes les installations certifi et openssl ont échoué. Peut-être parce que j’ai plusieurs installations de python 2 et 3, ainsi que de nombreuses virtualenv. À la fin, je dois le réparer à la main.

     pip install certifi # for your virtualenv mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl cp -a /site-package/certifi/cacert.pem \ /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem 

    Si cela vous échoue encore. Ensuite, réinstallez OpenSSL également.

     port install openssl 

    Je dois append une autre réponse parce que, tout comme Craig Glennie, je suis allé à une chasse aux oies sauvages en raison des nombreux messages faisant référence à ce problème sur le Web.

    J’utilise MacPorts et ce que je pensais à l’origine d’un problème Python était en fait un problème MacPorts: il n’installe pas de certificate racine avec l’installation de openssl. La solution consiste à port install curl-ca-bundle , comme mentionné dans cet article .

    Jeter un coup d’œil à

    / Applications / Python 3.6 / Installer les certificates.command

    Vous pouvez aussi aller à Applications et cliquer sur Certificates.command

    Si vous êtes sur vCenter 6, vous devriez plutôt append le certificate de votre autorité de certificateion vCenter de vCenter à la liste des autorités de certificateion de confiance de votre système d’exploitation. Pour télécharger votre certificate, procédez comme suit

    1. Ouvrez votre navigateur Web.
    2. Accédez à https: //
    3. Dans le coin inférieur droit, cliquez sur le lien Télécharger l’autorité de certificateion racine de confiance

    Sur Fedora

    1. décompressez et changez l’extension de .0 à .cer
    2. Copiez-le dans / etc / pki / ca-trust / source / anchors /
    3. Exécutez la commande update-ca-trust.

    Liens:

    1. https://virtualizationreview.com/articles/2015/04/02/install-root-self-signed-certificatee-vcenter-6.aspx?m=1
    2. http://forums.fedoraforum.org/showthread.php?t=293856

    Python 2.7.12 (par défaut, 29 juillet 2016, 15:26:22) a corrigé le problème mentionné. Cette information pourrait aider quelqu’un d’autre.

    étapes d’installation pour nltk (j’avais déjà installé python3 (3.6.2) dans MAC OS X)

     sudo easy_install pip 

    utilisez l’option Ignorer l’installation pour ignorer la désinstallation de la version précédente à six, sinon, cela génère une erreur lors de la désinstallation et ne fait pas de vidéo

     sudo pip3 install -U nltk --ignore-installed six 

    Vérifiez l’installation de pip et python, utilisez les versions ‘3’

     which python python2 python3 which pip pip2 pip3 

    Vérifiez si NLTK est installé

     python3 import nltk nltk.__path__ ['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk'] 

    Installez le certificate SSL avant d’installer le livret d’exemples, sinon nous commettrons une erreur lors de l’installation des exemples

     /Applications/Python\ 3.6/Install\ Certificates.command python3 -m nltk.downloader book 

    Cela a terminé l’installation de nltk et nltk_ata avec succès pour des exemples de livres

    L’installation de PyOpenSSL utilisant pip fonctionné pour moi (sans conversion en PEM):

     pip install PyOpenSSL 

    Ce problème a été résolu en fermant Fiddler (un proxy de débogage HTTP), vérifiez si vous avez un proxy activé et réessayez.

    Python 2.7 sur Amazon EC2 avec centOS 7

    Je devais définir la variable env SSL_CERT_DIR pour qu’elle pointe vers mon ca-bundle situé dans /etc/ssl/certs/ca-bundle.crt

    Dans python 2.7, append les détails de l’autorité de certificateion racine de confiance à la fin dans le fichier C: \ Python27 \ lib \ site-packages \ certifi \ cacert.pem aidé

    Après cela, j’ai exécuté (en utilisant les droits d’administrateur) pip install –trusted-host pypi.python.org –trusted-host pypi.org –trusted-host

    ln -s /usr/local/share/certs/ca-root-nss.crt /etc/ssl/cert.pem

    ( FreeBSD 10.1 )