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

我在Python2.6中使用pyVmomi编写脚本,同时使用其中一个连接方法:

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 urllib3 / /请求/包中)。

我已经尝试了在这里

import urllib3
...
urllib3.disable_warnings()

但这并没有改变任何事情。

695407 次浏览

你可以通过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)

HTTPS证书验证安全措施不是可以轻易放弃的。中间人攻击,它防止保护你免受第三方如吞下病毒或篡改或你的数据。
即使您只打算在测试环境中这样做,当移动到其他地方时,您也很容易忘记撤消它

相反,读取相关部分提供的链接并按照它说的去做。特定于requests(它与自己的urllib3副本捆绑)的方式,如CA证书-高级用法-请求2.8.1文档:

  • requests附带它自己的证书包(但它只能与模块一起更新)
  • 如果它被安装,它将使用(since requests v2.4.0) certifi代替
  • 在测试环境中,您可以根据如何更新certifi的根证书?轻松地将测试证书滑入certifi。例如,如果你用你的测试证书替换了它的包,如果你在转向生产时忘记撤销它,你会立即看到它。

最后,随着今天政府支持的全球黑客行动,如定制化接入操作中国的防火长城,目标是网络基础设施,遭受MITM攻击的可能性比你想象的更大。

我有类似的问题与PyVmomi客户端。在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。

这就是2017年的答案。urllib3不再是requests的一部分

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

对于每个这github注释,可以在1-line中通过requests禁用urllib3请求警告:

requests.packages.urllib3.disable_warnings()

这将抑制所有警告,而不仅仅是InsecureRequest(即它也会抑制InsecurePlatform等)。在我们只是想让东西工作的情况下,我发现简洁很方便。

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

提供不使用SSL连接到指定服务器的标准方法 验证。在连接到具有自签名证书的服务器时非常有用 或者当您希望完全忽略SSL

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

对于没有耐心的人,一个快速禁用python未验证HTTPS警告的方法:

export PYTHONWARNINGS="ignore:Unverified HTTPS request"

对于Python 2.7

添加环境变量PYTHONWARNINGS作为键,并忽略对应的值,如下所示:

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

如果某些包供应商提供了urllib3的副本,则接受的答案将不起作用,在这种情况下,这仍然有效:

import warnings


warnings.filterwarnings('ignore', message='Unverified HTTPS request')
如果导入的模块使用请求库,这可能对使用unittest的人有用。 添加

来抑制请求的vendor 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)

使用标准python库` 日志记录 `抑制日志


将此代码放在现有代码的顶部

import logging
urllib3_logger = logging.getLogger('urllib3')
urllib3_logger.setLevel(logging.CRITICAL)

警告消息

~/venv/lib/python3.4/site-packages/urllib3/connectionpool.py:857: InsecureRequestWarning:未经验证的HTTPS请求正在发出。强烈建议添加证书验证。参见:https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning) < / p >

在Debian 8中,这些步骤修复了这个问题。

  1. 用python3代码
import urllib3
urllib3.disable_warnings()
  1. 在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

使用新库构建依赖项

  1. 为python项目创建新的venv
python3 -m venv .venv
source .venv/bin/activate

在虚拟环境中清洁安装python项目下的模块

python3 -m pip install -e .

对于Python 3.7.9requests 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的直接导入似乎不包含与requests加载的相同的命名空间,因此disable_warnings不会改变requests所触及的数据结构。

如果您希望禁用警告,但又不想禁用来自其他包或应用程序其他部分的警告,下面介绍如何在每次调用时禁用它们。

步骤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的回答,这适用于requests >= 2.16.0)