ChatGPT解决这个技术问题 Extra ChatGPT

抑制 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/requests/packages/urllib3/ 中)。

我已按照建议here尝试过

import urllib3
...
urllib3.disable_warnings()

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

您可以尝试按照此答案 stackoverflow.com/questions/7234262/… 中的说明设置该特定模块的日志级别
有一个全球性且完全有效的解决方案:stackoverflow.com/questions/14463277/…
警告:仅当您不关心有人冒充远程服务器时才禁用证书验证!
好吧,警告并不能真正阻止正在发生的事情。它不是禁用验证,而是禁用有关缺乏验证的警告。

T
Thiago Figueiro

您可以通过 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
PYTHONWARNINGS="ignore:Unverified HTTPS request"
为了完整性:from requests.packages.urllib3.exceptions import InsecureRequestWarning
这个答案已经过时了。对于现代版本,请参阅 Nayana Adassuriya 的回答。
复制自 Nayana Adassuriya 的回答:import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
N
Nayana Adassuriya

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

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

年份比您使用的 python 的修订号要少。
是的,修订比一年更重要。这是给requests >= 2.16.0
有人可以发布 urllib3 的版本吗,当我尝试这个时,它说 urllib3 没有属性'disable_warnings'
我对这个回应感到困惑。我的 requests 版本是 2.21.0,它有 urllib3。我尝试了 2.16.0,`2.16.1, and 2.17.0`,他们都有 urllib3。我试过 2.4.0,但那个没有。他们把它加回来了吗?
@MikeFurlender 您很困惑,因为答案具有误导性 - 尽管 requests 不再供应 urllib3,但它仍然是 requests依赖项。所以导入仍然可以很好地解决,不需要导入 urllib3。要验证:python -c 'import requests; print(requests.packages.urllib3.__path__)' 仍将打印 urllib3 包的路径。
D
David Ferenczy Rogožan

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

requests.packages.urllib3.disable_warnings()

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


这是 2.7 的最佳选择,因为我不需要导入 urllib3 只是为了抑制警告
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning) 似乎有效。
i
ivan_pozdeev

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

相反,请阅读 the relevant section on the provided link 并按照它说的做。根据 CA Certificates — Advanced Usage — Requests 2.8.1 documentation,特定于 requests 的方式(与自己的 urllib3 副本捆绑):

requests 附带自己的证书包(但只能与模块一起更新)

如果已安装,它将使用(自请求 v2.4.0 起)certifi 包

在测试环境中,您可以根据如何更新 certifi 的根证书轻松地将测试证书滑入 certifi? .例如,如果您只用您的测试证书替换它的捆绑包,如果您在进入生产环境时忘记撤消它,您将立即看到它。

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


@AlexBartiş 如果您(或您调用的某些代码)通过 verify=False,则可能是这样。
为什么这个答案的票这么少?忽略这些警告真的安全吗?
@sgryzko 仅当您不关心有人冒充远程服务器时。可能,许多人确实不在乎和/或不阅读超出第一个答案的内容,从而促成了积极的反馈循环。这个答案也在将近一年后发布。
是的,你应该在生产环境中做正确的事,一味地压制错误是不好的。但是想要在测试环境中抑制这些错误是完全有效的。
如果我想听讲 TLS 证书,我会点击错误消息中的链接。
Y
Yigal

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

import warnings

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

W
Wenbing Li

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

export PYTHONWARNINGS="ignore:Unverified HTTPS request"

对于 powershell,命令是 $env:PYTHONWARNINGS="ignore:Unverified HTTPS request"
T
Timothy C. Quinn

对于 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 触及的数据结构。


这就像一个魅力。只是为了确保在第二行被评论时警告会回来。
E
Erik

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

第 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


V
VladimirB

如果导入的模块使用请求库,这可能对使用单元测试的人有用。要抑制请求的供应商 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)

缺少必需的导入。
E
EsmaeelE

警告信息

~/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 mirror

使用新库构建依赖项

为 python 项目创建新的 venv

python3 -m venv .venv
source .venv/bin/activate

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

python3 -m pip install -e .

R
Rajive Pai

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。


c
carcaret

为什么不使用 pyvmomi original function SmartConnectNoSSL。他们addedJune 14, 2016 上将此函数命名为 ConnectNoSSLone day after 他们将名称更改为 SmartConnectNoSSL,使用它而不是通过在项目中使用不必要的代码行传递警告?

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

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

I
Imran Al Noor

对于 Python 2.7

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

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


j
jkmartindale

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

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

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

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅