489 Stimmen

Python-Anfragen, die einen SSLError auslösen

Ich arbeite an einem einfachen Skript, das CAS, Jspring-Sicherheitsprüfung, Umleitung usw. umfasst. Ich würde gerne Kenneth Reitz' Python Requests verwenden, weil es ein großartiges Stück Arbeit ist! CAS erfordert jedoch eine Validierung über SSL, so dass ich diesen Schritt zuerst überwinden muss. Ich weiß nicht, was Python requests will? Wo soll sich dieses SSL-Zertifikat befinden?

Traceback (most recent call last):
  File "./test.py", line 24, in <module>
  response = requests.get(url1, headers=headers)
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
  File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request 
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

654voto

Rafael Almeida Punkte 9503

Das Problem, das Sie haben, wird durch ein nicht vertrauenswürdiges SSL-Zertifikat verursacht.

Wie @dirk in einem früheren Kommentar erwähnte, ist die schnellste Fix ist die Einstellung verify=False :

requests.get('https://example.com', verify=False)

Bitte beachten Sie, dass das Zertifikat in diesem Fall nicht überprüft werden kann. Dies setzt Ihre Anwendung Sicherheitsrisiken aus, z. B. Man-in-the-Middle-Angriffen.

Natürlich müssen Sie sich ein Urteil bilden. Wie in den Kommentaren erwähnt, ist dies Mai für Kurzbewerbungen/Wegwerfbewerbungen/Skripte akzeptabel sein, sollte aber wirklich nicht in die Produktionssoftware einfließen .

Wenn das Überspringen der Zertifikatsprüfung in Ihrem speziellen Kontext nicht akzeptabel ist, sollten Sie die folgenden Optionen in Betracht ziehen: Die beste Option ist das Setzen der verify auf eine Zeichenkette, die den Pfad der Datei .pem Datei des Zertifikats (die Sie auf sicherem Wege erhalten sollten).

Ab der Version 2.0 wird also die verify akzeptiert die folgenden Werte mit ihrer jeweiligen Semantik:

  • True (Hinweis: Sie können sehen, welche Root-Zertifikate Requests über die Certifi-Bibliothek verwendet, eine Vertrauensdatenbank von RCs, die von Requests extrahiert wurden: Certifi - Vertrauensdatenbank für Menschen ).
  • False : Umgehung der Zertifikatsüberprüfung vollständig .
  • Pfad zu einer CA_BUNDLE-Datei für Requests, die zur Validierung der Zertifikate verwendet werden soll.

Quelle: Anfragen - SSL-Zertifikatsüberprüfung

Werfen Sie auch einen Blick auf die cert Parameter auf demselben Link.

133voto

Zeugma Punkte 30114

Von Anfragen Dokumentation zur SSL-Verifizierung :

Anfragen können SSL-Zertifikate für HTTPS-Anfragen überprüfen, genau wie ein Webbrowser. Um das SSL-Zertifikat eines Hosts zu überprüfen, können Sie das Argument verify verwenden:

requests.get('https://kennethreitz.com', verify=True)

Wenn Sie Ihr SSL-Zertifikat nicht verifizieren wollen, machen Sie verify=False

66voto

jfs Punkte 370717

Den Namen der zu verwendenden CA-Datei können Sie über verify :

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)

Wenn Sie verify=True dann requests verwendet einen eigenen CA-Satz, der möglicherweise nicht die CA enthält, die Ihr Serverzertifikat signiert hat.

64voto

Yong Punkte 641

Ich stieß auf das gleiche Problem und ssl-Zertifikat verify fehlgeschlagen Problem bei der Verwendung von aws boto3, durch Überprüfung boto3 Code, fand ich die REQUESTS_CA_BUNDLE ist nicht gesetzt, also habe ich beide Probleme durch manuelles Setzen behoben:

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')

Für aws-cli schätze ich, dass die Einstellung von REQUESTS_CA_BUNDLE in ~/.bashrc wird dieses Problem beheben (nicht getestet, da mein aws-cli ohne es funktioniert).

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE

50voto

alanjds Punkte 3644

$ pip install -U requests[security]

  • Getestet mit Python 2.7.6 @ Ubuntu 14.04.4 LTS
  • Getestet mit Python 2.7.5 @ MacOSX 10.9.5 (Mavericks)

Als diese Frage eröffnet wurde (2012-05), war die Version 0.13.1 der Requests. Bei Version 2.4.1 (2014-09) die "Sicherheits"-Extras wurden eingeführt, indem certifi Paket, falls verfügbar.

Im Moment (2016-09) ist die Hauptversion 2.11.1, die gut funktioniert ohne verify=False . Keine Notwendigkeit der Verwendung requests.get(url, verify=False) falls installiert mit requests[security] Extras.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X