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

Chr*_*our 6 python virtualenv python-requests

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

$ python -c 'import requests; print requests.get("https://example.com")'
<Response [200]>
Run Code Online (Sandbox Code Playgroud)

但是,如果我在虚拟环境中发出相同的请求,则证书验证将失败:

$ 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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

是否有另一种解决方案来获取系统证书,而无需在使用时为每个请求提供路径virtualenv,即:

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

gma*_*gma 5

如果你想在你的 virtualenv 的 CA 包中插入一个特定的 CA 证书,你可以附加到它:

openssl x509 -in $specific_ca.crt -text >> $virtualenv/lib/python2.7/site-packages/certifi/cacert.pem
Run Code Online (Sandbox Code Playgroud)


Chr*_*our 3

系统包已通过系统包管理器安装并已被修改,以便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())
Run Code Online (Sandbox Code Playgroud)

现在,任何请求都https://example.com将得到验证,无需进行任何与系统相关的修改或配置。