记一个python requests模块请求的报错
今日突然发现线上出了一堆bug, 最终定位在 服务器上, 用python 请求一个 https协议的地址时, 出现了报错, 而这个报错阻挡了后续逻辑
报错内容是这样的:
SSLError: HTTPSConnectionPool(host='hooks.slack.com', port=443): Max retries exceeded with url: /services/T92******** (Caused by SSLError(SSLError(1, '_ssl.c:510: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure'),))
首先根据 ssl 怀疑是 证书问题;并且经测试, http协议的请求没有出错
先用 requests.post(url, verify=False) 关闭证书验证测试, 没有用, 还是这个报错
然后怀疑是库版本的问题, 用另一台服务器测试, 并没有出现这个报错,然后比对 两台服务器的不同, 相同的地方都暂不修改
- requests 库的版本 ,都是最新的 2.23.0
- 本地 openssl 的版本:
openssl version
, 都是OpenSSL 1.0.1f 6 Jan 2014
; 这个版本确实应该升级, 但是这个库比较底层, 不敢随便升级,而且升级起来也是比较麻烦的(在自用的服务器上搞过); 鉴于两台服务器上版本都一样, 也放弃了从这修改 - 本地ubuntu版本,
https://stackoverflow.com/a/31678467/11697500
这个回答中提到 把系统版本升级到 14.10 解决了这个问题,但是鉴于和openssl 相同的考虑, 比较两台服务器 系统版本
可以用lsb-release
查看系统版本, 我两台服务器都是 一样的,Ubuntu 14.04.5 LTS
求助谷歌, 和这个问题描述的基本一致:
https://stackoverflow.com/questions/31649390/python-requests-ssl-handshake-failure?answertab=votes#tab-top
这里有人建议 使用 pip install requests[security]
安装 requests库, 关于 和 直接 pip install requests 的区别, [这里][https://stackoverflow.com/a/31812342/11697500] 有解释,我摘抄一下
- 使用
pip install requests[security]
, 会额外安装 三个库, 分别是:pyOpenSSL
,cryptography
,idna
于是 用 pip install requests[security]
重新安装 requests库
遇到了这个问题:
pyopenssl 19.1.0 has requirement cryptography>=2.8, but you'll have cryptography 1.9 which is incompatible.
```
那就是 pyopenssl 和 cryptography 都没有安装成功,先更新 cryptography 这个库:
```
pip install --upgrade cryptography
From cffi callback <function _verify_callback at 0x7ffa9dc05668>:
Traceback (most recent call last):
File "/mnt/slots_spin/lib/slots_admin/venv/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 314, in wrapper
_lib.X509_up_ref(x509)
AttributeError: 'module' object has no attribute 'X509_up_ref'
Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError("bad handshake: Error([('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')],)",),)': /simple/cryptography/
```
最后一行报错比较眼熟, 和我们最初的问题一样, 发现 pip 的操作也会报这个错
试着 搜`AttributeError: 'module' object has no attribute 'X509_up_ref'`, 无果
又直接搜 `更新 cryptography`, 找到一个非常切合的帖子: `https://github.com/erjosito/ansible-azure-lab/issues/5#issuecomment-387747004`
这个问题中, 答主建议 先卸载 pyopenssl 和 cryptography, 再重新安装
```
pip uninstall pyOpenSSL cryptography
sudo pip install pyOpenSSL cryptography
```
成功,估计这两个库的版本不匹配, 所以前面安装失败
然后 重新执行 `pip install requests[security]`
成功,https请求也能正常执行了
虽然问题解决了 , 但是为什么突然会出问题, 还是有些疑问