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

  1. Öffnen Sie Ihren Webbrowser.
  2. Navigiere zu https: //
  3. Klicken Sie in der unteren rechten Ecke auf den Link Vertrauenswürdige Stammzertifizierungsstelle herunterladen

Auf Fedora

  1. Entpacken und ändern Sie die Erweiterung von .0 auf .cer
  2. Kopiere es nach / etc / pki / ca-trust / source / anchors /
  3. Führen Sie den Befehl update-ca-trust aus.

Links:

  1. https://virtualizationreview.com/articles/2015/04/02/install-root-self-signed-certificate-vcenter-6.aspx?m=1
  2. http://forums.fedoraforum.org/showthread.php?t=293856

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:

  1. Kein Problem mit https://www.python.org/downloads und python-2.7.9-macosx10.6.pkg

  2. 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 :

  1. Kopieren Sie die CA.crt nach /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract




urllib