Ich arbeite an einem einfachen Skript, das CAS, Jspring-Sicherheitsüberprüfung, Umleitung usw. umfasst. Ich möchte Kenneth Reitz 'Python-Anfragen verwenden, weil es eine großartige Arbeit ist! CAS muss jedoch über SSL validiert werden, sodass ich diesen Schritt zuerst überwinden muss. Ich weiß nicht, was Python-Anfragen wollen? 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
python
ssl
python-requests
urllib3
TedBurrows
quelle
quelle
Antworten:
Das Problem, das Sie haben, wird durch ein nicht vertrauenswürdiges SSL-Zertifikat verursacht.
Wie bei @dirk in einem früheren Kommentar erwähnt, ist die schnellste Lösung die Einstellung
verify=False
:Bitte beachten Sie, dass das Zertifikat dadurch nicht überprüft wird. Dadurch wird Ihre Anwendung Sicherheitsrisiken ausgesetzt, z. B. Man-in-the-Middle-Angriffen.
Natürlich Urteilsvermögen anwenden. Wie in den Kommentaren erwähnt, kann dies für schnelle / wegwerfbare Anwendungen / Skripte akzeptabel sein, sollte aber wirklich nicht zur Produktionssoftware gehen .
Wenn das Überspringen der Zertifikatprüfung in Ihrem speziellen Kontext nicht akzeptabel ist, sollten Sie die folgenden Optionen in Betracht ziehen. Am besten setzen Sie den
verify
Parameter auf eine Zeichenfolge, die den Pfad der.pem
Datei des Zertifikats darstellt (die Sie durch eine Art Sicherheit erhalten sollten meint).Ab Version 2.0
verify
akzeptiert der Parameter die folgenden Werte mit ihrer jeweiligen Semantik:True
: bewirkt, dass das Zertifikat anhand der vertrauenswürdigen Zertifizierungsstellen der Bibliothek validiert wird (Hinweis: Sie können sehen, welche Stammzertifikatsanforderungen über die Certifi-Bibliothek verwendet werden, eine Vertrauensdatenbank mit RCs, die aus Requests: Certifi - Trust Database for Humans extrahiert wurden .)False
: umgeht die Zertifikatvalidierung vollständig .Quelle: Requests - SSL Cert Verification
Schauen Sie sich auch den
cert
Parameter auf demselben Link an.quelle
verify=False
Deaktiviert die SSL-Zertifikatprüfung des Hosts.Aus der Anforderungsdokumentation zur SSL-Überprüfung :
Wenn Sie Ihr SSL-Zertifikat nicht überprüfen möchten, machen Sie
verify=False
quelle
Der Name der zu verwendenden CA-Datei, über die Sie übergeben können
verify
:Wenn Sie
verify=True
dannrequests
verwendet ein eigenes CA - Set , das CA nicht , dass Ihr Server - Zertifikat signiert haben könnte.quelle
requests
kann für Ihre Verteilung verpackt werden. Laufen Siepython -mrequests.certs
, um herauszufinden, wohin es zeigt.cacert.pem
von Curl verwenden. Es enthält viele widerrufene Zertifikate. Check out Certifi (das Requests verwendet): certifi.iocacert.pem
sind CA-Zertifikate, die aus Mozilla (von cURL) extrahiert wurden - dies ist nur ein Beispiel (wenn die CA-Liste von einem beliebten Web verwendet wird) -browser kann nicht als Beispiel verwendet wird , dann weiß ich nicht , was sein kann) - der Punkt der Antwort , dass Sie können Ihre eigene CA - Datei übergeben , wenn die Standardliste ausfällt.$ pip install -U requests[security]
Als diese Frage geöffnet wurde (2012-05), war die Requests-Version 0.13.1. In Version 2.4.1 (2014-09) wurden die "Sicherheits" -Extras eingeführt, wobei das
certifi
Paket verwendet wurde, sofern verfügbar.Im Moment (2016-09) ist die Hauptversion 2.11.1, die ohne funktioniert
verify=False
. Keine Notwendigkeit zu verwendenrequests.get(url, verify=False)
, wenn mitrequests[security]
Extras installiert .quelle
pip install -U requests[security] --no-cache
zweimal behoben undpip install certifi==2015.04.28
pip install --upgrade pip
bevor Sie das Sicherheitspaket für Anforderungen installieren, um andere Fehler zu vermeidenIch habe das gleiche Problem festgestellt und das Problem mit der Überprüfung des SSL-Zertifikats ist fehlgeschlagen, wenn aws boto3 verwendet wurde. Durch Überprüfen des Boto3-Codes stellte ich fest
REQUESTS_CA_BUNDLE
, dass das Problem nicht festgelegt ist. Daher habe ich beide Probleme behoben, indem ich es manuell festgelegt habe:Für aws-cli
~/.bashrc
wird dieses Problem vermutlich durch Setzen von REQUESTS_CA_BUNDLE behoben (nicht getestet, da mein aws-cli ohne es funktioniert).quelle
Wenn Sie über eine Bibliothek verfügen, auf die
requests
Sie sich verlassen können, und den Überprüfungspfad (wie beipyvmomi
) nicht ändern können, müssen Sie dencacert.pem
mit Anforderungen gebündelten Pfad finden und Ihre Zertifizierungsstelle dort anhängen. Hier ist ein allgemeiner Ansatz, um dencacert.pem
Standort zu finden :Fenster
Linux
Übrigens. @ request-devs, das Bündeln eigener Cacerts mit Anfragen ist wirklich sehr, sehr ärgerlich ... insbesondere die Tatsache, dass Sie den System-Ca-Store nicht zuerst zu verwenden scheinen und dies nirgendwo dokumentiert ist.
aktualisieren
In Situationen, in denen Sie eine Bibliothek verwenden und keine Kontrolle über den Speicherort des Ca-Bundles haben, können Sie den Speicherort des Ca-Bundles auch explizit als hostweites Ca-Bundle festlegen:
quelle
verify
Pfad zu ändern .Ich habe das gleiche Problem mit gspread und diese Befehle funktionieren für mich:
quelle
Wenn Sie die Warnungen entfernen möchten, verwenden Sie den folgenden Code.
und
verify=False
mitrequest.get
oderpost
Methodequelle
Ich habe einen spezifischen Ansatz zur Lösung eines ähnlichen Problems gefunden. Die Idee ist, auf die im System gespeicherte und von anderen SSL-basierten Anwendungen verwendete Cacert-Datei zu verweisen.
In Debian (ich bin mir nicht sicher, ob dies auch in anderen Distributionen der Fall ist) werden die Zertifikatdateien (.pem) unter gespeichert
/etc/ssl/certs/
. Dies ist also der Code, der für mich funktioniert:Um zu erraten, welche
pem
Datei ausgewählt wurde, habe ich die URL durchsucht und überprüft, welche Zertifizierungsstelle das Zertifikat generiert hat.BEARBEITEN: Wenn Sie den Code nicht bearbeiten können (weil Sie eine dritte App ausführen), können Sie versuchen, das
pem
Zertifikat direkt hinzuzufügen/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
(z. B. das Kopieren an das Ende der Datei).quelle
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
durch einen Symlink zum OS Store?Wenn Sie sich nicht um das Zertifikat kümmern, verwenden Sie es einfach
verify=False
.quelle
Nach stundenlangem Debuggen konnte ich dies nur mit den folgenden Paketen zum Laufen bringen:
mit
OpenSSL 1.0.2g 1 Mar 2016
Ohne diese Pakete
verify=False
funktionierte nicht.Ich hoffe das hilft jemandem.
quelle
Ich bin auf das gleiche Problem gestoßen. Es stellte sich heraus, dass ich das Zwischenzertifikat nicht auf meinem Server installiert hatte (hängen Sie es einfach wie unten gezeigt an den unteren Rand Ihres Zertifikats an).
https://www.digicert.com/ssl-support/pem-ssl-creation.htm
Stellen Sie sicher, dass Sie das Paket ca-certificates installiert haben:
Durch Aktualisieren der Uhrzeit kann auch Folgendes behoben werden:
Wenn Sie ein selbstsigniertes Zertifikat verwenden, müssen Sie es wahrscheinlich manuell zu Ihrem System hinzufügen.
quelle
Wenn die Anforderungsaufrufe irgendwo tief im Code vergraben sind und Sie das Serverzertifikat nicht installieren möchten , können Sie nur zu Debugzwecken Monkeypatch-Anforderungen ausführen:
Niemals in der Produktion verwenden!
quelle
Ich denke, es ist zu spät für die Party, aber ich wollte das Update für andere Wanderer wie mich einfügen! Das Folgende hat für mich unter Python 3.7.x geklappt
Geben Sie Folgendes in Ihr Terminal ein
Versuchen Sie erneut, Ihr Skript / Ihre Anforderungen auszuführen, und prüfen Sie, ob es funktioniert (ich bin sicher, dass es noch nicht behoben ist!). Wenn es nicht funktioniert hat, versuchen Sie, den folgenden Befehl direkt im Terminal auszuführen
quelle
Ich habe dieses Problem für STUNDEN bekämpft.
Ich habe versucht, Anfragen zu aktualisieren. Dann habe ich certifi aktualisiert. Ich habe auf certifi.where () verifiziert (der Code tut dies sowieso standardmäßig). Nichts hat geklappt.
Schließlich habe ich meine Version von Python auf Python 2.7.11 aktualisiert. Ich war auf Python 2.7.5, das einige Inkompatibilitäten mit der Art und Weise hatte, wie die Zertifikate überprüft werden. Nachdem ich Python (und eine Handvoll anderer Abhängigkeiten) aktualisiert hatte, funktionierte es.
quelle
Dies ähnelt der Antwort von @ rafael-almeida, aber ich möchte darauf hinweisen, dass ab Anforderung 2.11+ nicht 3 Werte angenommen werden
verify
können , sondern tatsächlich 4:True
: Überprüft anhand der internen vertrauenswürdigen Zertifizierungsstellen der Anforderungen.False
: umgeht die Zertifikatvalidierung vollständig . (Nicht empfohlen)Der Rest meiner Antwort bezieht sich auf # 4, wie man ein Verzeichnis mit Zertifikaten zur Validierung verwendet:
Besorgen Sie sich die benötigten öffentlichen Zertifikate und legen Sie sie in einem Verzeichnis ab.
Genau genommen sollten Sie wahrscheinlich eine Out-of-Band-Methode verwenden, um die Zertifikate zu erhalten, aber Sie können sie auch einfach mit einem beliebigen Browser herunterladen.
Wenn der Server eine Zertifikatkette verwendet, stellen Sie sicher, dass Sie jedes einzelne Zertifikat in der Kette erhalten.
Gemäß der Anforderungsdokumentation muss das Verzeichnis mit den Zertifikaten zuerst mit dem Dienstprogramm "rehash" (
openssl rehash
) verarbeitet werden.(Dies erfordert openssl 1.1.1+ und nicht alle Windows openssl-Implementierungen unterstützen Rehash. Wenn
openssl rehash
dies für Sie nicht funktioniert, können Sie versuchen, das Rehash-Ruby-Skript unter https://github.com/ruby/openssl/blob/master auszuführen /sample/c_rehash.rb , obwohl ich das nicht ausprobiert habe.)Ich hatte einige Probleme damit, Anfragen zum Erkennen meiner Zertifikate zu erhalten, aber nachdem ich den
openssl x509 -outform PEM
Befehl zum Konvertieren der Zertifikate in Base64 verwendet hatte.pem
Format verwendet hatte, funktionierte alles einwandfrei.Sie können auch einfach faul aufwärmen:
quelle
Derzeit gibt es ein Problem im Anforderungsmodul, das diesen Fehler verursacht, und zwar in Version 2.6.2 bis Version 2.12.4 (ATOW): https://github.com/kennethreitz/requests/issues/2573
Problemumgehung für dieses Problem ist das Hinzufügen der folgenden Zeile:
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS'
quelle
Wie von @Rafael Almeida erwähnt, wird das Problem durch ein nicht vertrauenswürdiges SSL-Zertifikat verursacht. In meinem Fall wurde das SSL-Zertifikat von meinem Server nicht als vertrauenswürdig eingestuft. Um dies zu umgehen, ohne die Sicherheit zu beeinträchtigen, habe ich das Zertifikat heruntergeladen und auf dem Server installiert (indem Sie einfach auf die CRT-Datei doppelklicken und dann Zertifikat installieren ...).
quelle
Es ist nicht möglich, Optionen hinzuzufügen, wenn Anforderungen von einem anderen Paket aufgerufen werden. In diesem Fall ist das Hinzufügen von Zertifikaten zum Cacert-Bundle der gerade Weg, z. B. musste ich "StartCom Class 1 Primary Intermediate Server CA" hinzufügen, für die ich das Stammzertifikat in StartComClass1.pem heruntergeladen habe. Da meine virtuelle Umgebung den Namen caldav trägt, habe ich das Zertifikat hinzugefügt mit:
eine davon könnte reichen, habe ich nicht überprüft
quelle
Ich hatte ein ähnliches oder dasselbe Problem mit der Zertifizierungsvalidierung. Ich habe gelesen, dass OpenSSL-Versionen unter 1.0.2, von denen Anforderungen abhängen, manchmal Probleme haben, starke Zertifikate zu validieren (siehe hier ). CentOS 7 scheint 1.0.1e zu verwenden, was das Problem zu haben scheint.
Ich war mir nicht sicher, wie ich dieses Problem unter CentOS umgehen sollte, und entschied mich daher, schwächere 1024-Bit-CA-Zertifikate zuzulassen.
quelle
Ich musste von Python 3.4.0 auf 3.4.6 aktualisieren
quelle
In meinem Fall war der Grund ziemlich trivial.
Ich hatte gewusst, dass die SSL-Überprüfung bis einige Tage zuvor funktioniert hatte und tatsächlich auf einem anderen Computer funktionierte.
Mein nächster Schritt bestand darin, den Inhalt und die Größe des Zertifikats zwischen dem Computer, auf dem die Überprüfung ausgeführt wurde, und dem Computer, auf dem dies nicht der Fall war, zu vergleichen.
Dies führte schnell dazu, dass ich feststellte, dass das Zertifikat auf der "falsch" arbeitenden Maschine nicht gut war, und als ich es durch das "gute" Zertifikat ersetzte, war alles in Ordnung.
quelle