【问题标题】:Curl works but python request fails with SSLError卷曲工作,但 python 请求因 SSLError 而失败
【发布时间】:2022-01-07 11:08:15
【问题描述】:

以下 curl cmd 按原样运行,没有任何问题,
curl -H "Authorization: Bearer $AUTH" --cacert "/var/lib/myapp/server-ca.crt" https://myapp.common:2567/service -X GET

在python中实现这个,

headers = {"Authorization": "Bearer {}".format(os.getenv("AUTH"))}
cacert = "/var/lib/myapp/server-ca.crt"
url = "https://myapp.common:2567/service"
response = requests.get(url=url, headers=headers, verify=cacert)

但是它失败并出现以下错误

HTTPSConnectionPool(host='myapp.common', port=2567): Max retries exceeded with url: /service
 (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),))

对于上下文,这里的 cacert 具有以下信息:
---BEGIN CERTIFCATE---- SOMERANDOMSTRING ---END CERTIFICATE----

【问题讨论】:

  • 简而言之:错误的选项。您需要使用verify 而不是cert
  • @SteffenUllrich 感谢您指出这一点。但是在更改证书进行验证后,我仍然遇到同样的问题
  • “但是更改证书后验证” - 原来的原因解决了。随着代码的改变,这是一个不同的问题。请准确提供您正在使用的(新)代码以及您在新问题中得到的(新)错误消息。
  • @SteffenUllrich 正如前面的评论所指出的,我得到了完全相同的错误。新代码是使用requests.get(url=url, headers=headers, verify=cacert)。鉴于我面临同样的错误,我认为不需要新问题
  • 我重新打开了这个问题,但我怀疑它是否可以通过信息解决。 verify=cacert 正是它应该工作的方式。如果您的文件格式错误或不包含 CA 证书,那么它也不应该与 curl 一起使用。所以请再次检查,显示的 curl 命令和 Python 代码以及错误消息是否与您正在执行的操作完全匹配

标签: python-3.x ssl python-requests


【解决方案1】:

原来问题出在证书上。 我的自签名证书不存在于操作系统信任库中。

Python 请求需要全链证书的路径,而不仅仅是verify 参数的中间证书。请参阅请求文档:SSL Cert Verification

更新后,它没有任何问题。

【讨论】:

    最近更新 更多