我在 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)
这是 2017 年的答案。urllib3
不再是 requests
的一部分
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
requests >= 2.16.0
的
requests
版本是 2.21.0
,它有 urllib3
。我尝试了 2.16.0
,`2.16.1, and
2.17.0`,他们都有 urllib3
。我试过 2.4.0
,但那个没有。他们把它加回来了吗?
requests
不再供应 urllib3
,但它仍然是 requests
的依赖项。所以导入仍然可以很好地解决,不需要导入 urllib3
。要验证:python -c 'import requests; print(requests.packages.urllib3.__path__)'
仍将打印 urllib3
包的路径。
根据 this github 评论,可以通过 1-liner 中的 requests
禁用 urllib3
请求警告:
requests.packages.urllib3.disable_warnings()
这将抑制 所有 警告,而不仅仅是 InsecureRequest
(即它也会抑制 InsecurePlatform
等)。在我们只想让东西正常工作的情况下,我觉得简洁很方便。
requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)
似乎有效。
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 Operations 和 the Great Firewall of China)以网络基础设施为目标,遭受 MITM 攻击的可能性比您想象的要大。
verify=False
,则可能是这样。
如果某些软件包供应商是自己的 urllib3 副本,则接受的答案不起作用,在这种情况下,这仍然有效:
import warnings
warnings.filterwarnings('ignore', message='Unverified HTTPS request')
对于不耐烦的,禁用 python 未经验证的 HTTPS 警告的快速方法:
export PYTHONWARNINGS="ignore:Unverified HTTPS request"
$env:PYTHONWARNINGS="ignore:Unverified HTTPS request"
对于 Python 3.7.9
和 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
触及的数据结构。
如果您想禁用警告,但不想让来自其他包或应用程序其他部分的警告静音,以下是如何在每次调用时禁用它们。
第 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
)
如果导入的模块使用请求库,这可能对使用单元测试的人有用。要抑制请求的供应商 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)
警告信息
~/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
使用新库构建依赖项
为 python 项目创建新的 venv
python3 -m venv .venv
source .venv/bin/activate
在虚拟环境中的python项目下清理安装模块
python3 -m pip install -e .
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。
为什么不使用 pyvmomi original function SmartConnectNoSSL
。他们added在 June 14, 2016
上将此函数命名为 ConnectNoSSL
,one day after 他们将名称更改为 SmartConnectNoSSL
,使用它而不是通过在项目中使用不必要的代码行传递警告?
提供一种无需 SSL 验证即可连接到指定服务器的标准方法。在使用自签名证书连接到服务器或希望完全忽略 SSL 时很有用
service_instance = connect.SmartConnectNoSSL(host=args.ip,
user=args.user,
pwd=args.password)
对于 Python 2.7
添加环境变量 PYTHONWARNINGS 作为键和要忽略的相应值,如:
os.environ['PYTHONWARNINGS']="ignore:Unverified HTTPS request"
使用标准 python 库“日志记录”抑制日志
将此代码放在现有代码的顶部
import logging
urllib3_logger = logging.getLogger('urllib3')
urllib3_logger.setLevel(logging.CRITICAL)
不定期副业成功案例分享
PYTHONWARNINGS="ignore:Unverified HTTPS request"
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
。