475

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

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

import urllib3
...
urllib3.disable_warnings()

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

4

14 回答 14

1050

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)
于 2015-01-17T18:17:20.307 回答
147

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

import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
于 2017-06-18T14:14:51.910 回答
53

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

requests.packages.urllib3.disable_warnings()

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

于 2017-06-30T16:13:07.417 回答
43

HTTPS 证书验证安全措施不是随便丢弃的。它可以防止中间人攻击保护您免受第三方攻击,例如吸入病毒或篡改或窃取您的数据。
即使您只打算在测试环境中执行此操作,您在移动到其他地方时也很容易忘记撤消它。

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

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

最后,鉴于当今政府支持的全球黑客行动,如针对网络基础设施的定制访问行动中国防火墙,遭受 MITM 攻击的可能性比您想象的要大。

于 2015-11-15T03:43:45.093 回答
30

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

import warnings

warnings.filterwarnings('ignore', message='Unverified HTTPS request')
于 2019-08-26T11:33:29.087 回答
14

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

export PYTHONWARNINGS="ignore:Unverified HTTPS request"
于 2018-01-04T18:45:30.847 回答
7

对于Python 3.7.9and requests 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.

于 2021-07-07T03:23:10.817 回答
3

如果导入的模块使用请求库,这可能对使用单元测试的人有用。要抑制请求的供应商 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)
于 2020-12-24T11:36:55.377 回答
2

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。

于 2016-03-12T22:04:00.783 回答
2

警告信息

~/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 中,此步骤有效

  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 镜像

使用新库构建依赖项

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

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

python3 -m pip install -e .
于 2021-01-25T18:55:30.090 回答
2

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

第 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

第 2 步,打包您的电话:

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

警告只会对该呼叫静音。

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

于 2021-10-04T10:39:23.413 回答
1

使用标准 python 库' logging '抑制日志


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

import logging
urllib3_logger = logging.getLogger('urllib3')
urllib3_logger.setLevel(logging.CRITICAL)
于 2021-01-13T16:42:20.640 回答
0

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

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

service_instance = connect.SmartConnectNoSSL(host=args.ip,
                                             user=args.user,
                                             pwd=args.password)
于 2017-08-10T21:46:10.380 回答
0

对于Python 2.7

添加环境变量 PYTHONWARNINGS 作为键和要忽略的相应值,如:

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

于 2018-04-20T08:27:02.363 回答