【问题标题】:Unable to Complete SSL Connection with Certificate and Python Request无法通过证书和 Python 请求完成 SSL 连接
【发布时间】:2021-10-17 16:32:13
【问题描述】:

我这几天都遇到这个问题了,不知道到底出了什么问题。我正在尝试连接到需要使用数字证书进行身份验证的服务器,并且之前使用请求库以下列方式完成了此操作:

cert = (f'/path/to/cert.crt', f'/path/to/cert.open.key')
response = requests.get(url_server,cert=cert,headers=headers,proxies=proxies)

起初,我收到以下错误:[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'。我以为它与服务器证书有关,因为我以前使用相同的客户端证书登录其他站点。出于测试目的,我使用verify=False 拨打电话,以忽略服务器证书的任何问题,结果如下:

SSLError(1, '[SSL: SSLV3_ALERT_BAD_CERTIFICATE] sslv3 alert bad certificate (_ssl.c:852)'),))

我尝试将验证指向带有证书链文件(根和中间文件)的文件夹,并且当前一个文件不起作用时也指向 certBundle 文件,如 https://docs.python-requests.org/en/master/user/advanced/#ssl-cert-verification 中所述,但无济于事。我对握手过程的细节缺乏了解,因此无法以任何新的方式来调试这个问题。任何帮助将不胜感激。

【问题讨论】:

  • 您正确识别出与服务器证书相关的第一个错误。第二个错误意味着服务器不接受客户端证书。不幸的是,不清楚为什么,因为不清楚服务器对客户端证书的期望是什么以及您的客户端证书如何尝试满足期望。
  • 非常感谢您的回答。这个问题困扰我的是,当我尝试使用浏览器登录时,一切都按预期工作,但是当我尝试对请求做“相同”的事情时,它失败了。我不知道浏览器对我的客户端证书做了什么,而我的代码无法做到这一点。

标签: python ssl python-requests


【解决方案1】:

我想通了。客户端证书缺少证书链(针对客户端)。使用 Wireshark,我截获了这些包,并将浏览器发送的内容与请求发送的包进行了比较。这让我看到浏览器会自动将客户端证书链插入证书,而 requests 不会。

【讨论】:

    猜你喜欢
    • 2014-07-14
    • 2018-06-29
    • 1970-01-01
    • 2019-02-13
    • 2014-08-30
    • 2018-03-25
    • 1970-01-01
    • 2017-05-10
    • 2016-07-12
    相关资源
    最近更新 更多