抑制 InsecureRequestWarning:Python2.6 中发出未经验证的 HTTPS 请求

Suppress InsecureRequestWarning: Unverified HTTPS request is being made in Python2.6

我在 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/requests/packages/urllib3/ 中)。

我按照建议试过了here

import urllib3
...
urllib3.disable_warnings()

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

您可以通过 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 证书验证安全措施不能轻易丢弃。它防止的中间人攻击保护您免受第三方的侵害,例如中感染病毒或篡改或窃取您的数据。
即使您只打算在测试环境中执行此操作,在移动到其他地方时也很容易忘记撤消它。

改为阅读 the relevant section on the provided link and do as it says. The way specific for requests (which bundles with its own copy of urllib3), as per CA Certificates — Advanced Usage — Requests 2.8.1 documentation:

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

最后,由于当今 Tailored Access Operations and the Great Firewall of China 等以网络基础设施为目标的政府支持的全球黑客行动,遭受 MITM 攻击的可能性比您想象的要大。

我在使用 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。

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

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

根据 this github 评论,可以通过 1-liner 中的 requests 禁用 urllib3 请求警告:

requests.packages.urllib3.disable_warnings()

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

为什么不使用 pyvmomi original function SmartConnectNoSSL。 他们 added this function on June 14, 2016 and named it ConnectNoSSL, one day after 他们将名称更改为 SmartConnectNoSSL,使用它而不是通过在您的项目中传递带有不必要代码行的警告?

Provides a standard method for connecting to a specified server without SSL verification. Useful when connecting to servers with self-signed certificates or when you wish to ignore SSL altogether

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 作为 key 和对应的忽略值如:

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

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

import warnings

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

如果导入的模块使用请求库,这可能对使用单元测试的人有用。 要在请求的 vendored urllib3 中抑制警告,请添加

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

在你的测试类中设置方法,即:

import unittest, warnings

class MyTests(unittest.TestCase):
    
    def setUp(self):
        warnings.filterwarnings('ignore', message='Unverified HTTPS request')
    
    (all test methods here)

使用标准 python 库'logging'

抑制日志

将此代码置于现有代码之上

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

警告信息

~/venv/lib/python3.4/site-packages/urllib3/connectionpool.py:857: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning)

在 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 mirror

与新库建立依赖关系

  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.

触及的结构

如果您想禁用警告,但又不想让来自其他包或应用程序其他部分的警告静音,这里是如何在每次调用时禁用它们。

第一步,创建上下文管理器。

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

第 2 步,结束通话:

with disable_ssl_warnings():
    requests.get('https://example.com')

警告只会针对该调用静音。

(根据@shazow 的回答,这适用于 requests >= 2.16.0