requests - python3 ssl certificate_verify_failed
urllib und "SSL: CERTIFICATE_VERIFY_FAILED" Fehler (20)
Ich erhalte den folgenden Fehler:
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)>
Dies ist der Code, der diesen Fehler verursacht:
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)
Für die von mir verwendete API muss ich HTTPS verwenden. Wie kann ich die Überprüfung umgehen?
Installationsschritte für nltk (ich hatte python3 (3.6.2) bereits in MAC OS X installiert)
pip install certifi
Verwenden Sie die Option Installierte ignorieren, um die Deinstallation der vorherigen Version von Sechs zu ignorieren. Andernfalls wird beim Deinstallieren ein Fehler angezeigt und kein Film weitergeleitet
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
Überprüfen Sie die Installation von Pip und Python und verwenden Sie die '3'-Versionen
sudo pip3 install -U pyopenssl
sudo pip3 install certifi
Überprüfen Sie, ob NLTK installiert ist
import requests
from requests.auth import HTTPBasicAuth
import certifi
auth = HTTPBasicAuth('username', 'password')
body = {}
r = requests.post(url='https://your_url.com', data=body, auth=auth, verify='/usr/lib/python3.6/site-packages/certifi/cacert.pem')
Installieren Sie das SSL-Zertifikat vor der Installation des Beispielbuchs. Andernfalls wird bei der Installation der Beispiele ein Zertifikatfehler ausgegeben
ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.
Damit wurde die Installation von nltk und nltk_ata für Buchbeispiele erfolgreich abgeschlossen
Lösung für Anaconda
Mein Setup ist Anaconda Python 3.7 unter MacOS mit einem Proxy. Die Wege sind unterschiedlich.
- So erhalten Sie den richtigen Zertifikatspfad:
urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]
was auf meinem system produziert
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
Wenn Sie wissen, wo sich das Zertifikat befindet, verknüpfen Sie das vom Proxy verwendete Zertifikat mit dem Ende dieser Datei.
Ich hatte conda bereits für die Arbeit mit meinem Proxy eingerichtet, indem ich Folgendes ausführte:
port install openssl
Wenn Sie sich nicht erinnern können, wo sich Ihr Zertifikat befindet, finden Sie es in
~/.condarc
:
import ssl
ssl.get_default_verify_paths()
Verknüpfen Sie
diese Datei nun bis zum Ende von
/miniconda3/ssl/cert.pem
und Requests sollten funktionieren, insbesondere
sklearn.datasets
und ähnliche Tools.
Weitere Vorsichtsmaßnahmen
Die anderen Lösungen haben nicht funktioniert, da sich das Anaconda-Setup geringfügig unterscheidet:
-
Der Pfad
Applications/Python\ 3.X
einfach nicht. -
Der von den folgenden Befehlen bereitgestellte Pfad ist der FALSCHE Pfad
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')
Die Installation von certifi auf einem Mac hat mein Problem gelöst:
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')
Dies ist keine Lösung für Ihr spezielles Problem, aber ich schreibe es hier, weil dieser Thread das beste Google-Ergebnis für "SSL: CERTIFICATE_VERIFY_FAILED" ist und mich auf eine wilde Gänsejagd geführt hat.
Wenn Sie Python 3.6 unter OSX installiert haben und den Fehler "SSL: CERTIFICATE_VERIFY_FAILED" erhalten, wenn Sie versuchen, eine Verbindung zu einer https: // - Site herzustellen, liegt dies wahrscheinlich daran, dass Python 3.6 unter OSX überhaupt keine Zertifikate hat und kein SSL validieren kann Verbindungen.
Dies ist eine Änderung für 3.6 unter OSX und erfordert einen Schritt nach der Installation, bei dem das
certifi
von
certifi
installiert wird.
Dies ist in der ReadMe-
/Applications/Python\ 3.6/ReadMe.rtf
dokumentiert, die Sie unter
/Applications/Python\ 3.6/ReadMe.rtf
In der Infodatei müssen Sie dieses Skript nach der Installation
certifi
, mit dem nur
certifi
:
/Applications/Python\ 3.6/Install\ Certificates.command
Versionshinweise enthalten weitere Informationen: https://www.python.org/downloads/release/python-360/
Ich bin überrascht, dass all diese Anweisungen mein Problem nicht gelöst haben. Trotzdem ist die Diagnose korrekt (BTW, ich benutze Mac und Python3.6.1). Also, um den richtigen Teil zusammenzufassen:
- Auf dem Mac legt Apple OpenSSL ab
- Python verwendet jetzt einen eigenen Satz von CA-Stammzertifikaten
- Bei der binären Python-Installation wurde ein Skript zum Installieren des von Python benötigten CA-Stammzertifikats bereitgestellt ("/ Applications / Python 3.6 / Install Certificates.command").
- Lesen Sie "/ Applications / Python 3.6 / ReadMe.rtf" für Details
Bei mir funktioniert das Skript nicht und alle diese Installationen von certifi und openssl konnten auch nicht repariert werden. Vielleicht, weil ich mehrere Python 2- und 3-Installationen sowie viele VirtualenV habe. Am Ende muss ich es von Hand reparieren.
ssl_verify: <pathToYourFile>.crt
Wenn das immer noch nicht klappt. Dann installieren Sie OpenSSL ebenfalls neu.
from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH
Ich bin halb beschämt, da ich das gleiche Problem hatte, außer dass in meinem Fall die URL, die ich getroffen habe, gültig war und das Zertifikat gültig war.
Was nicht gültig war, war meine Verbindung zum Internet.
Ich konnte keine Proxy-Details zum Browser hinzufügen (in diesem Fall IE).
Dies verhinderte, dass der Überprüfungsprozess korrekt ablief.
Hinzugefügt in den Proxy-Details und mein Python war dann sehr glücklich.
Ich hatte ein ähnliches Problem auf einem meiner Linux-Rechner. Das Generieren neuer Zertifikate und das Exportieren einer Umgebungsvariablen, die auf das Zertifikatsverzeichnis verweist, hat dies für mich behoben:
sudo easy_install pip
Ich hatte ein ähnliches Problem, obwohl ich
urllib.request.urlopen
in
Python 3.4, 3.5 und 3.6 verwendete
.
(Dies ist ein Teil des Python 3-Äquivalents von
urllib2
gemäß dem Hinweis am
urllib2
der
urllib2
Dokumentationsseite
von Python 2.)
Meine Lösung bestand
pip install certifi
zu installieren,
pip install certifi
zu installieren.
... eine sorgfältig zusammengestellte Sammlung von Stammzertifikaten zur Überprüfung der Vertrauenswürdigkeit von SSL-Zertifikaten und zur Überprüfung der Identität von TLS-Hosts.
Dann in meinem Code, wo ich vorher gerade hatte:
import urllib.request as urlrq
resp = urlrq.urlopen('https://foo.com/bar/baz.html')
Ich habe es überarbeitet zu:
import urllib.request as urlrq
import certifi
resp = urlrq.urlopen('https://foo.com/bar/baz.html', cafile=certifi.where())
Wenn ich die
urllib2.urlopen
Dokumentation
richtig
urllib2.urlopen
, hat sie auch ein
cafile
Argument.
Daher
urllib2.urlopen([...], certifi.where())
möglicherweise auch für Python 2.7.
In Python 2.7 wurde das Hinzufügen vertrauenswürdiger Stammzertifizierungsstellendetails am Ende der Datei C: \ Python27 \ lib \ site-packages \ certifi \ cacert.pem unterstützt
Danach habe ich die Pip-Installation ausgeführt (mit Administratorrechten)
In meinem Fall habe ich diesen Fehler erhalten, weil
requests
und
urllib3
Versionen nicht kompatibel waren, wodurch während der Installation der folgende Fehler
urllib3
:
which python python2 python3
which pip pip2 pip3
python3
import nltk
nltk.__path__
['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk']
hat den Trick gemacht.
Python 2.7 auf Amazon EC2 mit CentOS 7
Ich musste die env-Variable
SSL_CERT_DIR
, dass sie auf mein
ca-bundle
/etc/ssl/certs/ca-bundle.crt
ca-bundle
das sich unter
/etc/ssl/certs/ca-bundle.crt
Python 2.7.12 (Standard, 29. Juli 2016, 15:26:22) hat das erwähnte Problem behoben. Diese Informationen könnten jemand anderem helfen.
Sie könnten versuchen, dies zu Ihren Umgebungsvariablen hinzuzufügen:
PYTHONHTTPSVERIFY=0
Beachten Sie, dass hierdurch alle HTTP-Überprüfungen deaktiviert werden. Dies ist ein Vorschlaghammer-Ansatz. Wenn jedoch keine Überprüfung erforderlich ist, ist dies möglicherweise eine effektive Lösung.
So erweitern Sie die Antwort von Craig Glennie:
in Python 3.6.1 auf MacOs Sierra
Die Eingabe in das Bash-Terminal löste das Problem:
pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command
Versuchen
pip install --trusted-host pypi.python.org Paketname
Es hat bei mir funktioniert.
Wenn Sie
mechanize
und auf diese Frage stoßen, können Sie dieselbe Technik auf eine mechanize-Browser-Instanz anwenden:
>>> 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')
Wenn Sie vCenter 6 verwenden, sollten Sie stattdessen das Zertifikat der vMware-Zertifizierungsstelle von vCenter zur Liste der vertrauenswürdigen Zertifizierungsstellen Ihres Betriebssystems hinzufügen. Um Ihr Zertifikat herunterzuladen, gehen Sie wie folgt vor
- Öffnen Sie Ihren Webbrowser.
- Navigiere zu https: //
- Klicken Sie in der unteren rechten Ecke auf den Link Vertrauenswürdige Stammzertifizierungsstelle herunterladen
Auf Fedora
- Entpacken und ändern Sie die Erweiterung von .0 auf .cer
- Kopiere es nach / etc / pki / ca-trust / source / anchors /
- Führen Sie den Befehl update-ca-trust aus.
Links:
Wie Sie verwende ich Python 2.7 auf meinem alten iMac (OS X 10.6.8). Das Problem habe ich auch mit urllib2.urlopen gelöst:
conda config --set ssl_verify <pathToYourFile>.crt
Meine Programme liefen ohne Probleme mit SSL-Zertifikaten einwandfrei und stürzten plötzlich (nach dem Herunterladen von Programmen) mit diesem SSL-Fehler ab.
Das Problem war die Version von Python:
-
Kein Problem mit https://www.python.org/downloads und python-2.7.9-macosx10.6.pkg
-
Problem mit dem von Homebrew installierten Tool : "brew install python", Version in / usr / local / bin.
In einem Kapitel mit dem Titel
Certificate verification and OpenSSL [CHANGED for Python 2.7.9]
in
/Applications/Python 2.7/ReadMe.rtf
das Problem mit vielen Details erläutert.
Überprüfen Sie also, laden Sie die richtige Version von Python herunter und geben Sie sie in PATH ein.
Eine weitere Anaconda-Lösung. Ich habe CERTIFICATE_VERIFY_FAILED in meiner Python 2.7-Umgebung unter macOS erhalten. Es stellte sich heraus, dass die Conda-Pfade schlecht waren:
Basisumgebung (3.7):
/Applications/Python\ 3.6/Install\ Certificates.command
python3 -m nltk.downloader book
2.7 Umgebung (Pfade existierten nicht!):
pip install PyOpenSSL
Die Reparatur:
br = mechanize.Browser()
context = ssl._create_unverified_context()
br.set_ca_data(context=context)
Installieren Sie für Python 3.4+ unter Centos 6/7, Fedora , die vertrauenswürdige Zertifizierungsstelle folgendermaßen :
-
Kopieren Sie die CA.crt nach
/etc/pki/ca-trust/source/anchors/
-
update-ca-trust force-enable
-
update-ca-trust extract