gpt4 book ai didi

python - 禁用 Python 请求导入模块的 SSL 验证

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:15 26 4
gpt4 key购买 nike

我正在运行一个 Python 脚本,该脚本使用 requests 包来发出 Web 请求。但是,网络请求通过具有自签名证书的代理。因此,请求引发以下异常:

requests.exceptions.SSLError: ("握手错误:Error([('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')],)",)

我知道可以通过传递 verify=False 在我自己的代码中禁用 SSL 验证,例如:requests.get("https://www.google.com", verify =假)。我还知道,如果我有证书包,我可以设置 REQUESTS_CA_BUNDLECURL_CA_BUNDLE 环境变量以指向这些文件。但是,我没有可用的证书包。

如何在不编辑外部模块代码的情况下禁用外部模块的 SSL 验证?

最佳答案

注意:这个解决方案是一个完整的 hack。

简答:将 CURL_CA_BUNDLE 环境变量设置为空字符串。

之前:

$ python
import requests
requests.get('http://www.google.com')
<Response [200]>

requests.get('https://www.google.com')
...
File "/usr/local/lib/python2.7/site-packages/requests-2.17.3-py2.7.egg/requests/adapters.py", line 514, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')],)",)

之后:

$ CURL_CA_BUNDLE="" python
import requests
requests.get('http://www.google.com')
<Response [200]>

requests.get('https://www.google.com')
/usr/local/lib/python2.7/site-packages/urllib3-1.21.1-py2.7.egg/urllib3/connectionpool.py:852: 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)
<Response [200]>

工作原理

此解决方案有效,因为 Python requests 从环境变量 CURL_CA_BUNDLEREQUESTS_CA_BUNDLE 覆盖了 verify 的默认值,可以看出here :

if verify is True or verify is None:
verify = (os.environ.get('REQUESTS_CA_BUNDLE') or
os.environ.get('CURL_CA_BUNDLE'))

环境变量用于指定证书文件或 CA_BUNDLE 的路径,并被复制到 verify 中。但是,通过将 CURL_CA_BUNDLE 设置为空字符串,空字符串将被复制到 verify 中,并且在 Python 中,空字符串的计算结果为 False

请注意,此 hack 仅适用于 CURL_CA_BUNDLE 环境变量 - 它不适用于 REQUESTS_CA_BUNDLE。这是因为验证 is set with the following statement :

验证 = (os.environ.get('REQUESTS_CA_BUNDLE') 或 os.environ.get('CURL_CA_BUNDLE'))

它仅适用于 CURL_CA_BUNDLE,因为 '' or NoneNone or '' 不同,如下所示:

print repr(None or "")
# Prints: ''
print repr("" or None )
# Prints: None

关于python - 禁用 Python 请求导入模块的 SSL 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48391750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com