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

禁用导入模块的Python请求SSL验证,python,ssl,python-requests,Python,Ssl,Python Requests,我正在运行一个Python脚本,它使用requests包进行web请求。但是,web请求通过具有自签名证书的代理。因此,请求引发以下异常: requests.exceptions.SSLError:(“握手错误:错误([('SSL例程','SSL3\u获取服务器\u证书','CERTIFICATE verify failed'),),),) 我知道通过传递verify=False,可以在我自己的代码中禁用SSL验证,例如:请求。get(“https://www.google.com,verify

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

requests.exceptions.SSLError:(“握手错误:错误([('SSL例程','SSL3\u获取服务器\u证书','CERTIFICATE verify failed'),),),)

我知道通过传递
verify=False
,可以在我自己的代码中禁用SSL验证,例如:
请求。get(“https://www.google.com,verify=False)
。我还知道,如果我有证书捆绑包,我可以将
请求\u CA\u捆绑包
CURL\u CA\u捆绑包
环境变量设置为指向这些文件。但是,我没有可用的证书捆绑包


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

注意:此解决方案完全是一种黑客行为

简短回答:将
CURL\u CA\u 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')],)",)
环境变量用于指定证书文件或CA_捆绑包的路径,并复制到
verify
。但是,通过将
CURL\u CA\u BUNDLE
设置为空字符串,将空字符串复制到
verify
中,在Python中,空字符串的计算结果为
False

请注意,此攻击只适用于
CURL\u CA\u BUNDLE
环境变量-它不适用于
请求\u CA\u BUNDLE
。这是因为
验证

verify=(os.environ.get('REQUESTS\u CA\u BUNDLE')或os.environ.get('CURL\u CA\u BUNDLE'))

它只适用于
CURL\u CA\u BUNDLE
,因为
''或None
None或'
不同,如下所示:

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

我已经在Unix上成功地使用了这项技术,但无法在windows上使用。您是否在windows机器上尝试过
set CURL\u CA\u BUNDLE=“”
setx CURL\u CA\u BUNDLE=“”
?在Mac上也没有尝试过:(它的简单性和黑客性令人惊讶:)在macOS 10.14和Python3.7/3.8上确认这一点。@David:这就是变量在Bash和类似shell中的工作方式。如果只执行
CURL\u CA\u BUNDLE=“
,则仅在该特定shell的上下文中或为同一行上的命令设置变量。如果使用
export CURL\u CA\u BUNDLE=“
,则它也将应用于从该shell启动的任何新进程,如Python(但仍然不是完全独立进程中的进程)。
if verify is True or verify is None:
verify = (os.environ.get('REQUESTS_CA_BUNDLE') or
    os.environ.get('CURL_CA_BUNDLE'))
print repr(None or "")
# Prints: ''
print repr("" or None )
# Prints: None