卷曲工作,但 python 请求因 SSLError 而失败
Posted
技术标签:
【中文标题】卷曲工作,但 python 请求因 SSLError 而失败【英文标题】:Curl works but python request fails with 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 代码以及错误消息是否与您正在执行的操作完全匹配。
【参考方案1】:
原来问题出在证书上。 我的自签名证书不存在于操作系统信任库中。
Python 请求需要全链证书的路径,而不仅仅是verify
参数的中间证书。请参阅请求文档:SSL Cert Verification
更新后,它没有任何问题。
【讨论】:
以上是关于卷曲工作,但 python 请求因 SSLError 而失败的主要内容,如果未能解决你的问题,请参考以下文章