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.
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.
É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.
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é.
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 /).
[^ 1]: pip est livré avec un certificat racine, donc pip install
fonctionne.
Recommended Posts