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

sh7euo9m  于 11个月前  发布在  Python
关注(0)|答案(3)|浏览(163)

我正在运行一个Python脚本,它使用requests包来发出Web请求。然而,Web请求通过一个带有自签名证书的代理。因此,请求会引发以下异常:
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')],)",)
我知道可以在我自己的代码中通过传递verify=False来禁用SSL验证,例如:requests.get("https://www.google.com", verify=False)。我还知道如果我有证书包,我可以设置REQUESTS_CA_BUNDLECURL_CA_BUNDLE环境变量指向这些文件。但是,我没有可用的证书包。
如何在不编辑外部模块代码的情况下禁用外部模块的SSL验证?

kzipqqlq

kzipqqlq1#

:此解决方案是一个完整的黑客。
简答:将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_BUNDLEverify的默认值,如下图所示:

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
请注意,这个技巧只适用于CURL_CA_BUNDLE环境变量-它不适用于REQUESTS_CA_BUNDLE。这是因为verify是用以下语句设置的:
verify = (os.environ.get('REQUESTS_CA_BUNDLE') or os.environ.get('CURL_CA_BUNDLE'))
它只适用于CURL_CA_BUNDLE,因为'' or NoneNone or ''不同,如下所示:

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

sq1bmfud

sq1bmfud2#

我看到这个黑客只是由于一些麻烦与我的私人CA.
在2022年,CURL_CA_BUNDLE=''的黑客攻击将不再适用于下一个minor release的请求(这意味着2.28?)。
请参考2022年2月6日前修复的GH问题6071

toiithl6

toiithl63#

我的问题是第三方软件包发送了请求,所以我没有机会影响verify = True
是什么帮助了我:

pip install pip-system-certs

字符串
然后:

import pip_system_certs #import as first package

相关问题