urllib et erreur «SSL: CERTIFICATE_VERIFY_FAILED»

279

Je reçois l'erreur suivante:

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: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>

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 m'oblige à utiliser HTTPS. Comment puis-je contourner la vérification?

user3724476
la source
2
Il n'y a rien de mal avec l'URL et elle peut être vérifiée avec succès avec les certificats de confiance communs. Il vaut donc mieux ne pas essayer de contourner la validation du certificat, mais de le corriger. Quelle version de python utilisez-vous?
Steffen Ullrich
Cela peut être lié à stackoverflow.com/a/27826829/3081018 . Le serveur utilise le même type de chaîne de certificats avec plusieurs chemins de confiance. Voir là quel café vous pourriez avoir besoin d'utiliser pour la vérification.
Steffen Ullrich
7
Cette erreur se produit également sur Python 3.5 après la mise à niveau vers yosemite
pyCthon
2
Cela explique la situation. access.redhat.com/articles/2039753
Charlie Burns
4
"Comment puis-je contourner la vérification?" est la mauvaise question. Vous devriez probablement vous demander comment valider le certificat fourni par le domaine.
jww

Réponses:

297

Si vous souhaitez 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 cela, comme indiqué dans la section 17.3.7.2.1

Lors de l'appel direct du constructeur SSLContext, CERT_NONE est la valeur par défaut. Comme il n'authentifie pas l'autre homologue, il peut être non sécurisé, en particulier en mode client où la plupart du temps vous souhaitez 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 simplement que cela fonctionne maintenant pour une autre raison, vous pouvez effectuer les opérations suivantes, vous devrez également le faire 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()  # 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 aucun des problèmes, mais vous ne verrez pas le [SSL: CERTIFICATE_VERIFY_FAILED]car vous ne vérifiez pas le certificat!

Pour ajouter à ce qui précède, si vous voulez en savoir plus sur les raisons pour lesquelles vous voyez ces problèmes, vous voudrez peut-être jeter un œil au PEP 476 .

Ce PEP propose d'activer la vérification des signatures de certificat X509, ainsi que la vérification du nom d'hôte pour les clients HTTP de Python par défaut, sous réserve d'une option de désinscription par appel. Cette modification serait appliquée à Python 2.7, Python 3.4 et Python 3.5.

Il existe une option de désactivation conseillée qui n'est pas différente 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 propose également une option très découragée via le monkeypatching que vous ne voyez pas souvent en python:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

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

Veuillez noter ceci comme indiqué dans le PEP:

Ces conseils s'adressent principalement aux administrateurs système qui souhaitent adopter de nouvelles versions de Python qui implémentent ce PEP dans des environnements hérités qui ne prennent pas encore en charge la vérification des certificats sur les connexions HTTPS. Par exemple, un administrateur peut se retirer en ajoutant le monkeypatch ci-dessus à sitecustomize.py dans son environnement d'exploitation standard pour Python. Les applications et les bibliothèques NE DEVRAIENT PAS rendre ce processus de modification étendu (sauf peut-être en réponse à un paramètre de configuration contrôlé par l'administrateur système).

Si vous voulez lire un article sur pourquoi ne pas valider les certificats est mauvais dans le logiciel, vous pouvez le trouver ici !

Noelkd
la source
1
Donc, si cette erreur m'empêche d'utiliser setup.py uploadcomment puis-je résoudre ce problème?
pyCthon
5
ssl._create_default_https_context = ssl._create_unverified_context cela a fonctionné pour moi comme mentionné par Noelkd vers la fin. Comme le nôtre est un site intranet pour les imprimantes HP ... purement utilisé pour le grattage ... nous n'avons pas de problème avec l'utilisation de cette méthode.
ihightower
Votre première méthode est la moins souhaitable - la validation de contournement. Pourquoi celui qui valide réellement le certificat n'est-il pas répertorié en premier?
jww
1
cela peut également se produire si vous disposez d'une version obsolète d'openSSL. Donc, pour moi, ce qui a fonctionné était la mise à jour vers la version la plus récente certifi et la mise à jour d'OpenSL sur les boîtes.
myusuf3
1
context est ce dont j'avais besoin
priagupd
382

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 Google pour "SSL: CERTIFICATE_VERIFY_FAILED", et cela m'a mené à une chasse aux oies sauvages.

Si vous avez installé Python 3.6 sur OSX et obtenez l'erreur "SSL: CERTIFICATE_VERIFY_FAILED" lorsque vous essayez de vous connecter à un site https: //, c'est probablement parce que Python 3.6 sur OSX n'a ​​aucun certificat et ne peut pas valider de SSL Connexions. Il s'agit d'un changement pour 3.6 sur OSX, et nécessite une étape de post-installation, qui installe le certifipackage de certificats. Ceci est documenté dans le ReadMe, que vous devriez trouver sur/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 contiennent plus d'informations: https://www.python.org/downloads/release/python-360/

Craig Glennie
la source
105
Exécutez directement / Applications / Python \ 3.6 / Install \ Certificates.command pour résoudre mon problème sur OSX. Merci.
muyong
2
J'utilise OS X El Capitan 10.11.6, Python 3.6.0 et cette solution a parfaitement fonctionné.
y2knoproblem
2
J'utilise macOS Sierra 10.12.5, Python 3.6.1 et cette solution a parfaitement fonctionné.
James
4
Cela l'a corrigé pour moi en /Applications/Python\ 3.7/Install\ Certificates.command exécutant cela directement terminal! Merci @CraigGlennie & @muyong J'apprécie d' out-of-the-box-thinkingavoir placé ceci ici!
JayRizzo
6
Python 3.7 sur macOS Mojave: cela ne fonctionne pas ici. J'ai désinstallé / réinstallé / exécuté le certificat d'installation, redémarré, etc. ne fonctionne pas pour moi
Thomas
71

Pour développer la réponse de Craig Glennie:

en Python 3.6.1 sur MacOs Sierra

La saisie de ceci dans le terminal bash a résolu le problème:

pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command
jnPy
la source
3
essayez sudo /Applications/Python\ 3.6/Install\ Certificates.commandsi les autorisations sont refusées.
KingKongCoder
Cela ne résout en fait pas le problème sur Python 3.6. -1
hyperum
1
Si l'utilisation de la ligne de commande vous fait peur (probablement pas si vous êtes ici, mais bon), vous pouvez également trouver le dossier Applications (ou équivalent sur d'autres systèmes d'exploitation) que Python a créé lors de l'installation, puis ouvrez le script en double-cliquant. Le nom spécifique du dossier dépend de la version de Python que vous avez installée.
Erdős-Bacon
Fonctionné comme un charme pour Python 3.7.3. Je vous remercie.
klbytec
Merci. J'ai littéralement cherché des centaines de solutions et la vôtre a fonctionné.
DNN
43

Sous Windows, Python ne regarde pas le certificat système, il utilise le sien situé à ?\lib\site-packages\certifi\cacert.pem.

La solution à votre problème:

  1. téléchargez le certificat de validation de domaine en tant que fichier * .crt ou * pem
  2. ouvrez le fichier dans l'éditeur et copiez son contenu dans le presse-papiers
  3. trouver votre cacert.pememplacement:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
  4. modifiez le cacert.pemfichier et collez votre certificat de validation de domaine à la fin du fichier.
  5. Enregistrez le fichier et profitez des demandes!
Bruno Gabuzomeu
la source
6
lib\site-packages\certifi\cacert.pemn'existe pas dans Python 2.7.10. Et la question est de urllib2ne pasrequests
Kevin Smyth
2
La meilleure solution jusqu'à présent, l'API Twitter utilise le certificat DigiCert qui n'est pas dans le fichier cacert.pem de mon python. J'y ai ajouté et VOILA!
digz6666
2
A travaillé sur Debian. Pour les enregistrements, le chemin du fichier sur mon système était: /usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem. Merci!
ofavre
Malheureusement, les requêtes python n'utilisent aucun magasin de clés de confiance de CA du système d'exploitation. github.com/requests/requests/issues/2966 . Vous devez définir REQUESTS_CA_BUNDLE github.com/bloomreach/s4cmd/issues/111#issuecomment-406839514 .
jamshid
Fonctionne sur Windows 10, Python 3.6, avec les API Google et Twitter et le module de requêtes en général.
brittenb
36

Ma solution pour Mac OS X:

1) Mettez à niveau vers Python 3.6.5 à l'aide du programme d'installation natif de l'application Python téléchargé à partir du site Web officiel en 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 homebrew.

2) Installez un nouveau certificat à l'aide de "./Install Certificates.command" qui se trouve dans le répertoire Python 3.6 actualisé

> cd "/Applications/Python 3.6/"
> sudo "./Install Certificates.command"
Claude COULOMBE
la source
Fonctionne comme un charme sous Mac OS X.
Manu mathew
31

Vous pouvez essayer d'ajouter ceci à vos variables d'environnement:

PYTHONHTTPSVERIFY=0 

Notez que cela désactivera toutes les vérifications HTTP, c'est donc un peu une approche de marteau, mais si la vérification n'est pas requise, cela peut être une solution efficace.

Chris Halcrow
la source
17
Je soupçonne que la désactivation de toute la vérification HTTP pour l'ensemble de python est un peu excessive pour traiter une erreur de vérification. Il existe de nombreux cas dans lesquels on peut souhaiter une vérification par défaut.
trevorKirkby
A travaillé pour moi sur Windows Server 2016 sur python 2.7.13. Normalement, je n'ai pas python installé sur les serveurs Windows, mais j'en avais besoin pour une mise à niveau de vCenter avec la migration Nexus 1000v vers VDS, et cela résout simplement le problème avec un certificat vCenter auto-signé pour le moment (utilisera VMCA et des certificats valides dans environnement amélioré). Je n'ai pas eu de chance d'obtenir le certificat pour être accepté en éditant le cacert.pem dans le package de demande python
Christopher Thorjussen
3
De plus, j'ai défini la variable directement dans la fenêtre de ligne de commande avant d'exécuter le script, donc cela ne désactivera pas toutes les vérifications comme @ quelqu'un ou l'autre ont peur, ce que je ne recommanderais pas non plus.
Christopher Thorjussen
C'est parfait pour mon cas d'utilisation: les tests. Je ne ferais jamais cela en production, mais pour exécuter des tests qui n'ont rien à voir avec SSL, c'est une excellente option.
sorin
Merci, cette solution l'a fait pour moi: import os os.environ ["PYTHONHTTPSVERIFY"] = "0"
mbello
29

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

Ma solution a été d' pip install certifiinstaller certifi, ce qui a:

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

Ensuite, dans mon code où je venais juste d'avoir:

import urllib.request as urlrq

resp = urlrq.urlopen('https://example.com/bar/baz.html')

Je l'ai révisé pour:

import urllib.request as urlrq
import certifi

resp = urlrq.urlopen('https://example.com/bar/baz.html', cafile=certifi.where())

Si je lis correctement la urllib2.urlopendocumentation , elle contient également un cafileargument. Donc, cela urllib2.urlopen([...], certifi.where())pourrait aussi fonctionner pour Python 2.7.


MISE À JOUR (2020-01-01): Depuis Python 3.6, l' cafileargument to urlopena été déprécié , l' contextargument étant censé être spécifié à la place. J'ai trouvé que ce qui suit fonctionnait aussi bien sur les versions 3.5 à 3.8:

import urllib.request as urlrq
import certifi
import ssl

resp = urlrq.urlopen('https://example.com/bar/baz.html', context=ssl.create_default_context(cafile=certifi.where()))
hBy2Py
la source
1
load_verify_locationsmute l' SSLContextinstance et retourne None. Vous devez utiliser à la context=ssl.create_default_context(cafile=certifi.where())place. Voir la ssldocumentation pour plus d'informations.
ostrokach
1
@ostrokach Huh, j'ai essayé quelque chose comme ça, mais j'ai dû utiliser la mauvaise sslfonction. Voir modifier; D'accord?
hBy2Py
13
import requests
requests.packages.urllib3.disable_warnings()

import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates 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

Prostak
la source
testé cette solution dans l'environnement Jenkins, environnement personnel, ça marche!
rapport89
2
Ceci est extrêmement dangereux car il contourne TOUTE la vérification des certificats, utilisez à vos risques et périls et pour l'amour de QUELQU'UN, n'utilisez pas cela dans le code de production.
dragon788
Merci. Enfin ça a marché. Il n'est pas nécessaire que Python 3.6 soit installé sous / Applications sur Mac OS. Ce devrait être la réponse acceptée.
Biranchi
Vous ne devriez jamais faire un tel monkeypatching. Il est extrêmement dangereux et affectera toute utilisation en aval du code.
Acumenus
10

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 certificat. La vérification utilisée par OpenSSL est incompatible avec les certificats racine de confiance que vous avez sur votre système. OpenSSL est utilisé par Python.

Vous pouvez essayer d'obtenir le certificat manquant pour Verisign Class 3 Public Primary Certification Authority , puis utiliser l' cafileoption selon la documentation Python :

urllib2.urlopen(req, cafile="verisign.pem")
Steffen Ullrich
la source
Pouvez-vous m'aider à résoudre ce problème pertinent dans le lien de
Aucun
8

J'ai eu un problème similaire sur l'une de mes machines Linux. La génération de nouveaux certificats et l'exportation d'une variable d'environnement pointant vers le répertoire des certificats l'a corrigé pour moi:

$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs
ritiek
la source
7

Je dois ajouter une autre réponse car, tout comme Craig Glennie, j'ai fait 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 être un problème Python était en fait un problème MacPorts: il n'installe pas de certificat racine avec son installation d'openssl. La solution consiste à port install curl-ca-bundle, comme mentionné dans cet article de blog .

corwin.amber
la source
5

J'ai trouvé ça ici

J'ai trouvé cette solution, insérez ce code au début de votre fichier source:

import ssl

try:
   _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

Ce code annule la vérification afin que la certification SSL ne soit pas vérifiée.

Ganesh Chowdhary Sadanala
la source
voir cette vidéo ça m'a beaucoup aidé à comprendre ce qu'est le SSL. URL de la vidéo: youtu.be/dsuVPxuU_hc
Ganesh Chowdhary Sadanala
4

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

  1. Copiez le CA.crt dans /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract
Cherif KAOUA
la source
2
Peut être une question stupide, mais qu'est-ce que CA.crt et où puis-je le trouver?
Iqbal
4

Solution pour Anaconda

Ma configuration est Anaconda Python 3.7 sur MacOS avec un proxy. Les chemins sont différents.

  • Voici comment obtenir le chemin de certificats correct :
import ssl
ssl.get_default_verify_paths()

qui sur mon système a produit

Out[35]: DefaultVerifyPaths(cafile='/miniconda3/ssl/cert.pem', capath=None,
 openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/miniconda3/ssl/cert.pem',
 openssl_capath_env='SSL_CERT_DIR', openssl_capath='/miniconda3/ssl/certs')

Une fois que vous savez où va le certificat, vous concaténez le certificat utilisé par le proxy à la fin de ce fichier.

J'avais déjà configuré conda pour travailler avec mon proxy, en exécutant:

conda config --set ssl_verify <pathToYourFile>.crt

Si vous ne vous souvenez pas où se trouve votre certificat, vous pouvez le trouver dans ~/.condarc:

ssl_verify: <pathToYourFile>.crt

Maintenant, concaténez ce fichier à la fin de /miniconda3/ssl/cert.pem et les demandes devraient fonctionner, et en particuliersklearn.datasets des outils similaires devraient fonctionner.

Autres mises en garde

Les autres solutions n'ont pas fonctionné car la configuration d'Anaconda est légèrement différente:

  • Le chemin Applications/Python\ 3.Xn'existe tout simplement pas.

  • Le chemin fourni par les commandes ci-dessous est le mauvais chemin

from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH
Leo
la source
3

Je pends la tête en semi-honte, car j'ai eu le même problème, sauf que dans mon cas, l'URL que je tapais était valide, le certificat était valide. Ce qui n'était pas valable, c'était ma connexion au Web. Je n'avais pas réussi à ajouter les détails du proxy dans le navigateur (IE dans ce cas). Cela a empêché le processus de vérification de se dérouler correctement.
Ajouté dans les détails du proxy et mon python était alors très content.

Les publicités
la source
1
Ne pendez pas la tête de honte pour avoir oublié quelque chose, puis compris et partagé, quelqu'un pourrait trouver cela utile. Utiliser IE cependant ... dommage: p
Davos
3

Python 2.7.12 (par défaut, 29 juillet 2016, 15:26:22) a résolu le problème mentionné. Ces informations pourraient aider quelqu'un d'autre.

caot
la source
3
Je l'ai rencontré le 2.7.12 sur mac, en utilisant la bibliothèque urllib2, l'utilisation de la bibliothèque de requets semble bien
marcadian
@marcadian L'installation et l'utilisation certifi, qui est apparemment une égratignure des certificats détenus par requests, ont résolu le problème pour moi sur Python 3.4 à 3.6 .
hBy2Py
3

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 bonne partie:

  • Sur Mac, Apple abandonne OpenSSL
  • Python utilise désormais son propre ensemble de certificats racine CA
  • L'installation de Python binaire a fourni un script pour installer les besoins Python du certificat racine CA ("/ 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 ces installations certifi et openssl n'ont pas pu être corrigées également. Peut-être parce que j'ai plusieurs installations python 2 et 3, ainsi que de nombreux 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 <your virtualenv>/site-package/certifi/cacert.pem \
  /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem

Si cela vous échoue encore. Réinstallez ensuite OpenSSL également.

port install openssl
berniey
la source
2

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

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

Mes programmes fonctionnaient bien sans problèmes de certificat SSL et soudainement (après avoir téléchargé des programmes), ils se sont plantés 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, intitulé Certificate verification and OpenSSL [CHANGED for Python 2.7.9], /Applications/Python 2.7/ReadMe.rtfexplique le problème avec de nombreux détails.

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

Thierry Maillard
la source
2

Python 2.7 sur Amazon EC2 avec centOS 7

J'ai dû définir la variable env SSL_CERT_DIRpour pointer vers mon ca-bundlequi était situé à/etc/ssl/certs/ca-bundle.crt

Brian McCall
la source
Votre réponse m'a conduit sur la bonne voie pour moi. Sur ubuntu, je devais mettre SSL_CERT_DIRà /etc/ssl/certs, et a également fait que le ca-certificatespaquet a été installé et à jour.
Norman Breau
1

Essayer

pip install --trusted-host pypi.python.org nom_package

Ça a marché pour moi.

swapnilghorpade
la source
1

Jeter un coup d'œil à

/ Applications / Python 3.6 / Installer Certificates.command

Vous pouvez également aller sur Aplications et cliquer sur Certificates.command

Danielle Cohen
la source
1

Dans mon cas , je recevais cette erreur , car requestset urllib3étaient incompatibles, donnant des versions l'erreur suivante lors de l' installation:

ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.
pip install 'urllib3<1.25' --force-reinstall

a fait l'affaire.

fabio.sang
la source
1

Une autre solution Anaconda. J'obtenais CERTIFICATE_VERIFY_FAILED dans mon environnement Python 2.7 sur macOS. Il s'avère que les chemins de conda étaient mauvais:

environnement de base (3.7):

>>> import ssl
>>> ssl.get_default_verify_paths()
DefaultVerifyPaths(cafile='/usr/local/anaconda3/ssl/cert.pem', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/ssl/certs')

2.7 environnement (les chemins n'existaient pas!):

DefaultVerifyPaths(cafile='', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/envs/py27/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/envs/py27/ssl/certs')

La solution:

cd /usr/local/anaconda3/envs/py27/
mkdir ssl
cd ssl
ln -s ../../../ssl/cert.pem
Peter Tseng
la source
1

L'erreur SSL: CERTIFICATE_VERIFY_FAILED peut également se produire car un certificat intermédiaire est manquant dans le ca-certificatespackage sous Linux. Par exemple, dans mon cas, le certificat intermédiaire " DigiCert SHA2 Secure Server CA " était manquant dans le ca-certificatespackage même si le navigateur Firefox l'inclut. Vous pouvez savoir quel certificat est manquant en exécutant directement la wgetcommande sur l'URL à l'origine de cette erreur. Ensuite, vous pouvez rechercher le lien correspondant vers le fichier CRT pour ce certificat sur le site officiel (par exemple https://www.digicert.com/digicert-root-certificates.htm dans mon cas) de l'autorité de certification. Maintenant, pour inclure le certificat manquant dans votre cas, vous pouvez exécuter les commandes ci-dessous en utilisant votre lien de téléchargement de fichier CRT à la place:

wget https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt

mv DigiCertSHA2SecureServerCA.crt DigiCertSHA2SecureServerCA.der

openssl x509 -inform DER -outform PEM -in DigiCertSHA2SecureServerCA.der -out DigicertSHA2SecureServerCA.pem.crt

sudo mkdir /usr/share/ca-certificates/extra

sudo cp DigicertSHA2SecureServerCA.pem.crt /usr/share/ca-certificates/extra/

sudo dpkg-reconfigure ca-certificates

Après cela, vous pouvez tester à nouveau avec wgetvotre URL ainsi qu'en utilisant le urllibpackage python . Pour plus de détails, consultez: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242

WebDev
la source
0

Si vous êtes sur vCenter 6, vous devez plutôt ajouter le certificat d'autorité de certification vmware de votre vCenter à la liste des autorités de certification de confiance de votre système d'exploitation. Pour télécharger votre certificat, 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 Trusted Root CA

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-certificate-vcenter-6.aspx?m=1
  2. http://forums.fedoraforum.org/showthread.php?t=293856
nobler1050
la source
Il a déclaré qu'il était sous OS X, pas vCenter 6.
jww
0

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

sudo easy_install pip

utilisez l'option ignorer installé pour ignorer la désinstallation de la version précédente de six, sinon, cela donne une erreur lors de la désinstallation et ne fait pas avancer le film

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 certificat SSL avant d'installer le livre d'exemples, sinon nous certifierons l'erreur lors de l'installation des exemples

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

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

Narasimha Sai
la source
0

L'installation à l' PyOpenSSLaide a pipfonctionné pour moi (sans conversion en PEM):

pip install PyOpenSSL
averma93
la source
0

J'ai résolu ce problème en fermant Fiddler (un proxy de débogage HTTP), vérifiez si vous avez un proxy activé et réessayez.

vperezb
la source
0

Dans python 2.7, l'ajout des détails de l'autorité de certification racine de confiance à la fin dans le fichier C: \ Python27 \ lib \ site-packages \ certifi \ cacert.pem a 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 files.pythonhosted.org packageName

MD5
la source