首页  >  文章  >  后端开发  >  如何在Python请求中禁用安全证书验证?

如何在Python请求中禁用安全证书验证?

Barbara Streisand
Barbara Streisand原创
2024-10-29 00:15:30774浏览

How to Disable Security Certificate Verification in Python Requests?

在 Python 请求中禁用安全证书验证

使用 Python 请求库与 HTTPS 端点交互时,您可能会遇到与无效 SSL 相关的错误证书。为了缓解这个问题,您可以在请求中禁用证书验证。

根据官方文档,您可以通过将 verify 参数设置为 False 来实现此目的。这指示请求绕过证书验证。

<code class="python">import requests

requests.post(url='https://foo.example', data={'bar': 'baz'}, verify=False)</code>

或者,对于可能处理 SSL 验证的第三方模块,您可以使用上下文管理器来抑制警告并禁用验证。这涉及到将 requests.Session.merge_environment_settings 方法替换为默认将 verify 设置为 False 的自定义版本。

<code class="python">import warnings
import contextlib

import requests
from urllib3.exceptions import InsecureRequestWarning

old_merge_environment_settings = requests.Session.merge_environment_settings

@contextlib.contextmanager
def no_ssl_verification():
    opened_adapters = set()

    def merge_environment_settings(self, url, proxies, stream, verify, cert):
        opened_adapters.add(self.get_adapter(url))

        settings = old_merge_environment_settings(self, url, proxies, stream, verify, cert)
        settings['verify'] = False

        return settings

    requests.Session.merge_environment_settings = merge_environment_settings

    try:
        with warnings.catch_warnings():
            warnings.simplefilter('ignore', InsecureRequestWarning)
            yield
    finally:
        requests.Session.merge_environment_settings = old_merge_environment_settings

        for adapter in opened_adapters:
            try:
                adapter.close()
            except:
                pass</code>

您可以按如下方式使用此上下文管理器:

<code class="python">with no_ssl_verification():
    requests.get('https://wrong.host.badssl.example/')
    print('It works')

requests.get('https://wrong.host.badssl.example/', verify=False)
print('It resets back')</code>

它值得注意的是,此解决方案会影响上下文管理器范围内发出的所有请求。因此,除非明确指定,后续请求也将绕过证书验证。

以上是如何在Python请求中禁用安全证书验证?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn