Erreur SSL InsecurePlatform lors de l'utilisation du package de demandes

237

Im utilisant Python 2.7.3 et les requêtes. J'ai installé Requests via pip. Je pense que c'est la dernière version. Je cours sur Debian Wheezy.

J'ai utilisé Requests de nombreuses fois dans le passé et je n'ai jamais rencontré ce problème, mais il semble que lorsque Requestsje fais des requêtes https avec, j'obtiens une InsecurePlatformexception.

L'erreur mentionne urllib3, mais je ne l'ai pas installé. Je l'ai installé pour vérifier s'il a résolu l'erreur, mais ce n'est pas le cas.

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

Des idées sur pourquoi je reçois ça? J'ai vérifié les documents, comme spécifié dans le message d'erreur, mais les documents disent d'importer urllib3 et de désactiver l'avertissement ou de fournir un certificat.

Luke Peckham
la source

Réponses:

390

Utilisez la fonction de sécurité quelque peu cachée :

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

Les deux commandes installent les packages supplémentaires suivants:

  • pyOpenSSL
  • la cryptographie
  • idna

Veuillez noter que cela n'est pas requis pour python-2.7.9 + .

Si pip installéchoue avec des erreurs, vérifiez si vous avez besoin paquets de développement pour libffi, libsslet pythoninstallé dans votre système en utilisant le gestionnaire de paquets de la distribution :

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

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

La liste de distribution ci-dessus est incomplète.

Solution ( voir la réponse originale @TomDotTom ) :

Si vous ne pouvez pas installer certains des packages de développement requis, il existe également une option pour désactiver cet avertissement:

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

Si le vôtre pipest affecté par InsecurePlatformWarningPyPI et ne peut rien y installer, il peut être corrigé avec ce guide étape par étape pour déployer manuellement des packages Python supplémentaires.

plaes
la source
3
J'ai des demandes [sécurité], un nouveau terminal, Python 2.7.3 et j'obtiens toujours cette erreur
Josh Nankin
45
vous devez également installer des bibliothèques supplémentaires sur le système pour Ubuntu / Debian:sudo apt-get install python-dev libffi-dev libssl-dev
therealmarv
2
Est-il correct que "pip" lui-même (à partir de la version 6.1) donne le même avertissement de sécurité?
jmster
5
selon votre coque, vous devrez peut-être taperpip install 'requests[security]'
C. Reed
5
dans zshell, vous devez dire: demandes d'installation de pip \ [sécurité \]
Amir Katz
68

Requests 2.6 a introduit cet avertissement pour les utilisateurs de python avant 2.7.9 avec seulement des modules SSL stock disponibles.

En supposant que vous ne pouvez pas mettre à niveau vers une version plus récente de python, cela installera des bibliothèques SSL python plus à jour:

pip install --upgrade ndg-httpsclient 

CEPENDANT, cela peut échouer sur certains systèmes sans les dépendances de construction pour pyOpenSSL. Sur les systèmes Debian, exécuter ceci avant la commande pip ci-dessus devrait être suffisant pour que pyOpenSSL puisse construire:

apt-get install python-dev libffi-dev libssl-dev
Jessica Gadling
la source
4
J'avais besoin d'installer ces packages 'python-dev libffi-dev libssl-dev' pour Ubuntu 14.04 également.
Andy
Merci! J'ai ajouté une note à la documentation: github.com/shazow/urllib3/pull/765
Wolfgang
@Jessica FTW! Merci beaucoup - c'était ennuyeux.
Neal Magee
18

Je ne l'utilise pas en production, juste quelques testeurs. Et pour réitérer la documentation urllib3

Si vous savez ce que vous faites et que vous souhaitez désactiver cela et d'autres avertissements

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

Modifier / mettre à jour:

Les éléments suivants devraient également fonctionner:

import logging
import requests

# turn down requests log verbosity
logging.getLogger('requests').setLevel(logging.CRITICAL)
TomDotTom
la source
1
Le problème avec cette solution est qu'elle supprime et ignore simplement le problème réel. De plus, cela ne fonctionnera pas lorsque vous utilisez pip pour installer ou mettre à niveau des packages.
Jason Parham
1
La seule solution qui fonctionne pour moi sur un ubuntu 1404 / Python 2.7.6. Merci
Ignacio Vazquez
7

Si vous n'êtes pas en mesure de mettre à niveau votre version Python vers 2.7.9 et que vous souhaitez supprimer les avertissements,

vous pouvez rétrograder votre version «demandes» vers 2.5.3:

sudo pip install requests==2.5.3

À propos de la version: http://fossies.org/diffs/requests/2.5.3_vs_2.6.0/requests/packages/urllib3/util/ssl_.py-diff.html

raittes
la source
8
Veuillez noter que 2.5.3 a un problème de sécurité avec la gestion des cookies lors des redirections.
plaes
2
Plutôt que de publier cette réponse deux fois, vous devriez avoir signalé l'autre publication comme doublon. Je l'ai maintenant fermé comme tel.
Martijn Pieters
6
J'appuie le commentaire pour ne pas rétrograder en raison de la vulnérabilité connue.
sergiopereira
7

En fait, vous pouvez essayer cela.

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

vous pouvez lire le code des demandes.

"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
la source
2
Soyez très prudent en faisant cela, ne pas vérifier les certificats peut être dangereux!
jaapz
Bien sûr, ne pas vérifier les certificats sera dangereux. Mais parfois, c'est un dernier recours. Ex: easy_install, apt-get, yum ou pip ... ne fonctionne pas, ou faites un peu de Web Crawler ...
zzzz zzzz
1
Je suis dans un environnement d'hébergement partagé, donc je ne peux pas mettre à niveau python vers 2.7.9 et je ne peux pas installer le libffi.pc avec apt-get, qui est requis par les demandes d'installation pip [sécurité] et les autres variantes d'installation pip au dessus. Donc, cette réponse a été celle qui a fonctionné pour moi. Tant que vous comprenez la mise en garde importante selon laquelle sans vérification https le contenu de la page pourrait être modifié / usurpé, je pense que cette réponse est très bien.
Chirael
5

Toutes les solutions présentées ici n'ont pas aidé (je suis limité à python 2.6.6). J'ai trouvé la réponse dans un simple commutateur à passer à pip:

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

Cela indique à pip qu'il est OK de récupérer le module sur pypi.python.org.

Pour moi, le problème est le proxy de mon entreprise derrière son pare-feu qui le fait ressembler à un client malveillant pour certains serveurs. Hourra la sécurité.


Mise à jour: Voir la réponse de @Alex pour les changements dans les domaines PyPi et les --trusted-hostoptions supplémentaires qui peuvent être ajoutées. (Je copier / coller ici, mais sa réponse, alors +1 lui)

PfunnyGuy
la source
J'ai enfin pu installer tensorflow en utilisant cette commande, merci beaucoup!
pedrobisp
3

Cette réponse n'est pas liée, mais si vous souhaitez vous débarrasser de l'avertissement et obtenir l'avertissement suivant des demandes:

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.

Vous pouvez le désactiver en ajoutant la ligne suivante à votre code python:

requests.packages.urllib3.disable_warnings()

daemonsl
la source
Merci pour cela. Aucune des autres réponses n'a fonctionné pour moi. Je suis époustouflé qu'un tel message ennuyeux verbeux soit mis par défaut.
Dan
1

Je devais d'abord aller bash(depuis ZSH). ensuite

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

résolu le problème.

Martin Thoma
la source
Je ne suis pas sûr. Je pense que c'est dû aux crochets
Martin Thoma
1

Cela est venu pour moi sur Ubuntu 14.04 (avec Python 2.7.6) la semaine dernière après avoir fait un apt-get dist-upgradequi comprenait libssl1.1:amd64dedeb.sury.org .

Depuis que je cours certbot-auto renewdepuis un travail cron, j'utilise également le --no-self-upgradepour réduire la maintenance imprévue. Cela semble avoir été la source du problème.

Pour corriger l'erreur, tout ce que j'avais à faire était de devenir root (avec sule --logincommutateur de) et de se certbot-automettre à niveau lui-même. C'est à dire:

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

au lieu de ce qui s'exécute normalement à partir de la crontab de root:

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

Après cela, letencrypt renwals s'est à nouveau exécuté normalement.

Dale Anderson
la source
J'ai le même problème que celui décrit ici. avertissements: /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: un véritable objet SSLContext n'est pas disponible. Cela empêche urllib3 de configurer SSL correctement et peut entraîner l'échec de certaines connexions SSL. Vous pouvez mettre à niveau vers une version plus récente de Python pour résoudre ce problème. Pour plus d'informations, voir urllib3.readthedocs.io/en/latest/… . InsecurePlatformWarning Je viens de taper la commande: sudo apt-get dist-upgrade L'erreur a été corrigée.
Didierh
0

Pour moi, pas de travail, j'ai besoin de mise à niveau pip ....

Debian / Ubuntu

installer les dépendances

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

mettre à jour pip et installer des packages

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

Si vous souhaitez supprimer les dépendances

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

Je viens d'avoir un problème similaire sur un serveur CentOS 5 où j'ai installé python 2.7.12 dans / usr / local au-dessus d'une version beaucoup plus ancienne de python2.7. La mise à niveau vers CentOS 6 ou 7 n'est pas une option sur ce serveur pour le moment.

Certains modules python 2.7 existaient toujours à partir de l'ancienne version de python, mais pip n'a pas pu être mis à niveau car le nouveau package de cryptographie n'est pas pris en charge par les packages CentOS 5.

Plus précisément, «pip install request [security]» a échoué car la version openssl sur le CentOS 5 était 0.9.8e qui n'est plus prise en charge par la cryptographie> 1.4.0.

Pour résoudre le problème d'origine des PO, j'ai fait:

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

Cette cryptographie installée 1.3.4 qui fonctionne avec openssl-0.9.8e. cryptograpy 1.3.4 est également suffisant pour satisfaire l'exigence de la commande suivante.

2) pip install 'requests[security]'

Cette commande s'installe maintenant car elle n'essaie pas d'installer la cryptographie> 1.4.0.

Notez que sur Centos 5, je devais également:

yum install openssl-devel

Pour permettre à la cryptographie de se construire

DavidG
la source
0

Voici comment cela fonctionne pour moi sur Python 3.6:

import requests
import urllib3

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

N'installez pas pyOpenSSL car il sera bientôt obsolète. La meilleure approche actuelle est-

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

si vous voulez simplement arrêter un avertissement non sécurisé comme:

/usr/lib/python3/dist-packages/urllib3/connectionpool.py:794: InsecureRequestWarning: une demande HTTPS non vérifiée est en cours. L'ajout d'une vérification de certificat est fortement conseillé. Voir: https://urllib3.readthedocs.org/en/latest/security.html InsecureRequestWarning)

faire:

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

vérifier = Faux

est la clé, les suivis ne sont pas bons:

requests.packages.urllib3.disable_warnings ()

ou

urllib3.disable_warnings ()

mais, vous DEVEZ savoir, cela pourrait entraîner des risques de sécurité potentiels .

JZ
la source
0

J'ai eu le même problème avec l' interpréteur Python de l' édition communautaire
Mac
Pycharm 2019.3
3.6.
La mise à niveau de pip avec 20.0.2 a fonctionné pour moi.
Pycharm --> Preferences --> Project Interpreter --> click on pip --> specify version 20.0.2 --> Install package

GPopat
la source