
Python 使用 requests 库发起 HTTPS 请求时遇到 SSL 错误(如 SSLError、CertificateError、SSL: CERTIFICATE_VERIFY_FAILED),通常是因为系统缺少可信 CA 证书、证书过期、中间人代理干扰,或服务器配置不规范。不建议直接禁用证书验证(如 verify=False),应优先排查和修复根本原因。
检查并更新系统/Python 的 CA 证书包
requests 默认使用 certifi 提供的根证书列表。旧版本 certifi 可能不含新签发的权威 CA 证书,导致验证失败。
- 升级
certifi:pip install --upgrade certifi - 确认 requests 使用的证书路径:
import requests; print(requests.certs.where()),该路径应指向 certifi 的cacert.pem - 若使用自建 Python 环境(如 conda),确保
certifi已安装且未被覆盖;必要时手动指定证书路径:requests.get("https://example.com", verify="/path/to/cacert.pem")
处理企业内网或代理环境下的证书问题
公司防火墙、上网行为管理设备或 Fiddler/Charles 等抓包工具会替换 HTTPS 证书,造成证书链不可信。
- 导出企业根证书(.crt 或 .pem 格式),追加到 certifi 的证书文件末尾,或单独保存为
company-ca.pem - 让 requests 加载自定义证书:
requests.get(url, verify="/path/to/company-ca.pem") - 设置环境变量(全局生效,慎用):
export REQUESTS_CA_BUNDLE="/path/to/company-ca.pem"(Linux/macOS)或set REQUESTS_CA_BUNDLE=C:\path\to\company-ca.pem(Windows)
临时绕过验证仅用于调试(不推荐生产)
仅限本地开发、测试或无法控制服务端证书的极端场景。务必明确注释风险,并避免提交到代码库。
立即学习“Python免费学习笔记(深入)”;
- 关闭 SSL 验证(会忽略所有证书错误,含域名不匹配、过期、自签名等):
requests.get(url, verify=False) - 同时禁用警告(否则会抛出
InsecureRequestWarning):import urllib3; urllib3.disable_warnings() - 更安全的替代:使用
urllib3的自定义 PoolManager 并指定cert_reqs='CERT_NONE',但逻辑等效,仍不解决信任问题
验证服务端证书配置是否合规
若你控制目标服务器,SSL 错误可能源于服务端配置缺陷:
- 用 SSL Labs Test 检查证书链完整性、中间证书是否缺失
- 确保 Nginx/Apache 正确配置了
ssl_certificate和ssl_certificate_key,且证书文件包含完整链(即服务器证书 + 所有中间证书) - 避免使用已弃用的 TLS 版本(如 TLS 1.0/1.1)或弱加密套件;requests 默认要求 TLS 1.2+ 和强算法










