我的计算机上安装了根CA证书,在使用请求库的系统安装时发出请求时一切正常:
$ python -c 'import requests; print requests.get("https://example.com")'
<Response [200]>
但是,如果我在虚拟环境中发出相同的请求,则证书验证将失败:
$ python -c 'import requests; print requests.get("https://example.com")'
requests.exceptions.SSLError: [Errno 1] _ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
使用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")
答案 0 :(得分:2)
如果要将特定CA证书插入到virtualenv的CA捆绑包中,您只需附加到它:
openssl x509 -in $specific_ca.crt -text >> $virtualenv/lib/python2.7/site-packages/certifi/cacert.pem
答案 1 :(得分:1)
系统软件包已通过系统软件包管理器安装,并已进行了修改,以便requests.certs.where
返回系统CA软件包/etc/ssl/certs/ca-certificates.crt
。在虚拟环境requests
内部通过pip安装,因此使用捆绑的cacert.pem
。
查看requests.certs
的来源,在python-certifi
指出了我。我用来解决我的问题的解决方案是创建一个python-certifi
样式的包,其中包含我需要的站点的根证书。
from my_certifi import where
requests.get("https://example.com" verify=where())
现在,无需任何系统相关的修改或配置即可验证对https://example.com
的任何请求。