卷曲工作,但 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 而失败的主要内容,如果未能解决你的问题,请参考以下文章

此卷曲的等效请求命令

PHP 卷曲 HTTP PUT

Alamofire 请求失败,因为证书但在 Postman 上工作

lucene卷曲查询的多个术语

如何以角度发送卷曲请求

Q ZAPIER 卷曲请求