我正在经历一些与请求和证书有关的奇怪行为,并且不完全确定它们是否/如何与我的系统的CA包交互,以及它们应该是怎样的。
本地(ubuntu16.04),在虚拟中
当我在本地使用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库所致。如果是这样的话,这让我感到惊讶,因为我认为请求使用的是证书CA证书包,这是这两个系统上的最新版本。
换句话说,如果我使用库,那么我在我的系统上安装了什么版本的OpenSSL (如果它确实重要的话),这有什么关系呢?在python 3.4.3?
注意事项
1)升级我的系统的cert数据库有点困难,因为我的组织处理包管理的方式,我的印象是,我们使用的证书库,这是不必要的。
2)我知道我可以禁用SSL验证,甚至可以通过verify=___调用带有有效证书文件路径的verify=___。但是,在本地使用的第三方库中没有此控件,这些库也会遇到相同的错误。我更希望在不添加参数的情况下运行一个普通的requests.get("https://google.com")命令。
发布于 2022-02-04 14:11:02
我对ssl失败也有类似的问题。当我从PyPi添加python-证书- went 32模块时,我的问题就消失了。“此包修补程序在运行时验证还包括来自windows证书存储区的证书。”我相信这可能是在OSx上安装“OSx”的Windows版本。(touched on here)
https://stackoverflow.com/questions/49199780
复制相似问题