我正在运行一个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_BUNDLE
或CURL_CA_BUNDLE
环境变量指向这些文件。但是,我没有可用的证书包。
如何在不编辑外部模块代码的情况下禁用外部模块的SSL验证?
3条答案
按热度按时间kzipqqlq1#
注:此解决方案是一个完整的黑客。
简答:将
CURL_CA_BUNDLE
环境变量设置为空字符串。使用前:
字符串
之后:
型
如何运作
这个解决方案之所以有效,是因为Python
requests
覆盖了环境变量CURL_CA_BUNDLE
和REQUESTS_CA_BUNDLE
中verify
的默认值,如下图所示:型
环境变量用于指定证书文件或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 None
与None or ''
不同,如下所示:型
sq1bmfud2#
我看到这个黑客只是由于一些麻烦与我的私人CA.
在2022年,
CURL_CA_BUNDLE=''
的黑客攻击将不再适用于下一个minor release
的请求(这意味着2.28?)。请参考2022年2月6日前修复的GH问题6071
toiithl63#
我的问题是第三方软件包发送了请求,所以我没有机会影响
verify = True
。是什么帮助了我:
字符串
然后:
型