【问题标题】:SSL error with Python requests despite up-to-date dependencies尽管有最新的依赖关系,但 Python 请求出现 SSL 错误
【发布时间】:2017-03-01 18:07:19
【问题描述】:

我收到 SSL“错误握手”错误。对此问题的大多数类似响应似乎都来自旧库,1024 位证书。不兼容等...我认为我是最新的,但无法弄清楚为什么会出现此错误。

设置:

  • 请求 2.13.0
  • 证书 2017.01.23
  • 'OpenSSL 1.0.2g 2016 年 3 月 1 日'

我正在使用这个 API(2048 位证书密钥):https://api.sidecar.io/rest/v1/provision/application/device/count/

得到这个错误: requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

参见https://github.com/sidecar-io/sidecar-python-sdk/blob/master/sidecar.py 的 l.44

如果我在请求中转入verify=False,我可以绕过,但我宁愿找出认证失败的原因。

非常感谢任何帮助;谢谢!

【问题讨论】:

    标签: python ssl ssl-certificate python-requests


    【解决方案1】:

    验证失败是因为您访问的服务器设置不正确,也就是说,这不是您的设置或代码的错误。看着report from SSLLabs你看到了

    此服务器的证书链不完整。等级上限为 B。

    这意味着服务器将缺少中间证书的证书链发送到受信任的根,因此您的客户端无法构建信任链。大多数桌面浏览器通过尝试从其他地方获取丢失的证书来解决此问题,但在这种情况下,普通的 TLS 库将失败。您需要将缺少的链证书显式添加为受信任才能解决此问题:

    import requests
    requests.get('https://api.sidecar.io', verify = 'mycerts.pem')
    

    mycerts.pem 应包含缺少的中间证书和受信任的根证书。 mycerts.pem 的测试版本可以在 http://pastebin.com/aZSKfyb7 中找到。

    【讨论】:

      【解决方案2】:

      这可能有助于解决您的问题。

      print(requests.get(url, proxies,verify = False))
      

      【讨论】:

      • 因为 verify=False 使 SSL 验证跳过。
      • 原始问题已经提到verify=False 作为绕过,但要求一个适当的解决方案。
      【解决方案3】:

      我使用 python-certifi-win32 包修复了它:

      pip install python-certifi-win32
      

      或与蟒蛇

      conda install -c conda-forge python-certifi-win32
      

      那么你可以使用:

      requests.get(url)
      #or
      requests.get(url, verify=True)
      

      并使用 Windows 证书存储检查证书。

      仅当证书安装在 Windows 证书存储中时才有效。

      【讨论】:

        【解决方案4】:

        试试

        sudo apt install ca-certificates

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-20
          • 1970-01-01
          • 1970-01-01
          • 2018-09-17
          • 1970-01-01
          相关资源
          最近更新 更多