使用zammad-py调用Zammad API遇SSL验证失败,但curl请求正常
zammad-py调用Zammad API遇SSL验证失败,但curl请求正常
这种情况很常见,核心原因是curl和Python的requests库(zammad-py底层基于它)使用的CA证书存储不一致:curl默认会优先调用系统级的CA证书集合,而Python的requests通常依赖certifi包提供的独立CA证书库,两者包含的根证书可能有差异,所以curl能正常验证服务器证书,但Python这边就会报错。
给你几个逐步排查和解决的方案:
1. 先临时验证问题根源(仅限测试,生产禁用)
你可以先在初始化ZammadAPI时关闭SSL验证,确认是不是证书验证导致的问题:
from zammad_py import ZammadAPI # 仅用于测试,生产环境绝对不要这么做! client = ZammadAPI(url=HOST, http_token=api_token, verify=False) this_page = client.user.all() for user in this_page: print(user)
如果这段代码能正常运行,那就坐实了是证书验证的问题,接下来用安全的方式解决。
2. 安全方案:指定对应CA证书
如果你的Zammad服务器用的是自签名证书,或者是私有CA机构颁发的证书,你需要把对应的根CA证书文件路径传给verify参数,让requests能正确验证:
# 替换成你的根CA证书实际路径 client = ZammadAPI(url=HOST, http_token=api_token, verify="/path/to/root_certificate.pem")
3. 更新Python的CA证书库
有时候certifi包的CA证书可能过时,没有包含你服务器证书对应的根CA,尝试更新它:
pip install --upgrade certifi
更新后,requests会使用最新的CA证书集合,可能就能自动验证通过了。
4. 直接使用系统CA证书(适配Linux/macOS)
既然curl用系统CA能正常访问,你也可以让Python直接调用系统的CA证书文件:
- Linux系统通常路径:
/etc/ssl/certs/ca-certificates.crt - macOS系统通常路径:
/etc/ssl/cert.pem
代码示例:
client = ZammadAPI(url=HOST, http_token=api_token, verify="/etc/ssl/certs/ca-certificates.crt")
你也可以通过curl -v https://<url>的输出,查看服务器证书的根CA信息,更精准地找到对应的证书文件。
备注:内容来源于stack exchange,提问作者Thomas K
相关产品推荐
相关产品推荐

