带有certifi的请求会收到CERTIFICATE_VERIFY_FAILED

时间:2018-03-09 18:14:15

标签: python openssl certificate python-requests certifi

我在使用请求和证书时遇到了一些奇怪的行为,并且我不完全确定他们是否/如何与我的系统的CA捆绑进行交互,以及它们应该如何。

本地(ubuntu 16.04),在virtualenv内

当我在本地使用requests == 2.18.4和certifi == 2018.1.18运行一个简单的请求时,事情就好了

$ pip freeze | grep "requests"
requests==2.18.4
requests-mock==0.6.0
requests-oauthlib==0.4.2
$ pip freeze | grep "certifi"
certifi==2018.1.18
$ openssl version
OpenSSL 1.0.2g  1 Mar 2016
$ python
Python 3.4.3 (default, Mar  7 2018, 11:51:27) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.utils.DEFAULT_CA_BUNDLE_PATH
'/PATH/TO/APP/venv/lib/python3.4/site-packages/certifi/cacert.pem'
>>> requests.get('https://google.com')
<Response [200]>
>>> 

但是,在安装了相同库的不同远程服务器上(本地安装了过时的证书),我的请求行为完全不同:

远程服务器(centos 6.6)

$ pip freeze | grep "requests"
requests==2.18.4
requests-mock==0.6.0
requests-oauthlib==0.8.0
$ pip freeze | grep "certifi"
certifi==2018.1.18
$ openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
$ python
Python 3.4.3 (default, Apr  7 2015, 17:44:40) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.utils.DEFAULT_CA_BUNDLE_PATH
'/PATH/TO/APP/venv/lib/python3.4/site-packages/certifi/cacert.pem'
>>> requests.get('https://google.com')
...
requests.exceptions.SSLError: HTTPSConnectionPool(host='google.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)'),))

运行时出现同样的错误:

requests.get('https://google.com', verify=requests.utils.DEFAULT_CA_BUNDLE_PATH)

我的(可能是不正确的)假设是这是由于远程系统过时的openssl库。如果是这种情况,这让我感到惊讶,因为我认为请求使用的是certifi CA证书捆绑包,这是两个系统上的最新版本。

换句话说,如果我使用python certifi库,为什么在我的系统上安装了什么版本的OpenSSL,这一点很重要(如果它确实重要)。在python 3.4.3?

注意

1)升级我的系统的证书数据库有点挑战,因为我的组织处理包管理的方式,而且我的印象是我们使用certifi库使得无论如何这都是不必要的。

2)我知道我可以禁用SSL验证,甚至可以通过verify = ___调用带有有效证书文件路径的requests.get。但是,我在本地使用的第三方库中没有此控件,遇到相同的错误。我更喜欢在没有添加参数的情况下运行一个vanilla request.get(&#34; https://google.com&#34;)命令。

0 个答案:

没有答案