我正在使用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()
但这并没有改变任何事情。
你可以通过PYTHONWARNINGS环境变量禁用任何Python警告。在本例中,您需要:
export PYTHONWARNINGS="ignore:Unverified HTTPS request"
使用Python代码禁用(请求>= 2.16.0):
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
对于< 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)
HTTPS证书验证安全措施不是可以轻易丢弃的东西。它所防止的中间人攻击可以保护您免受第三方的攻击,例如在您的数据中植入病毒或篡改或窃取您的数据。
即使您只打算在测试环境中执行该操作,当迁移到其他地方时,您也很容易忘记撤消它。
相反,请阅读所提供链接的相关部分,并按照它所说的去做。根据CA证书-高级用法-请求2.8.1文档,特定于请求的方式(捆绑在自己的urllib3副本中):
请求附带它自己的证书包(但它只能与模块一起更新)
如果已经安装,它将使用(因为请求v2.4.0)证书包
在测试环境中,您可以按照“如何更新证书的根证书?”. 例如,如果你用你的测试证书替换了它的包,如果你在转向生产时忘记撤销它,你会立即看到它。
最后,如今政府支持的全球黑客行动,如针对性的访问行动和中国的防火长城,目标是网络基础设施,遭受MITM攻击的可能性比你想象的要大。
如果导入的模块使用请求库,这可能对使用unittest的人有用。
要在请求所提供的urllib3中删除警告,请添加
warnings.filterwarnings('ignore', message='Unverified HTTPS request')
到setUp方法在你的测试类,即:
import unittest, warnings
class MyTests(unittest.TestCase):
def setUp(self):
warnings.filterwarnings('ignore', message='Unverified HTTPS request')
(all test methods here)
警告消息
~/venv/lib/python3.4/site-packages/urllib3/connectionpool.py:857: InsecureRequestWarning:未经验证的HTTPS请求正在发出。强烈建议添加证书验证。见:https://urllib3.readthedocs.io/en/latest/advanced-usage.html ssl-warnings
InsecureRequestWarning)
在Debian 8中,这些步骤修复了这个问题。
用python3代码
import urllib3
urllib3.disable_warnings()
在Debian上安装两个包
libssl1.0.0_1.0.2L-1_bpo8+1_amd64.deb
libssl-dev_1.0.2L-1_bpo8+1_amd64.deb
debian的镜子
下载以上deb包后,使用apt安装。
apt install ./libssl-dev_1.0.2l-1_bpo8+1_amd64.deb
apt install ./libssl1.0.0_1.0.2l-1_bpo8+1_amd64.deb
使用新库构建依赖项
为python项目创建新的venv
python3 -m venv .venv
source .venv/bin/activate
在虚拟环境中清洁安装python项目下的模块
python3 -m pip install -e .
对于Python 3.7.9和请求2.11.1,这是它在OP中抑制特定异常的唯一方法:
import requests
requests.packages.urllib3.disable_warnings(
requests.packages.urllib3.exceptions.InsecureRequestWarning)
不知道为什么上面的工作,而这个没有:
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
以下是工作版本的简化:
from requests.packages import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
…看起来urllib3的直接导入不包含与请求加载的名称空间相同的名称空间,因此disable_warnings不会改变请求所接触的数据结构。
如果您希望禁用警告,但又不想禁用来自其他包或应用程序其他部分的警告,下面介绍如何在每次调用时禁用它们。
步骤1,创建一个上下文管理器。
from contextlib import contextmanager
@contextmanager
def disable_ssl_warnings():
import warnings
import urllib3
with warnings.catch_warnings():
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
yield None
第二步,结束通话:
with disable_ssl_warnings():
requests.get('https://example.com')
警告只会在那通电话时被解除。
(根据@shazow的回答,这适用于请求>= 2.16.0)