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

38voto

tintin Punkte 2936

Falls Sie eine Bibliothek haben, die sich auf requests und Sie können den Überprüfungspfad nicht ändern (wie bei pyvmomi ), dann müssen Sie die cacert.pem gebündelt mit Anfragen und fügen Sie dort Ihre CA an. Hier ist ein allgemeiner Ansatz zum Auffinden der cacert.pem Standort:

Windows

C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem

linux

#  (py2.7.5,requests 2.7.0, verify not enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/lib/python2.7/dist-packages/certifi/cacert.pem

#  (py2.7.10, verify enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem

btw. @requests-devs, Ihre eigenen Cacerts mit request zu bündeln ist wirklich, wirklich ärgerlich... vor allem die Tatsache, dass Sie nicht scheinen, das System ca store zuerst zu verwenden und dies ist nirgends dokumentiert.

Update

In Situationen, in denen Sie eine Bibliothek verwenden und keine Kontrolle über den Speicherort des ca-Bündels haben, können Sie den Speicherort des ca-Bündels auch explizit auf Ihr hostweites ca-Bündel festlegen:

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt python -c "import requests; requests.get('https://somesite.com')";

28voto

Derik Oliveira Punkte 493

Wie von anderen erwähnt, wird dieses Problem "durch ein nicht vertrauenswürdiges SSL-Zertifikat verursacht". Meine Antwort basiert auf dem bestbewertete Antwort y diese Antwort .

Sie können das Zertifikat testen, indem Sie curl :

curl -vvI https://example.com

Wenn ein Fehler auftritt, haben Sie 3 Möglichkeiten:

  1. Eine schnelle Lösung wäre es, das Zertifikat einfach nicht zu überprüfen:

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

  2. Übergeben Sie den Pfad zur CA_BUNDLE-Datei oder zum Verzeichnis mit den Zertifikaten vertrauenswürdiger CAs:

    requests.get('https://example.com', verify='/path/to/certfile')

  3. Wenn Sie Zugang dazu haben, reparieren Sie das Webserver-Zertifikat.

Mein Problem bestand darin, dass ich nur das Zertifikat meiner Website und nicht das Zwischenzertifikat (auch bekannt als Kettenzertifikat) verwendet habe.

Wenn Sie Let's Encrypt verwenden, sollten Sie die fullchain.pem Datei, nicht cert.pem .

20voto

AniketGole Punkte 760

Wenn Sie die Warnungen entfernen möchten, verwenden Sie den unten stehenden Code.

import urllib3

urllib3.disable_warnings()

et verify=False con request.get o post Methode

17voto

user941581 Punkte 329

Ich stehe vor dem gleichen Problem, wenn ich gspread verwende, und diese Befehle funktionieren bei mir:

sudo pip uninstall -y certifi
sudo pip install certifi==2015.04.28

14voto

slamora Punkte 635

Ich habe einen spezifischen Ansatz zur Lösung eines ähnlichen Problems gefunden. Die Idee ist, die cacert-Datei, die im System und von anderen ssl-basierten Anwendungen verwendet werden.

In Debian (ich bin nicht sicher, ob das auch in anderen Distributionen der Fall ist) werden die Zertifikatsdateien (.pem) unter /etc/ssl/certs/ So, das ist der Code, der bei mir funktioniert:

import requests
verify='/etc/ssl/certs/cacert.org.pem'
response = requests.get('https://lists.cacert.org', verify=verify)

Zum Raten, was pem Datei wählen, habe ich die URL aufgerufen und überprüft, welche Zertifizierungsstelle (CA) das Zertifikat erstellt hat.

EDIT: Wenn Sie den Code nicht bearbeiten können (weil Sie eine dritte Anwendung ausführen), können Sie versuchen, die pem Zertifikat direkt in /usr/local/lib/python2.7/dist-packages/requests/cacert.pem (z. B. durch Kopieren an das Ende der Datei).

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