You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:53:00