urllib und "SSL: CERTIFICATE_VERIFY_FAILED" Fehler

279

Ich erhalte die folgende Fehlermeldung:

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?

user3724476
quelle
2
An der URL ist nichts auszusetzen, und sie kann mit den allgemeinen vertrauenswürdigen Zertifikaten erfolgreich überprüft werden. Sie sollten also besser nicht versuchen, die Zertifikatsüberprüfung zu umgehen, sondern sie zu beheben. Welche Python-Version verwenden Sie?
Steffen Ullrich
Dies könnte mit stackoverflow.com/a/27826829/3081018 zusammenhängen . Der Server verwendet dieselbe Art von Zertifikatkette mit mehreren Vertrauenspfaden. Sehen Sie dort, welches Cafile Sie möglicherweise zur Überprüfung verwenden müssen.
Steffen Ullrich
7
Dieser Fehler tritt auch bei Python 3.5 nach dem Upgrade auf yosemite
pyCthon am
2
Dies erklärt die Situation. access.redhat.com/articles/2039753
Charlie Burns
4
"Wie kann ich die Überprüfung umgehen?" ist die falsche Frage. Sie sollten sich wahrscheinlich fragen, wie Sie das von der Domain bereitgestellte Zertifikat validieren können.
JWW

Antworten:

296

Wenn Sie nur die Überprüfung umgehen möchten, können Sie einen neuen SSLContext erstellen . Standardmäßig verwenden neu erstellte Kontexte CERT_NONE .

Seien Sie vorsichtig damit, wie in Abschnitt 17.3.7.2.1 angegeben

Wenn Sie den SSLContext-Konstruktor direkt aufrufen, ist CERT_NONE die Standardeinstellung. Da der andere Peer nicht authentifiziert wird, kann er unsicher sein, insbesondere im Client-Modus, in dem Sie die Authentizität des Servers, mit dem Sie sprechen, meistens sicherstellen möchten. Im Client-Modus wird daher dringend empfohlen, CERT_REQUIRED zu verwenden.

Aber wenn Sie nur möchten, dass es jetzt aus einem anderen Grund funktioniert, können Sie Folgendes tun: import ssl auch:

input = input.replace("!web ", "")      
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' })
gcontext = ssl.SSLContext()  # Only for gangstars
info = urllib2.urlopen(req, context=gcontext).read()
Message.Chat.SendMessage ("" + info)

Dies sollte Ihr Problem [SSL: CERTIFICATE_VERIFY_FAILED]umgehen , aber Sie lösen keines der Probleme wirklich, aber Sie werden das nicht sehen, weil Sie das Zertifikat jetzt nicht verifizieren!

Wenn Sie mehr darüber erfahren möchten, warum diese Probleme auftreten, sollten Sie einen Blick darauf werfen PEP 476 .

In diesem PEP wird vorgeschlagen, die Überprüfung von X509-Zertifikatsignaturen sowie die Überprüfung des Hostnamens für die HTTP-Clients von Python standardmäßig zu aktivieren, sofern die Deaktivierung pro Anruf erfolgt. Diese Änderung wird auf Python 2.7, Python 3.4 und Python 3.5 angewendet.

Es gibt ein empfohlenes Opt-out, das meinem obigen Rat nicht unähnlich ist:

import ssl

# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)

Es bietet auch eine sehr entmutigte Option über Monkeypatching, die Sie in Python nicht oft sehen:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

Dadurch wird die Standardfunktion für die Kontexterstellung mit der Funktion zum Erstellen eines nicht verifizierten Kontexts überschrieben.

Bitte beachten Sie dazu, wie im PEP angegeben:

Diese Anleitung richtet sich in erster Linie an Systemadministratoren, die neuere Versionen von Python verwenden möchten, die dieses PEP in älteren Umgebungen implementieren, die die Zertifikatsüberprüfung für HTTPS-Verbindungen noch nicht unterstützen. Ein Administrator kann sich beispielsweise abmelden, indem er den obigen Monkeypatch zu sitecustomize.py in seiner Standardbetriebsumgebung für Python hinzufügt. Anwendungen und Bibliotheken sollten diesen Änderungsprozess NICHT umfassend durchführen (außer möglicherweise als Reaktion auf eine vom Systemadministrator kontrollierte Konfigurationseinstellung).

Wenn Sie einen Artikel darüber lesen möchten, warum das Nicht-Validieren von Zertifikaten in Software schlecht ist, finden Sie ihn hier !

Noelkd
quelle
1
Wenn dieser Fehler mich davon abhält, setup.py uploadwie kann ich das beheben?
PyCthon
5
ssl._create_default_https_context = ssl._create_unverified_context das hat bei mir funktioniert, wie von Noelkd gegen Ende erwähnt. Da es sich bei unserer Website um eine Intranetsite für HP Drucker handelt, die ausschließlich zum Scraping verwendet wird, haben wir kein Problem mit dieser Methode.
ihightower
Ihre erste Methode ist die am wenigsten wünschenswerte - Bypass-Validierung. Warum wird derjenige, der das Zertifikat tatsächlich validiert, nicht zuerst aufgeführt?
JWW
1
Dies kann auch passieren, wenn Sie eine veraltete Version von openSSL haben. Für mich funktionierte das Aktualisieren auf die neueste Version von certifi und das Aktualisieren von openssl auf den Boxen.
Myusuf3
1
context ist das, was ich brauchte
betete
382

Dies ist keine Lösung für Ihr spezifisches Problem, aber ich stelle es hier vor, da dieser Thread das beste Google-Ergebnis für "SSL: CERTIFICATE_VERIFY_FAILED" ist und mich auf eine wilde Gänsejagd führt.

Wenn Sie Python 3.6 unter OSX installiert haben und beim Versuch, eine Verbindung zu einer https: // Site herzustellen, der Fehler "SSL: CERTIFICATE_VERIFY_FAILED" angezeigt wird, 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, in dem das installiert wirdcertifi Zertifikatspaket . Dies ist in der ReadMe dokumentiert, die Sie unter finden sollten/Applications/Python\ 3.6/ReadMe.rtf

In ReadMe können Sie dieses Skript nach der Installation ausführen, das gerade installiert wird certifi :/Applications/Python\ 3.6/Install\ Certificates.command

In den Versionshinweisen finden Sie weitere Informationen: https://www.python.org/downloads/release/python-360/

Craig Glennie
quelle
105
Führen Sie direkt / Applications / Python \ 3.6 / Install \ Certificates.command aus, um mein Problem unter OSX zu lösen. Vielen Dank.
Muyong
2
Ich verwende OS X El Capitan 10.11.6, Python 3.6.0 und diese Lösung hat perfekt funktioniert.
y2knoproblem
2
Ich verwende macOS Sierra 10.12.5, Python 3.6.1 und diese Lösung hat perfekt funktioniert.
James
4
Dies hat es für mich behoben, indem ich /Applications/Python\ 3.7/Install\ Certificates.command dies direkt ausgeführt habe terminal! Vielen Dank an @CraigGlennie & @muyong. Ich freue mich, out-of-the-box-thinkingdass Sie dies hier platziert haben!
JayRizzo
6
Python 3.7 unter macOS Mojave: Hier funktioniert es nicht. Ich habe das Installationszertifikat deinstalliert / neu installiert / ausgeführt, neu gestartet usw. funktioniert bei mir nicht
Thomas
71

Um die Antwort von Craig Glennie zu erweitern:

in Python 3.6.1 unter MacOs Sierra

Die Eingabe im Bash-Terminal löste das Problem:

pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command
jnPy
quelle
3
Versuchen Sie, sudo /Applications/Python\ 3.6/Install\ Certificates.commandwenn Berechtigungen verweigert werden.
KingKongCoder
Dies behebt das Problem in Python 3.6 nicht. -1
Hyperum
1
Wenn Sie über die Befehlszeile ausflippen (wahrscheinlich nicht, wenn Sie hier sind, aber hey), können Sie auch den Anwendungsordner (oder einen gleichwertigen Ordner unter anderen Betriebssystemen) finden, den Python bei der Installation erstellt hat, und dann das Skript durch Doppelklicken öffnen. Der spezifische Name des Ordners hängt von der von Ihnen installierten Python-Version ab.
Erdős-Bacon
Arbeitete wie ein Zauber für Python 3.7.3. Danke dir.
Klbytec
Vielen Dank. Ich habe buchstäblich nach Hunderten von Lösungen gesucht und Ihre haben funktioniert.
nnd
43

Unter Windows überprüft Python das Systemzertifikat nicht, sondern verwendet sein eigenes unter ?\lib\site-packages\certifi\cacert.pem.

Die Lösung für Ihr Problem:

  1. Laden Sie das Domain-Validierungszertifikat als * .crt- oder * pem-Datei herunter
  2. Öffnen Sie die Datei im Editor und kopieren Sie den Inhalt in die Zwischenablage
  3. Finden Sie Ihren cacert.pemStandort:from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
  4. Bearbeiten Sie die cacert.pemDatei und fügen Sie Ihr Domain-Validierungszertifikat am Ende der Datei ein.
  5. Speichern Sie die Datei und genießen Sie Anfragen!
Bruno Gabuzomeu
quelle
6
lib\site-packages\certifi\cacert.pemexistiert nicht in Python 2.7.10. Und die Frage ist über urllib2nichtrequests
Kevin Smyth
2
Die bisher beste Lösung, die Twitter-API, verwendet das DigiCert-Zertifikat, das nicht in der cacert.pem-Datei meines Pythons enthalten ist. Ich habe dort hinzugefügt und VOILA!
digz6666
2
Arbeitete an Debian. Für die Datensätze lautete der Dateipfad auf meinem System : /usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem. Vielen Dank!
ofavre
Leider verwenden Python-Anforderungen nicht den CA-Vertrauensspeicher eines Betriebssystems. github.com/requests/requests/issues/2966 . Sie müssen REQUESTS_CA_BUNDLE github.com/bloomreach/s4cmd/issues/111#issuecomment-406839514 festlegen .
Jamshid
Funktioniert unter Windows 10, Python 3.6, mit den Google- und Twitter-APIs und dem Anforderungsmodul im Allgemeinen.
Brittenb
36

Meine Lösung für Mac OS X:

1) Aktualisieren Sie auf Python 3.6.5 mit dem Python-Installationsprogramm für native Apps, das von der offiziellen Python-Sprachwebsite https://www.python.org/downloads/ heruntergeladen wurde.

Ich habe festgestellt, dass dieses Installationsprogramm die Links und Symlinks für das neue Python viel besser aktualisiert als Homebrew.

2) Installieren Sie ein neues Zertifikat mit "./Install Certificates.command", das sich im aktualisierten Python 3.6-Verzeichnis befindet

> cd "/Applications/Python 3.6/"
> sudo "./Install Certificates.command"
Claude COULOMBE
quelle
Arbeitete wie Charme in Mac OS X.
Manu Mathew
31

Sie können versuchen, dies zu Ihren Umgebungsvariablen hinzuzufügen:

PYTHONHTTPSVERIFY=0 

Beachten Sie, dass dadurch alle HTTP-Überprüfungen deaktiviert werden. Dies ist also ein Vorschlaghammer-Ansatz. Wenn jedoch keine Überprüfung erforderlich ist, ist dies möglicherweise eine effektive Lösung.

Chris Halcrow
quelle
17
Ich vermute, dass das Deaktivieren aller HTTP-Überprüfungen für alle Pythons etwas übertrieben ist, um einen Fehler bei der Überprüfung zu beheben. Es gibt viele Fälle, in denen standardmäßig eine Überprüfung gewünscht wird.
TrevorKirkby
Arbeitete für mich unter Windows Server 2016 unter Python 2.7.13. Normalerweise ist Python nicht auf Windows-Servern installiert, aber ich brauchte es für ein vCenter-Upgrade mit Nexus 1000v-Migration auf VDS. Dies behebt vorerst nur das Problem mit einem selbstsignierten vCenter-Zertifikat (verwendet VMCA und gültige Zertifikate in aktualisierte Umgebung). Ich hatte kein Glück, dass das Zertifikat durch Bearbeiten der cacert.pem im Python-Anforderungspaket akzeptiert wurde
Christopher Thorjussen
3
Außerdem setze ich die Variable direkt im Befehlszeilenfenster, bevor ich das Skript ausführe, damit nicht alle Überprüfungen deaktiviert werden, vor denen @ jemand anderes Angst hat, was auch ich nicht empfehlen würde.
Christopher Thorjussen
Das ist perfekt für meinen Anwendungsfall: Testen. Ich würde dies niemals in der Produktion tun, aber für Tests, die nichts mit SSL zu tun haben, ist das eine wunderbare Option.
Sorin
Danke, diese Lösung hat es für mich getan: import os os.environ ["PYTHONHTTPSVERIFY"] = "0"
mbello
28

Ich hatte ein ähnliches Problem, obwohl ich es urllib.request.urlopenin Python 3.4, 3.5 und 3.6 verwendet habe . (Dies ist ein Teil des Python 3-Äquivalents urllib2gemäß dem Hinweis am Anfang der urllib2Dokumentationsseite von Python 2. )

Meine Lösung war pip install certifizu installieren certifi, die hat:

... eine sorgfältig zusammengestellte Sammlung von Stammzertifikaten zur Überprüfung der Vertrauenswürdigkeit von SSL-Zertifikaten bei gleichzeitiger Ü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://example.com/bar/baz.html')

Ich habe es überarbeitet zu:

import urllib.request as urlrq
import certifi

resp = urlrq.urlopen('https://example.com/bar/baz.html', cafile=certifi.where())

Wenn ich die urllib2.urlopenDokumentation richtig gelesen habe , hat sie auch ein cafileArgument. Funktioniert urllib2.urlopen([...], certifi.where())möglicherweise auch für Python 2.7.


UPDATE (2020-01-01): Ab Python 3.6 ist das cafileArgument to urlopenveraltet , contextstattdessen sollte das Argument angegeben werden. Ich fand, dass Folgendes bei 3.5 bis 3.8 gleich gut funktioniert:

import urllib.request as urlrq
import certifi
import ssl

resp = urlrq.urlopen('https://example.com/bar/baz.html', context=ssl.create_default_context(cafile=certifi.where()))
hBy2Py
quelle
1
load_verify_locationsmutiert die SSLContextInstanz und gibt zurück None. Sie sollten context=ssl.create_default_context(cafile=certifi.where())stattdessen verwenden. Weitere Informationen finden Sie in den sslDokumenten .
Ostrokach
1
@ostrokach Huh, ich habe so etwas versucht, aber ich muss die falsche sslFunktion verwendet haben. Siehe Bearbeiten; okay?
hBy2Py
13
import requests
requests.packages.urllib3.disable_warnings()

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

Entnommen von hier https://gist.github.com/michaelrice/a6794a017e349fc65d01

Prostak
quelle
testete diese Lösung in Jenkins Umgebung, persönlicher Umgebung, das funktioniert!
Rapport89
2
Dies ist äußerst unsicher, da es ALLE Zertifikatsüberprüfungen umgeht, auf eigenes Risiko verwendet wird und aus Liebe zu JEDEM nicht im Produktionscode verwendet wird.
Dragon788
Vielen Dank. Endlich hat es geklappt. Es ist nicht erforderlich, dass Python 3.6 unter / Applications unter Mac OS installiert ist. Dies sollte die akzeptierte Antwort sein.
Biranchi
Sie sollten niemals ein solches Monkeypatching durchführen. Dies ist äußerst gefährlich und wirkt sich auf die gesamte nachgelagerte Verwendung des Codes aus.
Acumenus
10

Wie ich in einem Kommentar geschrieben habe, hängt dieses Problem wahrscheinlich mit dieser SO-Antwort zusammen .

Kurz gesagt: Es gibt mehrere Möglichkeiten, das Zertifikat zu überprüfen. Die von OpenSSL verwendete Überprüfung ist nicht mit den vertrauenswürdigen Stammzertifikaten kompatibel, die Sie auf Ihrem System haben. OpenSSL wird von Python verwendet.

Sie können versuchen, das fehlende Zertifikat für die öffentliche primäre Zertifizierungsstelle der Verisign-Klasse 3 abzurufen und dann die cafileOption gemäß der Python-Dokumentation verwenden :

urllib2.urlopen(req, cafile="verisign.pem")
Steffen Ullrich
quelle
Können Sie mir helfen plz dieses relevantes Problem in Python und ssl Validierung lösen Link
Keine
8

Ich hatte ein ähnliches Problem auf einem meiner Linux-Computer. Das Generieren neuer Zertifikate und das Exportieren einer Umgebungsvariablen, die auf das Zertifikatsverzeichnis verweist, hat dies für mich behoben:

$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs
Ritiek
quelle
7

Ich muss eine weitere Antwort hinzufügen, da ich genau wie Craig Glennie aufgrund der vielen Beiträge, die sich auf dieses Problem im Internet beziehen, einer wilden Gänsejagd nachgegangen bin.

Ich verwende MacPorts, und was ich ursprünglich für ein Python-Problem hielt, war tatsächlich ein MacPorts-Problem: Es installiert kein Stammzertifikat mit der Installation von openssl. Die Lösung ist port install curl-ca-bundle, wie in diesem Blog-Beitrag erwähnt .

corwin.amber
quelle
5

Ich habe das hier gefunden

Ich habe diese Lösung gefunden. Fügen Sie diesen Code am Anfang Ihrer Quelldatei ein:

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

Dieser Code macht die Überprüfung rückgängig, sodass die SSL-Zertifizierung nicht überprüft wird.

Ganesh Chowdhary Sadanala
quelle
Dieses Video hat mir sehr geholfen zu verstehen, was SSL ist. Video-URL: youtu.be/dsuVPxuU_hc
Ganesh Chowdhary Sadanala
4

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
Cherif KAOUA
quelle
2
Mag eine dumme Frage sein, aber was ist CA.crt und wo finde ich es?
Iqbal
4

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:
import ssl
ssl.get_default_verify_paths()

was auf meinem System produziert

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')

Sobald Sie wissen, wohin das Zertifikat geht, verketten 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 ausgeführt habe:

conda config --set ssl_verify <pathToYourFile>.crt

Wenn Sie sich nicht erinnern, wo sich Ihr Zertifikat befindet, finden Sie es in ~/.condarc:

ssl_verify: <pathToYourFile>.crt

Nun verketten die Datei zu Ende /miniconda3/ssl/cert.pem und Anfragen sollten arbeiten, insbesondere , sklearn.datasetsund ähnliche Werkzeuge funktionieren soll.

Weitere Vorsichtsmaßnahmen

Die anderen Lösungen haben nicht funktioniert, da das Anaconda-Setup etwas anders ist:

  • Der Pfad existiert Applications/Python\ 3.Xeinfach nicht.

  • Der von den folgenden Befehlen bereitgestellte Pfad ist der falsche Pfad

from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH
Löwe
quelle
3

Ich hänge meinen Kopf halb beschämt, da ich das gleiche Problem hatte, außer dass in meinem Fall die URL, auf die ich traf, gültig war und das Zertifikat gültig war. Was nicht gültig war, war meine Verbindung zum Internet. Ich konnte dem Browser keine Proxy-Details hinzufügen (in diesem Fall IE). Dies verhinderte, dass der Überprüfungsprozess korrekt ablief.
In den Proxy-Details hinzugefügt und meine Python war dann sehr glücklich.

Anzeigen
quelle
1
Hängen Sie Ihren Kopf nicht in Schande, weil Sie etwas vergessen und es dann herausgefunden und geteilt haben. Jemand könnte das nützlich finden. Mit IE aber ... schade: p
Davos
3

Python 2.7.12 (Standard, 29. Juli 2016, 15:26:22) hat das erwähnte Problem behoben. Diese Informationen könnten jemand anderem helfen.

caot
quelle
3
Ich habe es am 2.7.12 auf dem Mac mit der urllib2-Bibliothek gefunden. Die Verwendung der Requets-Bibliothek scheint jedoch in Ordnung zu sein
marcadian
@marcadian Die Installation und Verwendung certifi, die anscheinend nur einen Teil der Zertifikate von enthält requests, hat das Problem für mich in Python 3.4 bis 3.6 behoben .
hBy2Py
3

Ich bin überrascht, dass all diese Anweisungen mein Problem nicht gelöst haben. Trotzdem ist die Diagnose korrekt (übrigens verwende ich Mac und Python3.6.1). Um den richtigen Teil zusammenzufassen:

  • Auf dem Mac lässt Apple OpenSSL fallen
  • Python verwendet jetzt einen eigenen Satz von CA-Stammzertifikaten
  • Die binäre Python-Installation lieferte ein Skript zum Installieren des von Python benötigten CA-Stammzertifikats ("/ Applications / Python 3.6 / Install Certificates.command").
  • Weitere Informationen finden Sie unter "/ Applications / Python 3.6 / ReadMe.rtf"

Für mich funktioniert das Skript nicht und all diese Zertifizierungs- und OpenSL-Installationen konnten ebenfalls nicht behoben werden. Vielleicht, weil ich mehrere Python 2- und 3-Installationen sowie viele virtuelle Umgebungen habe. Am Ende muss ich es von Hand reparieren.

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 das immer noch fehlschlägt. Installieren Sie dann auch OpenSSL neu.

port install openssl
berniey
quelle
2

Wie Sie verwende ich Python 2.7 auf meinem alten iMac (OS X 10.6.8). Ich habe das Problem auch mit urllib2.urlopen gelöst:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

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 verwendete Python-Version:

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

  2. Problem mit dem vom Homebrew-Tool installierten: " Brew Install Python", Version in / usr / local / bin.

Ein Kapitel mit dem Titel Certificate verification and OpenSSL [CHANGED for Python 2.7.9]in /Applications/Python 2.7/ReadMe.rtferklärt das Problem mit vielen Details.

Überprüfen Sie also die richtige Python-Version, laden Sie sie herunter und geben Sie sie in Ihren PATH ein.

Thierry Maillard
quelle
2

Python 2.7 auf Amazon EC2 mit centOS 7

Ich musste die env-Variable so einstellen SSL_CERT_DIR, dass sie auf meine zeigt, ca-bundledie sich bei befindet/etc/ssl/certs/ca-bundle.crt

Brian McCall
quelle
Ihre Antwort hat mich auf den richtigen Weg für mich geführt. Auf ubuntu, musste ich gesetzt SSL_CERT_DIRzu /etc/ssl/certsund sorgte auch dafür , das ca-certificateswar Paket installiert und auf dem neuesten Stand.
Norman Breau
1

Versuchen

pip install --trusted-host pypi.python.org Paketname

Es hat bei mir funktioniert.

swapnilghorpade
quelle
1

Schau es dir an

/ Applications / Python 3.6 / Install Certificates.command

Sie können auch zu Aplications gehen und auf Certificates.command klicken

Danielle Cohen
quelle
1

In meinem Fall wurde dieser Fehler angezeigt, weil requestsund urllib3Versionen nicht kompatibel waren und bei der Installation der folgende Fehler auftrat:

ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.
pip install 'urllib3<1.25' --force-reinstall

hat den Trick gemacht.

fabio.sang
quelle
1

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 Kondapfade schlecht waren:

Basisumgebung (3.7):

>>> 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')

2.7 Umgebung (Pfade existierten nicht!):

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')

Die Reparatur:

cd /usr/local/anaconda3/envs/py27/
mkdir ssl
cd ssl
ln -s ../../../ssl/cert.pem
Peter Tseng
quelle
1

Der Fehler SSL: CERTIFICATE_VERIFY_FAILED kann auch auftreten, weil im ca-certificatesPaket unter Linux ein Zwischenzertifikat fehlt . In meinem Fall fehlte beispielsweise das Zwischenzertifikat " DigiCert SHA2 Secure Server CA " im ca-certificatesPaket, obwohl der Firefox-Browser es enthält. Sie können herausfinden, welches Zertifikat fehlt, indem Sie den wgetBefehl direkt auf der URL ausführen, die diesen Fehler verursacht. Dann können Sie auf der offiziellen Website (z. B. https://www.digicert.com/digicert-root-certificates.htm in meinem Fall) der Zertifizierungsstelle nach dem entsprechenden Link zur CRT-Datei für dieses Zertifikat suchen . Um das in Ihrem Fall fehlende Zertifikat einzuschließen, können Sie stattdessen die folgenden Befehle über den Download-Link für CRT-Dateien ausführen:

wget https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt

mv DigiCertSHA2SecureServerCA.crt DigiCertSHA2SecureServerCA.der

openssl x509 -inform DER -outform PEM -in DigiCertSHA2SecureServerCA.der -out DigicertSHA2SecureServerCA.pem.crt

sudo mkdir /usr/share/ca-certificates/extra

sudo cp DigicertSHA2SecureServerCA.pem.crt /usr/share/ca-certificates/extra/

sudo dpkg-reconfigure ca-certificates

Danach können Sie erneut mit wgetIhrer URL sowie mit dem Python- urllibPaket testen . Weitere Informationen finden Sie unter: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242

WebDev
quelle
0

Wenn Sie sich in vCenter 6 befinden, sollten Sie stattdessen das VMware-Zertifizierungsstellenzertifikat Ihres VMenter zur Liste der vertrauenswürdigen Zertifizierungsstellen Ihres Betriebssystems hinzufügen. Gehen Sie wie folgt vor, um Ihr Zertifikat herunterzuladen

  1. Öffnen Sie Ihren Webbrowser.
  2. Navigieren Sie 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 in .cer
  2. Kopieren Sie es in die Datei / etc / pki / ca-trust / source / anchor /
  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
nobler1050
quelle
Er gab an, dass er unter OS X und nicht unter vCenter 6 arbeitet.
jww
0

Installationsschritte für nltk (ich hatte Python3 (3.6.2) bereits in MAC OS X installiert

sudo easy_install pip

Verwenden Sie die Option "Installierte ignorieren", um die Deinstallation der vorherigen Version von 6 zu ignorieren. Andernfalls wird beim Deinstallieren ein Fehler ausgegeben und der Film wird nicht weitergeleitet

sudo pip3 install -U nltk --ignore-installed six

Überprüfen Sie die Installation von Pip und Python und verwenden Sie die '3'-Versionen

which python python2 python3
which pip pip2 pip3

Überprüfen Sie, ob NLTK installiert ist

python3
import nltk
nltk.__path__
['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk']

Installieren Sie das SSL-Zertifikat, bevor Sie das Beispielbuch installieren. Andernfalls wird bei der Installation der Beispiele ein Zertifikatfehler angezeigt

/Applications/Python\ 3.6/Install\ Certificates.command
python3 -m nltk.downloader book

Damit wurde die Installation von nltk und nltk_ata für Buchbeispiele erfolgreich abgeschlossen

Narasimha Sai
quelle
0

Die Installation PyOpenSSLmit piphat bei mir funktioniert (ohne auf PEM zu konvertieren):

pip install PyOpenSSL
averma93
quelle
0

Ich hatte dieses Problem gelöst, indem ich Fiddler (einen HTTP-Debugging-Proxy) geschlossen habe. Überprüfen Sie, ob ein Proxy aktiviert ist, und versuchen Sie es erneut.

vperezb
quelle
0

In Python 2.7 hat das Hinzufügen von Details zur vertrauenswürdigen Stammzertifizierungsstelle am Ende in Datei C: \ Python27 \ lib \ site-packages \ certifi \ cacert.pem geholfen

Danach habe ich (mit Administratorrechten) pip install --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org packageName ausgeführt

MD5
quelle