CERTIFICATE_VERIFY_FAILED dans Python 3.6, le programme d'installation officiel de macOS

Le contenu de cet article est écrit en ** Informations importantes ** de l'installateur, mais je le laisserai car j'en suis accro si je ne le remarque pas.

Pythonインストーラーの大切な情報

problème

Quand j'essaye d'obtenir la page Web https: // avec ʻurllib.request.urlopen () ʻen utilisant Python 3.6 installé avec le programme d'installation officiel pour macOS distribué sur python.org, j'obtiens l'erreur suivante: Se produit.

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 1318, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1285, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1234, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1026, in _send_output
    self.send(msg)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 964, in send
    self.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1400, in connect
    server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 401, in wrap_socket
    _context=self, _session=session)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 808, in __init__
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 1061, in do_handshake
    self._sslobj.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 683, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 526, in open
    response = self._open(req, data)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 544, in _open
    '_open', req)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 1361, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/urllib/request.py", line 1320, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)>

Les autres modules qui utilisent le module ssl devraient recevoir des erreurs similaires lors de la validation des certificats de serveur.

Cause

Étant donné que l'OpenSSL standard installé sur macOS est trop ancien, depuis Python 3.6, le programme d'installation pour macOS inclut OpenSSL et l'OpenSSL du système n'est plus référencé.

Par conséquent, le certificat racine installé dans le système d'exploitation n'est pas référencé et le certificat racine n'est pas inclus dans l'état immédiatement après l'installation [^ 1]. Par conséquent, la validation du certificat du serveur TLS échoue.

approche

La commande suivante téléchargera le module certifi et référencera le certificat racine qu'il contient.

$ /Applications/Python\ 3.6/Install\ Certificates.command

Avant l'exécution:

$ ls -l /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/

Après exécution:

$ ls -l /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/
total 8
lrwxr-xr-x  1 orange  admin  52  3 22 23:00 cert.pem -> ../../lib/python3.6/site-packages/certifi/cacert.pem

Dans ce cas, il est conseillé de s'abonner à la liste de diffusion du projet certifi afin de se mettre à jour correctement lorsque le certificat racine est renouvelé.

à partir de maintenant

L'état actuel dans lequel les utilisateurs doivent mettre à jour leurs certificats individuellement n'est pas souhaitable, donc DSAS Developer's Room: Recent Python-dev (2017-03) Rendre les certificats de système d'exploitation disponibles à l'aide d'implémentations TLS autres qu'OpenSSL trouvées dans /archives/2017-03/python-dev-201703.html] [PEP 543](https: //www.python. Je pense que cela mènera à l'histoire de org / dev / peps / pep-0543 /).

référence

[^ 1]: pip est livré avec un certificat racine, donc pip install fonctionne.

Recommended Posts

CERTIFICATE_VERIFY_FAILED dans Python 3.6, le programme d'installation officiel de macOS
MongoDB avec Python pour la première fois
Conseils pour accéder à l'API ATND avec Python
Comment exécuter python dans l'espace virtuel (pour MacOS)
Trouver des erreurs en Python
Installation d'OpenCV3 pour Python3 @macOS
Techniques de tri en Python
À propos de "for _ in range ():" de python
Vérifiez le fonctionnement de Python pour .NET dans chaque environnement
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Google recherche la chaîne sur la dernière ligne du fichier en Python
Rechercher les fuites de mémoire dans Python
Obtenir l'API arXiv en Python
Rechercher des commandes externes avec python
Python dans le navigateur: la recommandation de Brython
Enregistrez le fichier binaire en Python
Frappez l'API Sesami en Python
Obtenez le chemin du bureau en Python
Obtenez le chemin du script en Python
Dans la commande python, python pointe vers python3.8
Implémenter le modèle Singleton en Python
Accédez à l'API Web en Python
Voir python pour la première fois
J'ai écrit la file d'attente en Python
Calculer le mois précédent en Python
Examiner la classe d'un objet avec python
Obtenez le chemin du bureau en Python
À quoi sert le trait de soulignement Python (_)?
Exécutez unittest en Python (pour les débutants)
Obtenez le nom d'hôte en Python
Accéder à l'API Twitter avec Python
La première étape de Python Matplotlib
J'ai écrit la pile en Python
Commande pour le répertoire courant Python
Maîtriser le module lowref en Python
Obtenez le symbole boursier d'une action cotée en bourse américaine en Python
Envelopper (partie de) la bibliothèque AtCoder en Cython pour une utilisation en Python
Redimensionner automatiquement les captures d'écran de l'App Store pour chaque écran en Python
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Dockerfile avec les bibliothèques nécessaires pour le traitement du langage naturel avec python
Essayez d'utiliser FireBase Cloud Firestore avec Python pour le moment
Apprenez le modèle de conception "Prototype" avec Python
Apprenez le modèle de conception "Builder" avec Python
Charger le SDK Python distant avec IntelliJ
Présentation du framework BOT Minette pour Python
Essayez d'utiliser l'API Wunderlist en Python
Environnement de développement Python pour macOS utilisant venv 2016
Vérifiez le comportement du destroyer en Python
Ajouter des points forts de la syntaxe du langage Kv à Spyder dans Python IDE
Apprenez le modèle de conception "Flyweight" en Python
Essayez d'utiliser l'API Kraken avec Python
Apprenez le modèle de conception "Observer" en Python
Apprenez le modèle de conception "Memento" avec Python
[Python] Doux Est-ce doux? À propos des suites et des expressions dans les documents officiels
Apprenez le modèle de conception "Proxy" en Python
Note de nfc.ContactlessFrontend () de nfcpy de python
Ecrire le test dans la docstring python
Inject est recommandé pour DDD en Python