禁止InsecureRequestWarning:在Python2.6中发出未经验证的HTTPS请求


345

我正在使用pyVmomi并使用一种连接方法在Python2.6中编写脚本:

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

我收到以下警告:

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

有趣的是,我没有随pip一起安装urllib3(但在/usr/lib/python2.6/site-packages/requests/packages/urllib3/中)。

我已经尝试按照这里的建议

import urllib3
...
urllib3.disable_warnings()

但这并没有改变任何东西。



一个全球性的和完全地工作液有:stackoverflow.com/questions/14463277/...
jmcollin92

2
警告:当您不关心有人冒充远程服务器
ivan_pozdeev '18

4
好吧,警告并不能真正阻止任何事情的发生。这不是禁用验证,而是禁用有关缺少验证的警告。
dwanderson '18

Answers:


794

您可以通过PYTHONWARNINGS环境变量禁用任何Python警告。在这种情况下,您需要:

export PYTHONWARNINGS="ignore:Unverified HTTPS request"

要禁用使用Python代码(requests >= 2.16.0):

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

对于requests < 2.16.0,请参见下面的原始答案。

原始答案

这样urllib3.disable_warnings()做对您不起作用的原因是,您似乎正在使用请求中提供的urllib3的单独实例。

我根据这里的路径收集此信息: /usr/lib/python2.6/site-packages/requests/packages/urllib3/connectionpool.py

要在请求的供应商urllib3中禁用警告,您需要导入模块的特定实例:

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

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

我在博客中介绍了我在pyvmomi上所做的开发工作,并于2014年10月涵盖了此问题。我只是分享此链接以帮助其他人将来找到有用的pyvmomi信息:errr-online.com/index.php/tag/pyvmomi
Michael Rice

37
PYTHONWARNINGS="ignore:Unverified HTTPS request"
Rahul Patil

2
为了完整性:from requests.packages.urllib3.exceptions import InsecureRequestWarning
propjk007'1

2
这个答案已经过时了。有关现代版本,请参见Nayana Adassuriya的答案。
达卡龙

3
复制自Nayana Adassuriya的答案:import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
塞缪尔

116

这是在2017年的答案urllib3不是的一部分requests

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

7
年的导入量少于您使用的python的修订号。
CodeMonkey

3
是的,修订比年度更重要。这是针对requests >= 2.16.0
dwanderson

有人可以张贴urllib3的版本,当我尝试这一点,它说urllib3有没有属性“disable_warnings”
steff_bdh

1
我对此回应感到困惑。我的requests版本是2.21.0,它具有urllib3。我试过了2.16.0“ 2.16.1 , and 2.17.0”,他们都吃过urllib3。我尝试过2.4.0,但是没有。他们重新添加了吗?
Mike Furlender

为我工作!
deepdive

35

根据这个github评论,可以urllib3通过requests1-liner 禁用请求警告:

requests.packages.urllib3.disable_warnings()

但这不仅会抑制所有警告InsecureRequest(即也会抑制InsecurePlatform等)。如果我们只是想让东西起作用,我会觉得简洁很方便。


4
这是2.7的最佳选择,因为我不需要导入urllib3只是为了消除警告
CodeMonkey

3
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)似乎有效。
mattalxndr

29

正确的方法是阅读所提供链接上的相关部分,并按照说明进行操作。根据CA证书-高级用法-要求2.8.1文档的特定方式requests(捆绑有其自己的副本urllib3):

  • requests 带有自己的证书捆绑包(但只能与模块一起更新)
  • 它将使用(因为requests v2.4.0certifi,而不是如果已安装它

HTTPS证书验证安全性措施不能轻易丢弃。它阻止了中间人攻击,从而保护了您免受第三方的侵害,例如在其中感染病毒,篡改或窃取数据。

如今,借助政府支持的全球黑客攻击活动(如量身定制的访问操作针对中国网络基础架构的中国防火墙),您比您想象的更有可能。


我有要求2.8.1和certifi 2015.11.20.1,但仍然收到警告。
AlexBartiş2015年

3
@AlexBartiş如果您(或您调用的某些代码)通过,则可能是这样verify=False
ivan_pozdeev 2015年

2
为什么这个答案的选票很少?忽略这些警告实际上安全吗?
sgryzko '16

1
@sgryzko仅当您不关心冒充远程服务器的人时。可能很多人确实不在乎和/或没有阅读超出第一个答案的内容,这有助于积极的反馈周期。差不多一年后,这个答案也被发布了。
ivan_pozdeev

2
是的,您应该在生产环境中做正确的事,并且盲目地抑制错误是不好的。但是,在测试环境中抑制这些错误是完全合法的。
Vroo

12

不耐烦的是,禁用python未经验证的HTTPS警告的快速方法:

export PYTHONWARNINGS="ignore:Unverified HTTPS request"

对于powershell,命令是$env:PYTHONWARNINGS="ignore:Unverified HTTPS request"
Gwen Au

10

如果某些软件包供应商拥有自己的urllib3副本,则可接受的答案不起作用,在这种情况下,它仍然有效:

import warnings

warnings.filterwarnings('ignore', message='Unverified HTTPS request')

1

我的PyVmomi Client也有类似的问题。使用Python版本2.7.9,我用以下代码行解决了这个问题:

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

请注意,要使其正常工作,您至少需要Python 2.7.9。


1

为什么不使用pyvmomi 原始功能 SmartConnectNoSSL。他们添加了此函数June 14, 2016并为其命名ConnectNoSSL将名称更改为一天后SmartConnectNoSSL,使用它而不是通过项目中不必要的代码行传递警告?

提供一种无需SSL验证即可连接到指定服务器的标准方法。在使用自签名证书连接到服务器或希望完全忽略SSL时很有用

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.