SSL InsecurePlatform-Fehler bei Verwendung des Requests-Pakets

237

Ich benutze Python 2.7.3 und Requests. Ich habe Requests via pip installiert. Ich glaube, es ist die neueste Version. Ich laufe auf Debian Wheezy.

Ich habe in der Vergangenheit viele Male Anfragen verwendet und war nie mit diesem Problem konfrontiert, aber es scheint, dass Requestsich beim Erstellen von https-Anfragen mit eine InsecurePlatformAusnahme bekomme .

Der Fehler erwähnt urllib3, aber ich habe das nicht installiert. Ich habe es installiert, um zu überprüfen, ob der Fehler behoben wurde, aber nicht.

/usr/local/lib/python2.7/dist-packages/requests/packages/urllib3
/util/ssl_.py:79: InsecurePlatformWarning: A true SSLContext object is not
available. This prevents urllib3 from configuring SSL appropriately and 
may cause certain SSL connections to fail. For more information, see 
https://urllib3.readthedocs.org/en/latest  
/security.html#insecureplatformwarning.

Irgendwelche Ideen, warum ich das bekomme? Ich habe die Dokumente überprüft, wie in der Fehlermeldung angegeben, aber die Dokumente sagen, dass urllib3 importiert und entweder die Warnung deaktiviert oder ein Zertifikat bereitgestellt werden soll.

Luke Peckham
quelle

Antworten:

390

Verwenden Sie die etwas versteckte Sicherheitsfunktion :

pip install requests[security] oder pip install pyOpenSSL ndg-httpsclient pyasn1

Beide Befehle werden nach folgenden zusätzlichen Paketen installiert:

  • pyOpenSSL
  • Kryptographie
  • idna

Bitte beachten Sie, dass dies für Python-2.7.9 + nicht erforderlich ist .

Wenn pip installmit Fehlern fehlschlägt, überprüfen , ob Sie Entwicklungspakete für erforderlich sind libffi, libsslund pythonin dem System installiert ist Manager mit Verteilung des Pakets :

  • Debian / Ubuntu - python-dev libffi-dev libssl-devPakete.

  • Fedora - openssl-devel python-devel libffi-develPakete.

Die obige Distributionsliste ist unvollständig.

Problemumgehung ( siehe die ursprüngliche Antwort von @TomDotTom ) :

Falls Sie einige der erforderlichen Entwicklungspakete nicht installieren können, können Sie diese Warnung auch deaktivieren:

import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()

Wenn Sie pipselbst InsecurePlatformWarningvon PyPI betroffen sind und nichts von PyPI installieren können, kann dies mit dieser Schritt-für-Schritt-Anleitung behoben werden , um zusätzliche Python-Pakete manuell bereitzustellen .

plaes
quelle
3
Ich habe Anfragen [Sicherheit], neues Terminal, Python 2.7.3 und bekomme immer noch diesen Fehler
Josh Nankin
45
Sie müssen auch zusätzliche Bibliotheken auf dem System für Ubuntu / Debian installieren:sudo apt-get install python-dev libffi-dev libssl-dev
therealmarv
2
Ist es in Ordnung, dass "pip" selbst (ab Version 6.1) dieselbe Sicherheitswarnung ausgibt?
JMster
5
Abhängig von Ihrer Shell müssen Sie möglicherweisepip install 'requests[security]'
C. Reed
5
In Zshell müssen Sie sagen: Pip Installationsanforderungen \ [Sicherheit \]
Amir Katz
68

Requests 2.6 führte diese Warnung für Benutzer von Python vor 2.7.9 ein, wobei nur Standard-SSL-Module verfügbar waren.

Angenommen, Sie können nicht auf eine neuere Version von Python aktualisieren, werden dadurch aktuellere Python-SSL-Bibliotheken installiert:

pip install --upgrade ndg-httpsclient 

Dies kann jedoch auf einigen Systemen ohne die Build-Abhängigkeiten für pyOpenSSL fehlschlagen. Auf Debian-Systemen sollte es ausreichen, dies vor dem obigen Befehl pip auszuführen, damit pyOpenSSL Folgendes erstellt:

apt-get install python-dev libffi-dev libssl-dev
Jessica Gadling
quelle
4
Ich musste diese Pakete 'python-dev libffi-dev libssl-dev' auch für Ubuntu 14.04 installieren.
Andy
Vielen Dank! Ich habe der Dokumentation einen Hinweis hinzugefügt: github.com/shazow/urllib3/pull/765
Wolfgang
@ Jessica FTW! Vielen Dank - das war nervig.
Neal Magee
18

Ich benutze dies nicht in der Produktion, nur einige Testläufer. Und um die urllib3-Dokumentation zu wiederholen

Wenn Sie wissen, was Sie tun, und diese und andere Warnungen deaktivieren möchten

import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()

Bearbeiten / Aktualisieren:

Folgendes sollte auch funktionieren:

import logging
import requests

# turn down requests log verbosity
logging.getLogger('requests').setLevel(logging.CRITICAL)
TomDotTom
quelle
1
Das Problem bei dieser Lösung ist, dass das eigentliche Problem einfach unterdrückt und ignoriert wird. Darüber hinaus funktioniert dies nicht, wenn Sie pip zum Installieren oder Aktualisieren von Paketen verwenden.
Jason Parham
1
Die einzige Lösung, die für mich auf einem Ubuntu 1404 / Python 2.7.6 funktioniert. Vielen Dank
Ignacio Vazquez
7

Wenn Sie nicht in der Lage zu aktualisieren Sie Ihre Python - Version 2.7.9, und wollen Unterdrückungs - Warnungen,

Sie können Ihre 'Anfragen'- Version auf 2.5.3 herabstufen :

sudo pip install requests==2.5.3

Informationen zur Version: http://fossies.org/diffs/requests/2.5.3_vs_2.6.0/requests/packages/urllib3/util/ssl_.py-diff.html

raittes
quelle
8
Bitte beachten Sie, dass in 2.5.3 Sicherheitsprobleme bei der Verarbeitung von Cookies während Weiterleitungen auftreten.
Plaes
2
Anstatt diese Antwort zweimal zu posten, hätten Sie den anderen Beitrag als Duplikat markieren sollen. Ich habe es jetzt als solches geschlossen.
Martijn Pieters
6
Ich stimme dem Kommentar zu , wegen der bekannten Sicherheitslücke kein Downgrade durchzuführen.
Sergiopereira
7

In der Tat können Sie dies versuchen.

requests.post("https://www.google.com", verify=False)

Sie können den Code für Anfragen lesen.

"C:\Python27\Lib\site-packages\requests\sessions.py"

class Session(SessionRedirectMixin):
......
 def request(self, method, url,
    params=None,
    data=None,
    headers=None,
    cookies=None,
    files=None,
    auth=None,
    timeout=None,
    allow_redirects=True,
    proxies=None,
    hooks=None,
    stream=None,
    verify=None,  # <========
    cert=None):
    """
    ...
    :param verify: (optional) if True, the SSL cert will be verified.
         A CA_BUNDLE path can also be provided.
    ...
    """
zzzz zzzz
quelle
2
Seien Sie dabei sehr vorsichtig, es kann gefährlich sein, keine Zertifikate zu überprüfen!
Jaapz
Natürlich ist es gefährlich, keine Zertifikate zu überprüfen. Aber manchmal ist dies ein letzter Ausweg. Beispiel: easy_install, apt-get, yum oder pip ... nicht ausgeführt, oder ein wenig Web Crawler
ausführen
1
Ich bin in einer gemeinsam genutzten Hosting-Umgebung, daher kann ich Python nicht auf 2.7.9 aktualisieren und die libffi.pc nicht mit apt-get installieren, was für Pip-Installationsanforderungen [Sicherheit] und die anderen Pip-Installationsvarianten erforderlich ist über. Diese Antwort hat also für mich funktioniert. Solange Sie die wichtige Einschränkung verstehen, dass der Seiteninhalt ohne https-Überprüfung geändert / gefälscht werden könnte, halte ich diese Antwort für in Ordnung.
Chirael
5

Alle hier angegebenen Lösungen haben nicht geholfen (ich bin auf Python 2.6.6 beschränkt). Ich habe die Antwort in einem einfachen Schalter gefunden, der an pip übergeben werden kann:

$ sudo pip install --trusted-host pypi.python.org <module_name>

Dies teilt pip mit, dass es in Ordnung ist, das Modul von pypi.python.org abzurufen.

Für mich ist das Problem der Proxy meines Unternehmens hinter der Firewall, der es für einige Server wie einen böswilligen Client aussehen lässt. Hurra Sicherheit.


Update: In der Antwort von @Alex finden Sie Änderungen in den PyPi-Domänen sowie zusätzliche --trusted-hostOptionen, die hinzugefügt werden können. (Ich würde hier kopieren / einfügen, aber seine Antwort, also +1 ihn)

PfunnyGuy
quelle
Mit diesem Befehl konnte ich endlich Tensorflow installieren, vielen Dank!
Pedrobisp
3

Diese Antwort hat nichts damit zu tun, aber wenn Sie die Warnung loswerden und die folgende Warnung von Anfragen erhalten möchten:

InsecurePlatformWarning /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:79: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.

Sie können es deaktivieren , indem Sie Ihrem Python-Code die folgende Zeile hinzufügen:

requests.packages.urllib3.disable_warnings()

daemonsl
quelle
Danke dafür. Keine der anderen Antworten hat bei mir funktioniert. Ich bin überwältigt, dass eine so ausführliche nervige Nachricht standardmäßig eingefügt wird.
Dan
1

Ich musste zuerst zu bash(von ZSH) gehen. Dann

sudo -H pip install 'requests[security]' --upgrade

Das Problem wurde behoben.

Martin Thoma
quelle
Ich bin mir nicht sicher. Ich denke, es liegt an den Klammern
Martin Thoma
1

Dies kam für mich auf Ubuntu 14.04 (mit Python 2.7.6) letzte Woche, nachdem ich ein gemacht habe apt-get dist-upgrade, das libssl1.1:amd64von enthalten war deb.sury.org.

Da ich certbot-auto renewvon einem Cron-Job ausgehe, nutze ich das auch --no-self-upgrade, um außerplanmäßige Wartungsarbeiten zu reduzieren. Dies scheint die Ursache des Problems gewesen zu sein.

Um den Fehler zu beheben, musste ich nur root werden (mit sudem --loginSchalter) und das certbot-autoUpgrade selbst durchführen lassen. Dh:

sudo su --login
/usr/local/bin/certbot-auto renew 
# ... Upgrading certbot-auto 0.8.1 to 0.18.2... blah blah blah ...

anstelle dessen, was normalerweise von Roots Crontab läuft:

5 7 * * * /usr/local/bin/certbot-auto renew --quiet --no-self-upgrade

Danach liefen letsencrypt-Renwals wieder normal.

Dale Anderson
quelle
Ich habe das gleiche Problem hier beschrieben. Warnungen: /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: Ein echtes SSLContext-Objekt ist nicht verfügbar. Dies verhindert, dass urllib3 SSL entsprechend konfiguriert, und kann dazu führen, dass bestimmte SSL-Verbindungen fehlschlagen. Sie können auf eine neuere Version von Python aktualisieren, um dieses Problem zu beheben. Weitere Informationen finden Sie unter urllib3.readthedocs.io/en/latest/… . InsecurePlatformWarning Ich gebe einfach den folgenden Befehl ein: sudo apt-get dist-upgrade Der Fehler wurde behoben.
Didierh
0

Für mich keine Arbeit brauche ich Upgrade Pip ....

Debian / Ubuntu

Abhängigkeiten installieren

sudo apt-get install libpython-dev libssl-dev libffi-dev

Pip aktualisieren und Pakete installieren

sudo pip install -U pip
sudo pip install -U pyopenssl ndg-httpsclient pyasn1

Wenn Sie Abhängigkeiten entfernen möchten

sudo apt-get remove --purge libpython-dev libssl-dev libffi-dev
sudo apt-get autoremove
Thedemon007
quelle
0

Ich hatte gerade ein ähnliches Problem auf einem CentOS 5-Server, auf dem ich Python 2.7.12 in / usr / local auf einer viel älteren Version von Python2.7 installiert habe. Ein Upgrade auf CentOS 6 oder 7 ist auf diesem Server derzeit keine Option.

Einige der Python 2.7-Module waren noch aus der älteren Version von Python vorhanden, aber pip konnte nicht aktualisiert werden, da das neuere Kryptografiepaket von den CentOS 5-Paketen nicht unterstützt wird.

Insbesondere schlug 'pip install request [security]' fehl, da die openssl-Version unter CentOS 5 0.9.8e war, was von Cryptography> 1.4.0 nicht mehr unterstützt wird.

Um das ursprüngliche Problem des OP zu lösen, habe ich Folgendes getan:

1) pip install 'cryptography<1.3.5,>1.3.0'.  

Diese installierte Kryptographie 1.3.4, die mit openssl-0.9.8e funktioniert. Die Kryptografie 1.3.4 reicht auch aus, um die Anforderung für den folgenden Befehl zu erfüllen.

2) pip install 'requests[security]'

Dieser Befehl wird jetzt installiert, da nicht versucht wird, Kryptografie> 1.4.0 zu installieren.

Beachten Sie, dass ich auf Centos 5 auch Folgendes tun musste:

yum install openssl-devel

Damit Kryptografie erstellt werden kann

DavidG
quelle
0

Im Folgenden wird beschrieben, wie es bei Python 3.6 für mich funktioniert:

import requests
import urllib3

# Suppress InsecureRequestWarning: Unverified HTTPS
urllib3.disable_warnings()
Luiz Vaz
quelle
0

Installieren Sie pyOpenSSL nicht, da es bald veraltet sein wird. Der derzeit beste Ansatz ist:

import requests
requests.packages.urllib3.disable_warnings()
Mohammad Shahid Siddiqui
quelle
0

Wenn Sie nur unsichere Warnungen stoppen möchten, wie:

/usr/lib/python3/dist-packages/urllib3/connectionpool.py:794: InsecureRequestWarning: Eine nicht überprüfte HTTPS-Anforderung wird gestellt. Das Hinzufügen einer Zertifikatsüberprüfung wird dringend empfohlen. Siehe: https://urllib3.readthedocs.org/en/latest/security.html InsecureRequestWarning)

machen:

requests.METHOD("https://www.google.com", verify=False)

verify = False

ist der Schlüssel, folgendes ist nicht gut darin:

request.packages.urllib3.disable_warnings ()

oder

urllib3.disable_warnings ()

Sie MÜSSEN jedoch wissen, dass dies potenzielle Sicherheitsrisiken verursachen kann .

JZ
quelle
0

Ich hatte das gleiche Problem mit der
Mac
Pycharm Community Edition 2019.3
Python Interpreter 3.6.
Das Upgrade von pip mit 20.0.2 hat bei mir funktioniert.
Pycharm --> Preferences --> Project Interpreter --> click on pip --> specify version 20.0.2 --> Install package

GPopat
quelle