使用certifi接收证书的请求验证失败

2024-04-26 07:13:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我在处理请求和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)

^{pr2}$

运行时也会出现相同的错误:

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

我(也许不正确)的假设是,这是由于远程系统过时的openssl库造成的。如果是这样的话,这让我很惊讶,因为我认为请求使用的是certifi CA cert bundle,这是两个系统上最新的版本。在

换句话说,如果我使用python certifi库,我在系统上安装了什么版本的OpenSSL有什么关系(如果有关系的话)。在python3.4.3中?在

注意

1)由于我的组织处理包管理的方式,升级我的系统的cert数据库有点困难,而且我的印象是,我们使用certifi库使这一切变得不必要。在

2)我知道我可以禁用SSL验证,甚至可以调用请求.get通过verify=\。但是,我在本地使用的第三方库中没有此控件,这会遇到相同的错误。我想要香草的请求.get(“https://google.com”)命令运行时没有添加参数。在


Tags: pippathhttpscomget远程系统google