Python-Anfragen zum Auslösen von SSLError

348

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
TedBurrows
quelle
Können Sie mehr von den Code-Informationen teilen? Es scheint, als ob ein Schritt fehlt.
TankorSmash
5
Sie sollten immer Softwareversionen erwähnen, bei denen Sie Hilfe benötigen.
Piotr Dobrogost
Ich habe dieses Problem, wo ich Python 3.5 Tornado 4.4 verwende. HTTPRequest setzte das validate_cert = True, so dass Sie es auf False setzen können, um es zu behandeln
pan7an

Antworten:

460

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:

requests.get('https://example.com', 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 verifyParameter auf eine Zeichenfolge, die den Pfad der .pemDatei des Zertifikats darstellt (die Sie durch eine Art Sicherheit erhalten sollten meint).

Ab Version 2.0 verifyakzeptiert 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 .
  • Pfad zu einer CA_BUNDLE-Datei, die zur Überprüfung der Zertifikate verwendet werden kann.

Quelle: Requests - SSL Cert Verification

Schauen Sie sich auch den certParameter auf demselben Link an.

Rafael Almeida
quelle
1
Ja, als ich dotCloud in Ubuntu verwendet habe, kam das gleiche "Zertifikatüberprüfung fehlgeschlagen" heraus. Nach der Änderung von "request.session (headers = headers, hooks = hooks, verify = False)" in "/usr/local/lib/python2.6/dist-packages/dotcloud/client/client.py" funktionierte es.
DIYismus
2
Dies ist nicht als korrekt markiert, aber ich kann überprüfen, ob es funktioniert (im Gegensatz zu den Antworten unten).
Khalid13
40
@ khalid13: Eine Axt "wirkt" als Kopfschmerzmittel (kein Kopf - keine Kopfschmerzen). Das bedeutet nicht, dass es eine gute Idee ist, es so zu verwenden. verify=FalseDeaktiviert die SSL-Zertifikatprüfung des Hosts.
JFS
24
@JFSebastian Ehrlich gesagt hängt es davon ab, was Sie tun. Für meine Schnell- / Wegwerfanwendung war es mehr als ausreichend.
Khalid13
5
@ Diyism eine solche Änderung macht klingt sehr unsicher ...
Binki
111

Aus der Anforderungsdokumentation zur SSL-Überprüfung :

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

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

Wenn Sie Ihr SSL-Zertifikat nicht überprüfen möchten, machen Sie verify=False

Boud
quelle
4
Nun, ich habe die Option verify = True hinzugefügt, aber immer noch genau den gleichen Fehler erhalten. Keine Änderung. Es muss etwas anderes erforderlich sein, aber ich weiß nicht, was es sein könnte.
TedBurrows
Ich glaube, ich bin jetzt in den SSL-Wahnsinn hinabgestiegen. Ich habe dies zu meinem anfänglichen get ... get hinzugefügt (url1, headers = headers, cert = '/ etc / pki / tls / cert.pem', verify = True, config = my_config). Jetzt erhalte ich diesen Fehler. request.exceptions.SSLError: [Errno 336265225] _ssl.c: 351: error: 140B0009: SSL-Routinen: SSL_CTX_use_PrivateKey_file: PEM lib Ich habe keine Ahnung, was dies bedeutet.
TedBurrows
14
Setzen Sie einfach verify = False, wenn Sie das Zertifikat nicht validieren möchten, und wenn Sie ein selbstsigniertes Zertifikat haben
Dirk
16
Wenn Sie ein selbstsigniertes Zertifikat haben, laden Sie es herunter und setzen Sie die Überprüfung auf den Dateinamen. Es gibt keinerlei Entschuldigung für die Einstellung verify = False. verify = '/ path / to / cert.pem'
Matthias Urlichs
14
Sorry Boud, ich musste diese Antwort ablehnen, da Anfragen HTTPS-Anfragen nicht "wie ein Webbrowser" verarbeiten. Wenn die vollständige SSL-Vertrauenskette (einschließlich Zwischenzertifikaten) nicht auf einem Server deklariert ist und ein zusätzlicher Zertifikat-Download erforderlich ist, wird der oben genannte SSL-Überprüfungsfehler angezeigt. Webbrowser führen den zusätzlichen Download durch und kennzeichnen keine Zertifikatfehler. Dies ist eine Möglichkeit, wie sich ein Webbrowser und Anforderungen unterscheiden. Da sind andere. Requests führt einige Überprüfungen durch, ist jedoch nicht so gut wie ein Browser.
Louis Cremen
53

Der Name der zu verwendenden CA-Datei, über die Sie übergeben können verify:

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

Wenn Sie verify=Truedann requestsverwendet ein eigenes CA - Set , das CA nicht , dass Ihr Server - Zertifikat signiert haben könnte.

jfs
quelle
12
@ 9emE0iL18gxCqLT: Warum verwenden Ihrer Meinung nach alle Systeme den von Ihnen angegebenen Pfad? requestskann für Ihre Verteilung verpackt werden. Laufen Sie python -mrequests.certs, um herauszufinden, wohin es zeigt.
JFS
3
Wie aktualisiere ich das Cacert-Bundle der Python-Anfrage, wenn es veraltet ist?
CMCDragonkai
5
Sie sollten das nicht cacert.pemvon Curl verwenden. Es enthält viele widerrufene Zertifikate. Check out Certifi (das Requests verwendet): certifi.io
Kenneth Reitz
3
@KennethReitz: 1- Was Requests verwendet, schlägt für OP fehl (ansonsten gab es keine Frage) 2- cacert.pemsind 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.
JFS
Können Sie dies tun und gleichzeitig Client-Zertifikate verwenden? Ich bekomme Probleme damit.
user1156544
42

$ pip install -U requests[security]

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

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 certifiPaket verwendet wurde, sofern verfügbar.

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

Alanjds
quelle
7
pip install -U requests[security] --no-cachezweimal behoben undpip install certifi==2015.04.28
Aamir Abro
@alanjds Was ist, wenn ich Python entweder so konfigurieren möchte, dass es einem SSL-Zertifikat vertraut, oder die Zertifikatsüberprüfung deaktiviert, jedoch global in der Umgebung, ohne den Quellcode zu bearbeiten? Wenn ich beispielsweise vorhandene Python-Dienstprogramme (z. B. die AWS-CLI) herunterlade und Zertifikaten vertrauen oder die Zertifikatsüberprüfung für diese Tools ignorieren möchte?
Howiecamp
@ Howiecamp dann können Sie über jf-sebastian Antwort gehen, ich denke: stackoverflow.com/a/12865159/798575
Alanjds
@alanjds Aber geht seine Antwort nicht davon aus, dass ich den Code schreibe und / oder Zugriff auf den Code habe? Ich möchte dies auf Umgebungsebene implementieren.
Howiecamp
3
tun, pip install --upgrade pipbevor Sie das Sicherheitspaket für Anforderungen installieren, um andere Fehler zu vermeiden
Vincent Claes
40

Ich 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:

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 ~/.bashrcwird dieses Problem vermutlich durch Setzen von REQUESTS_CA_BUNDLE behoben (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
Yong
quelle
2
Dies hat mein Problem behoben! Ich habe Charles Proxy auf einem Mac verwendet, um eine Bibliothek zu debuggen, die JSON-Aufrufe an HTTPS-APIs ausführte. Ich habe das Charless-Zertifikat wie angegeben installiert und dem Schlüsselbund hinzugefügt, aber Python schlug weiterhin fehl mit: SSLError: ("Fehlerhafter Handshake: Fehler ([('SSL-Routinen', 'ssl3_get_server_certificate', 'Zertifikatüberprüfung fehlgeschlagen')],") ,) Um dies zu beheben, habe ich Ihren Rat befolgt, REQUESTS_CA_BUNDLE hinzuzufügen und das Charles-Zertifikat aus meinem Schlüsselbund als PEM-Datei zu exportieren. Jetzt funktioniert es!
Mallyvai
Vielen Dank, das gleiche Problem war mit geöffneten Fiddler
user565447
@ user565447 Ich versuche gerade, dies mit Fiddler zum Laufen zu bringen. Sollte das Setzen von REQUESTS_CA_BUNDLE auf Fiddlers Zertifikat funktionieren?
Howiecamp
19

Wenn Sie über eine Bibliothek verfügen, auf die requestsSie sich verlassen können, und den Überprüfungspfad (wie bei pyvmomi) nicht ändern können, müssen Sie den cacert.pemmit Anforderungen gebündelten Pfad finden und Ihre Zertifizierungsstelle dort anhängen. Hier ist ein allgemeiner Ansatz, um den cacert.pemStandort zu finden :

Fenster

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

Ü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:

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt python -c "import requests; requests.get('https://somesite.com';)"
Tim und Struppi
quelle
Hundertmal so viel: Schlüssel ist die Unfähigkeit, den verifyPfad zu ändern .
Ghukill
Was ist, wenn Sie ein selbstsigniertes Zertifikat verwenden? Was wäre die CA in diesem Fall?
user1114
Winziges Update - für Python 3.6 sollte es Klammern für den
Druckbefehl geben
15

Ich habe das gleiche Problem mit gspread und diese Befehle funktionieren für mich:

sudo pip uninstall -y certifi
sudo pip install certifi==2015.04.28
user941581
quelle
Das hat es für mich getan. Danke :)
Alex-Mcleod
4
Dies hat den Nachteil, dass potenziell widerrufene / nicht vertrauenswürdige Zertifikate aus der älteren Version von certifi neu installiert werden, was NICHT empfohlen wird.
Dragon788
Wenn Sie aus irgendeinem Grund gezwungen sind, sich an eine frühe Version von Python 2.7 zu halten, ist das Downgrade von certifi der einzige Ansatz, der für mich funktioniert hat
19:34 Uhr
15

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

import urllib3

urllib3.disable_warnings()

und verify=Falsemit request.getoder postMethode

AniketGole
quelle
12

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:

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

Um zu erraten, welche pemDatei 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 pemZertifikat direkt hinzuzufügen /usr/local/lib/python2.7/dist-packages/requests/cacert.pem(z. B. das Kopieren an das Ende der Datei).

chk
quelle
2
Verwandter Beitrag zum Debuggen von CA_BUNDLE, das von Python verwendet wird.
chk
Was ist mit dem Ersetzen /usr/local/lib/python2.7/dist-packages/requests/cacert.pemdurch einen Symlink zum OS Store?
CMCDragonkai
8

Wenn Sie sich nicht um das Zertifikat kümmern, verwenden Sie es einfach verify=False.

import requests

url = "Write your url here"

returnResponse = requests.get(url, verify=False)
Yogesh Prasad
quelle
7

Nach stundenlangem Debuggen konnte ich dies nur mit den folgenden Paketen zum Laufen bringen:

requests[security]==2.7.0  # not 2.18.1
cryptography==1.9  # not 2.0

mit OpenSSL 1.0.2g 1 Mar 2016

Ohne diese Pakete verify=Falsefunktionierte nicht.

Ich hoffe das hilft jemandem.

Michael
quelle
5

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:

sudo apt-get install ca-certificates

Durch Aktualisieren der Uhrzeit kann auch Folgendes behoben werden:

sudo apt-get install ntpdate
sudo ntpdate -u ntp.ubuntu.com

Wenn Sie ein selbstsigniertes Zertifikat verwenden, müssen Sie es wahrscheinlich manuell zu Ihrem System hinzufügen.

Marius Craciunoiu
quelle
Beachten Sie, dass dies nur für Requests-Installationen über apt-get gilt, das von Debian / Ubuntu geändert wurde, um Systemzertifikate zu verwenden. Fordert ordnungsgemäße Schiffe mit einem eigenen, sorgfältig kuratierten CA- Paket an
Kenneth Reitz
Sollte die Stammzertifizierungsstelle nicht ausreichen? Warum brauchen Sie die Zwischenprodukte?
timmy
5

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:

import requests.api
import warnings


def requestspatch(method, url, **kwargs):
    kwargs['verify'] = False
    return _origcall(method, url, **kwargs)

_origcall = requests.api.request
requests.api.request = requestspatch
warnings.warn('Patched requests: SSL verification disabled!')

Niemals in der Produktion verwenden!

xmedeko
quelle
4

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

pip install --upgrade certifi      # hold your breath..

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

open /Applications/Python\ 3.6/Install\ Certificates.command  # please replace 3.6 here with your suitable python version
D-Codierer
quelle
3

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.

Ajon
quelle
Wenn Sie OpenSSL auf eine Version> 1.0.1 aktualisiert haben, war dies wahrscheinlich das Problem. Siehe meine Antwort unten. stackoverflow.com/a/44543047/1413201
Tim Ludwinski
Der Wechsel von Python 2.7.9 zu 2.7.10 hat dies für mich behoben.
Crazystick
3

Dies ähnelt der Antwort von @ rafael-almeida, aber ich möchte darauf hinweisen, dass ab Anforderung 2.11+ nicht 3 Werte angenommen werden verifykönnen , sondern tatsächlich 4:

  • True: Überprüft anhand der internen vertrauenswürdigen Zertifizierungsstellen der Anforderungen.
  • False: umgeht die Zertifikatvalidierung vollständig . (Nicht empfohlen)
  • Pfad zu einer CA_BUNDLE-Datei. Anfragen verwenden dies, um die Zertifikate des Servers zu validieren.
  • Pfad zu einem Verzeichnis mit öffentlichen Zertifikatdateien. Anfragen verwenden dies, um die Zertifikate des Servers zu validieren.

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 rehashdies 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 PEMBefehl zum Konvertieren der Zertifikate in Base64 verwendet hatte.pem Format verwendet hatte, funktionierte alles einwandfrei.

Sie können auch einfach faul aufwärmen:

try:
    # As long as the certificates in the certs directory are in the OS's certificate store, `verify=True` is fine.
    return requests.get(url, auth=auth, verify=True)
except requests.exceptions.SSLError:
    subprocess.run(f"openssl rehash -compat -v my_certs_dir", shell=True, check=True)
    return requests.get(url, auth=auth, verify="my_certs_dir")
Cowlinator
quelle
2

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'

Peter
quelle
FWIW, es ist immer noch mit Anfragen == 2.13.0 vorhanden. Die obige Problemumgehung behebt das Problem weiterhin.
Tamás Szelei
1

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

Michael
quelle
0

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:

cat StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/pip/_vendor/requests/cacert.pem
cat temp/StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/requests/cacert.pem

eine davon könnte reichen, habe ich nicht überprüft

Rhoerbe
quelle
0

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.

import certifi # This should be already installed as a dependency of 'requests'
requests.get("https://example.com", verify=certifi.old_where())
Tim Ludwinski
quelle
Ich verwende ein von ArcGIS installiertes Python 2.7.10 und es ist kein Zertifizierungsmodul installiert. Das installierte Anforderungsmodul ist in Version 2.11.1.
Lucas
0

Ich musste von Python 3.4.0 auf 3.4.6 aktualisieren

pyenv virtualenv 3.4.6 myvenv
pyenv activate myvenv
pip install -r requirements.txt
Paul
quelle
0

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.

mastDrinkNimbuPani
quelle