记一个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) 关闭证书验证测试, 没有用, 还是这个报错
然后怀疑是库版本的问题, 用另一台服务器测试, 并没有出现这个报错,然后比对 两台服务器的不同, 相同的地方都暂不修改

  1. requests 库的版本 ,都是最新的 2.23.0
  2. 本地 openssl 的版本: openssl version , 都是 OpenSSL 1.0.1f 6 Jan 2014; 这个版本确实应该升级, 但是这个库比较底层, 不敢随便升级,而且升级起来也是比较麻烦的(在自用的服务器上搞过); 鉴于两台服务器上版本都一样, 也放弃了从这修改
  3. 本地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请求也能正常执行了

虽然问题解决了 , 但是为什么突然会出问题, 还是有些疑问
posted @ 2020-03-07 17:08  张璨  阅读(2076)  评论(0编辑  收藏  举报