Suppression d'InsecureRequestWarning: une demande HTTPS non vérifiée est effectuée en Python2.6

345

J'écris des scripts en Python2.6 avec l'utilisation de pyVmomi et tout en utilisant l'une des méthodes de connexion:

service_instance = connect.SmartConnect(host=args.ip,
                                        user=args.user,
                                        pwd=args.password)

J'obtiens l'avertissement suivant:

/usr/lib/python2.6/site-packages/requests/packages/urllib3/connectionpool.py:734: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html
  InsecureRequestWarning)

Ce qui est intéressant, c'est que je n'ai pas installé urllib3 avec pip (mais il est là dans /usr/lib/python2.6/site-packages/requests/packages/urllib3/ ).

J'ai essayé comme suggéré ici

import urllib3
...
urllib3.disable_warnings()

mais cela n'a rien changé.

Patryk
la source
Vous pouvez essayer de définir le niveau de journalisation pour ce module spécifique comme décrit dans cette réponse stackoverflow.com/questions/7234262/…
Reina Abolofia
Une solution globale et fonctionnant
parfaitement
2
AVERTISSEMENT: désactivez la validation de certificat uniquement si vous ne vous souciez pas que quelqu'un usurpe l'identité du serveur distant!
ivan_pozdeev
4
bien, l'avertissement n'a pas vraiment empêcher tout ce qui se passe. Ce n'est pas désactiver la validation, c'est désactiver l'avertissement sur le manque de validation.
dwanderson

Réponses:

795

Vous pouvez désactiver tous les avertissements Python via la PYTHONWARNINGSvariable d'environnement. Dans ce cas, vous souhaitez:

export PYTHONWARNINGS="ignore:Unverified HTTPS request"

Pour désactiver à l'aide du code Python ( requests >= 2.16.0):

import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

Pour requests < 2.16.0, voir la réponse originale ci-dessous.

Réponse originale

La raison pour laquelle cela urllib3.disable_warnings()n'a pas fonctionné pour vous est qu'il semble que vous utilisez une instance distincte d'urllib3 vendue à l'intérieur des demandes.

Je rassemble ceci basé sur le chemin ici: /usr/lib/python2.6/site-packages/requests/packages/urllib3/connectionpool.py

Pour désactiver les avertissements dans l'urllib3 vendue des demandes, vous devrez importer cette instance spécifique du module:

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
shazow
la source
Je blogue sur le développement que je fais sur pyvmomi et j'ai couvert ce problème en octobre 2014. Je partage juste ce lien pour aider les autres à trouver des informations utiles sur pyvmomi à l'avenir: errr-online.com/index.php/tag/pyvmomi
Michael Rice
37
PYTHONWARNINGS="ignore:Unverified HTTPS request"
Rahul Patil
2
Pour être complet:from requests.packages.urllib3.exceptions import InsecureRequestWarning
propjk007
2
Cette réponse est dépassée. Pour une version moderne, voir la réponse de Nayana Adassuriya.
Dakkaron
3
Copié de la réponse de Nayana Adassuriya: import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning).
Samuel
117

C'est la réponse en 2017. urllib3ne fait requestsplus partie de

import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
Nayana Adassuriya
la source
7
L'année est moins importante que le numéro de révision de python que vous utilisez.
CodeMonkey
3
Oui, la révision est plus importante que l'année. C'est pourrequests >= 2.16.0
dwanderson
quelqu'un peut-il poster la version de urllib3, quand j'essaye, il dit que urllib3 n'a pas d'attribut 'disable_warnings'
steff_bdh
1
Je suis confus par cette réponse. Ma requestsversion est 2.21.0et elle a urllib3. J'ai essayé 2.16.0, `2.16.1 , and 2.17.0` et ils l'ont tous eu urllib3. J'ai essayé 2.4.0et celui-là ne l'a pas eu. L'ont-ils rajouté?
Mike Furlender
35

Par ce commentaire github , on peut désactiver les urllib3avertissements de demande via requestsdans une ligne:

requests.packages.urllib3.disable_warnings()

Cependant, cela supprimera tous les avertissements, pas seulement InsecureRequest(c'est-à-dire qu'il supprimera également InsecurePlatformetc.). Dans les cas où nous voulons simplement que les choses fonctionnent, je trouve la concision pratique.

hamx0r
la source
4
C'est la meilleure option pour 2.7 car je n'ai pas besoin d'importer urllib3 juste pour supprimer l'avertissement
CodeMonkey
3
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)semble fonctionner.
mattalxndr
29

La bonne façon est de lire la section pertinente sur le lien fourni et de faire comme il est dit. La manière spécifique pour requests(qui comprend sa propre copie de urllib3), selon les certificats CA - Utilisation avancée - Documentation de la demande 2.8.1 :

  • requests livré avec son propre ensemble de certificats (mais il ne peut être mis à jour qu'avec le module)
  • il utilisera (depuis requests v2.4.0) le certifipaquet à la place s'il est installé

La mesure de sécurité de vérification du certificat HTTPS n'est pas quelque chose à rejeter avec légèreté. L'attaque Man-in-the-middle qu'elle empêche de vous protéger d'un tiers, par exemple en sirotant un virus ou en altérant ou en volant vos données.

Ce qui, avec les opérations de piratage mondiales soutenues par le gouvernement comme les opérations d'accès sur mesure et le grand pare-feu de Chine qui ciblent l'infrastructure réseau, est plus probable que vous ne le pensez.

ivan_pozdeev
la source
J'ai des demandes 2.8.1 et certifi 2015.11.20.1 et je reçois toujours l'avertissement.
Alex Bartiş
3
@ AlexBartiş cela peut être si vous (ou un code que vous appelez) passez verify=False.
ivan_pozdeev
2
Pourquoi y a-t-il si peu de votes pour cette réponse? Est-il réellement sûr d'ignorer ces avertissements?
sgryzko
1
@sgryzko Uniquement si vous ne vous souciez pas que quelqu'un usurpe l'identité du serveur distant. Probablement, beaucoup ne se soucient pas et / ou ne lisent pas au-delà de la première réponse, contribuant au cycle de rétroaction positive. Cette réponse a également été publiée près d'un an plus tard.
ivan_pozdeev
2
Oui, vous devez faire la bonne chose dans un environnement de production, et supprimer aveuglément l'erreur est mauvais. Mais c'est une chose tout à fait valable de vouloir supprimer ces erreurs dans un environnement de test.
Vroo
12

Pour les impatients, un moyen rapide de désactiver l'avertissement HTTPS non vérifié python:

export PYTHONWARNINGS="ignore:Unverified HTTPS request"
Wenbing Li
la source
Pour PowerShell, la commande est$env:PYTHONWARNINGS="ignore:Unverified HTTPS request"
Gwen Au
10

La réponse acceptée ne fonctionne pas si certains fournisseurs de packages ont leur propre copie de urllib3, auquel cas cela fonctionnera toujours:

import warnings

warnings.filterwarnings('ignore', message='Unverified HTTPS request')
Yigal
la source
1

J'ai eu un problème similaire avec PyVmomi Client. Avec Python version 2.7.9, j'ai résolu ce problème avec la ligne de code suivante:

default_sslContext = ssl._create_unverified_context()
self.client = \
                Client(<vcenterip>, username=<username>, password=<passwd>,
                       sslContext=default_sslContext )

Notez que, pour que cela fonctionne, vous avez besoin d'au moins Python 2.7.9.

Rajive Pai
la source
1

Pourquoi ne pas utiliser la fonction originale pyvmomi SmartConnectNoSSL. Ils ont ajouté cette fonction June 14, 2016et l'ont nommée ConnectNoSSL, un jour après avoir changé le nom en SmartConnectNoSSL, l'utiliser au lieu de passer l'avertissement avec des lignes de code inutiles dans votre projet?

Fournit une méthode standard pour se connecter à un serveur spécifié sans vérification SSL. Utile lors de la connexion à des serveurs avec des certificats auto-signés ou lorsque vous souhaitez ignorer complètement SSL

service_instance = connect.SmartConnectNoSSL(host=args.ip,
                                             user=args.user,
                                             pwd=args.password)
SpazaM
la source
0

Pour Python 2.7

Ajoutez la variable d'environnement PYTHONWARNINGS comme clé et la valeur correspondante à ignorer comme:

os.environ['PYTHONWARNINGS']="ignore:Unverified HTTPS request"

Imran Al Noor
la source