Der Inhalt dieses Artikels ist alle in ** Wichtige Informationen ** des Installationsprogramms geschrieben, aber ich werde ihn verlassen, weil ich süchtig danach bin, wenn ich es nicht bemerke.
Wenn ich versuche, die Webseite "https: //" mit "urllib.request.urlopen ()" unter Verwendung von Python 3.6 abzurufen, das mit dem offiziellen Installationsprogramm für macOS auf python.org installiert ist, wird folgende Fehlermeldung angezeigt: Tritt ein.
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)>
Andere Module, die das ssl-Modul verwenden, sollten beim Überprüfen von Serverzertifikaten ähnliche Fehler erhalten.
Da die unter macOS installierte Standard-OpenSSL seit Python 3.6 zu alt ist, enthält das Installationsprogramm für macOS OpenSSL und die OpenSSL des Systems wird nicht mehr referenziert.
Infolgedessen wird nicht auf das im Betriebssystem installierte Stammzertifikat verwiesen, und das Stammzertifikat ist unmittelbar nach der Installation nicht im Status [^ 1] enthalten. Infolgedessen schlägt die Überprüfung des TLS-Serverzertifikats fehl.
Der folgende Befehl lädt das Modul certifi herunter und verweist auf das darin enthaltene Stammzertifikat.
$ /Applications/Python\ 3.6/Install\ Certificates.command
Vor der Ausführung:
$ ls -l /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/
Nach der Ausführung:
$ 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
In diesem Fall heißt es, dass Sie die Mailingliste für das Certifi-Projekt abonnieren müssen, um sie ordnungsgemäß zu aktualisieren, wenn das Stammzertifikat erneuert wird.
Der aktuelle Status, in dem Benutzer ihre Zertifikate einzeln aktualisieren müssen, ist nicht wünschenswert. Daher DSAS Developer's Room: Aktueller Python-Entwickler (2017-03) Stellen Sie Betriebssystemzertifikate mit anderen TLS-Implementierungen als OpenSSL zur Verfügung, die in /archives/2017-03/python-dev-201703.html] [PEP 543](https: //www.python) zu finden sind. Ich denke, es wird zur Geschichte von org / dev / peps / pep-0543 /) führen.
[^ 1]: pip wird mit einem Root-Zertifikat ausgeliefert, daher funktioniert "pip install".
Recommended Posts