CERTIFICATE_VERIFY_FAILED in Python 3.6, dem offiziellen Installationsprogramm für macOS

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.

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

Problem

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.

Ursache

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.

Ansatz

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.

von jetzt an

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.

Referenz

[^ 1]: pip wird mit einem Root-Zertifikat ausgeliefert, daher funktioniert "pip install".

Recommended Posts

CERTIFICATE_VERIFY_FAILED in Python 3.6, dem offiziellen Installationsprogramm für macOS
MongoDB mit Python zum ersten Mal
Tipps zum Erreichen der ATND-API mit Python
So führen Sie Python im virtuellen Raum aus (für MacOS)
Finde Fehler in Python
OpenCV3-Installation für Python3 @macOS
Techniken zum Sortieren in Python
Über "für _ in range ():" von Python
Überprüfen Sie die Funktionsweise von Python für .NET in jeder Umgebung
[In kürzester Zeit verstehen] Python-Grundlagen für die Datenanalyse
Google sucht mit Python nach der Zeichenfolge in der letzten Zeile der Datei
Überprüfen Sie Python auf Speicherlecks
Abrufen der arXiv-API in Python
Suchen Sie mit Python nach externen Befehlen
Python im Browser: Brythons Empfehlung
Speichern Sie die Binärdatei in Python
Klicken Sie in Python auf die Sesami-API
Holen Sie sich den Desktop-Pfad in Python
Holen Sie sich den Skriptpfad in Python
Im Python-Befehl zeigt Python auf Python3.8
Implementieren Sie das Singleton-Muster in Python
Klicken Sie auf die Web-API in Python
Siehe Python zum ersten Mal
Ich habe die Warteschlange in Python geschrieben
Berechnen Sie den Vormonat in Python
Untersuchen Sie die Klasse eines Objekts mit Python
Holen Sie sich den Desktop-Pfad in Python
Wofür ist der Python-Unterstrich (_)?
Führen Sie unittest in Python aus (für Anfänger)
Holen Sie sich den Hostnamen in Python
Greifen Sie mit Python auf die Twitter-API zu
Der erste Schritt von Python Matplotlib
Ich habe den Stack in Python geschrieben
Befehl für das aktuelle Verzeichnis Python
Beherrsche das schwache Ref-Modul in Python
Holen Sie sich das Tickersymbol für eine an der US-Börse notierte Aktie in Python
Wrap (Teil der) AtCoder Library in Cython zur Verwendung in Python
Ändern Sie automatisch die Größe von Screenshots für den App Store für jeden Bildschirm in Python
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
Dockerfile mit den notwendigen Bibliotheken für die Verarbeitung natürlicher Sprache mit Python
Versuchen Sie vorerst, FireBase Cloud Firestore mit Python zu verwenden
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Entwurfsmuster "Builder" mit Python
Laden Sie das Remote-Python-SDK mit IntelliJ
Einführung in das BOT-Framework Minette für Python
Versuchen Sie es mit der Wunderlist-API in Python
Python-Entwicklungsumgebung für macOS mit venv 2016
Überprüfen Sie das Verhalten des Zerstörers in Python
Hinzufügen von Kv-Sprachsyntax-Highlights zu Spyder in Python IDE
Lernen Sie das Designmuster "Flyweight" in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
Lernen Sie das Entwurfsmuster "Observer" in Python
Lernen Sie das Entwurfsmuster "Memento" mit Python
[Python] Süß Ist es süß? Über Suiten und Ausdrücke in offiziellen Dokumenten
Lernen Sie das Entwurfsmuster "Proxy" in Python
Anmerkung von nfc.ContactlessFrontend () von nfcpy von Python
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Inject wird für DDD in Python empfohlen