Python 使用虚拟环境时的证书验证

Python 使用虚拟环境时的证书验证,python,python-requests,virtualenv,Python,Python Requests,Virtualenv,我的计算机上安装了根CA证书,使用请求库的系统安装发出请求时一切正常: $ python -c 'import requests; print requests.get("https://example.com")' <Response [200]> 使用requests.certs.where我可以看到系统安装使用系统CA捆绑包,虚拟环境使用请求附带的CA捆绑包: $ python -c "import requests; print requests.certs.where()

我的计算机上安装了根CA证书,使用请求库的系统安装发出请求时一切正常:

$ python -c 'import requests; print requests.get("https://example.com")'
<Response [200]>
使用
requests.certs.where
我可以看到系统安装使用系统CA捆绑包,虚拟环境使用请求附带的CA捆绑包:

$ python -c "import requests; print requests.certs.where()"
/etc/ssl/certs/ca-certificates.crt

$ (venv) python -c "import requests; print requests.certs.where()"                                                            
.../venv/local/lib/python2.7/site-packages/requests/cacert.pem
在使用
virtualenv
时,是否有另一种方法可以在不提供每个请求路径的情况下获取系统证书,即:

>>> requests.get("https://example.com" verify="/etc/ssl/certs/ca-certificates.crt")

系统包已通过系统包管理器安装,并已进行修改,以便
requests.certs.where
返回系统CA捆绑包
/etc/ssl/certs/CA certificates.crt
。在虚拟环境中,
请求
通过pip安装,因此使用捆绑的
cacert.pem

我看了看资料来源。我用来解决问题的解决方案是创建一个
python-certifi
风格的包,其中包含我需要的站点的根证书

from my_certifi import where
requests.get("https://example.com" verify=where())

现在,任何对
https://example.com
将在不需要任何系统相关修改或配置的情况下进行验证

如果要将特定CA证书插入到virtualenv的CA捆绑包中,只需附加到它:

openssl x509 -in $specific_ca.crt -text >> $virtualenv/lib/python2.7/site-packages/certifi/cacert.pem
openssl x509 -in $specific_ca.crt -text >> $virtualenv/lib/python2.7/site-packages/certifi/cacert.pem