• 记一个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请求也能正常执行了
    
    虽然问题解决了 , 但是为什么突然会出问题, 还是有些疑问
  • 相关阅读:
    集合、序列、字典
    测验2: Python基础语法(上) (第4周)
    geckodriver问题
    转:Loadrunner添加服务器监控
    转:JMeter监控内存及CPU ——plugin插件监控被测系统资源方法
    星号三角形
    天天向上的力量 III
    平方值格式化
    同符号数学运算
    JMeter 连接MySQL
  • 原文地址:https://www.cnblogs.com/zhang-can/p/12435503.html
Copyright © 2020-2023  润新知