Python 调用 ChatGPT API 报 SSL 证书验证失败,通常是因为本地 CA 证书包过期或系统时间不准确。最推荐的修复方向是更新 certifi 库或校正系统时间,严禁在生产代码中设置 verify=False 绕过验证。
先说结论:该错误属于客户端环境配置问题,优先更新证书包而非修改代码逻辑。
- 先确认:检查系统时间是否同步,确认网络中间设备是否拦截 HTTPS 流量。
- 先处理:执行 pip install `--upgrade` certifi 更新根证书,或指定正确的 CA Bundle 路径。
- 再验证:运行最小化请求脚本,确认不再抛出 SSLError 异常。
命令速用版
如果急需恢复连接,可在终端执行以下命令更新证书包,这是最安全的临时止血方案。
pip install `--upgrade` certifi
python -m certifi执行第二行命令可查看当前 certifi 使用的证书文件路径,便于后续配置引用。
为什么会这样
SSL 握手失败的核心原因是客户端无法验证服务器证书的合法性。
Python 的 requests 库或 openai SDK 依赖操作系统的信任存储或 certifi 包中的根证书来验证 api.openai.com 的证书。如果本地证书包版本过旧,缺少新颁发的根证书,或者系统时间与服务器时间偏差过大,都会导致验证链断裂。此外,企业内网网关若进行 HTTPS 解密审查,也会替换原有证书,导致客户端验证不通过。
分步处理
按顺序执行以下步骤,每步完成后检查错误是否消失。
步骤 1:更新证书依赖包
在虚拟环境或全局环境中升级 certifi,确保拥有最新的根证书列表。
pip install `--upgrade` certifi步骤 2:校正系统时间
检查本地操作系统时间是否与网络时间同步,时间偏差超过几分钟会导致证书有效期验证失败。
步骤 3:指定 CA Bundle 路径(可选)
如果默认路径无效,可在代码中显式指定 certifi 提供的证书文件路径。
import certifi
import requests
response = requests.get(
"https://api.openai.com/v1/models",
verify=certifi.where()
)步骤 4:配置企业网关证书(仅限内网)
若处于企业内网,需将网关的根证书导入到 certifi 指定的 cacert.pem 文件中,或设置 REQUESTS_CA_BUNDLE 环境变量。
怎么验证是否生效
运行一段最小化测试代码,观察是否抛出异常。
import openai
import os
os.environ["OPENAI_API_KEY"] = "your-key"
try:
client = openai.OpenAI()
models = client.models.list()
print("SSL 验证通过,连接成功")
except Exception as e:
print(f"错误:{e}")若控制台输出“SSL 验证通过,连接成功”,且无 SSLError 报错,则修复生效。
常见坑
以下操作存在安全风险或无效,需谨慎处理。
- 禁用验证:设置 verify=False 会暴露 API Key 给中间人攻击,严禁在生产环境使用。
- 忽略时间:仅更新证书而不校正系统时间,错误可能反复出现。
- 混用环境:在 Docker 容器内更新了宿主的证书包,容器内部并未同步更新。
常见问题
可以直接设置 verify=False 吗?
不可以,这会禁用 SSL 证书验证,导致通信内容可能被窃听或篡改。
为什么更新 certifi 后仍然报错?
可能是系统时间偏差过大,或者企业网关拦截了流量,需要分别校正时间或导入网关证书。
OpenAI SDK 和 requests 库处理方式一样吗?
一样,OpenAI SDK 底层依赖 httpx 或 requests,均遵循标准的 SSL 验证流程,修复方法通用。
参考来源
- Requests 库官方文档:SSL Cert Verification,https://requests.readthedocs.io/en/latest/user/advanced/#ssl-cert-verification
- Certifi 项目仓库:Python package for providing Mozilla's CA Bundle,https://github.com/certifi/python-certifi
- OpenAI API 文档:Overview,https://platform.openai.com/docs/overview