Python Requests中自签名证书引发的SSLError问题求助
解决Python requests访问内部HTTPS站点的证书验证失败问题
问题根源
浏览器能正常访问是因为系统/浏览器的信任库已预装公司内部根CA证书,但Python的requests默认使用certifi提供的公共根证书池,不包含内部CA,因此无法完成证书链验证。
正确的证书导出步骤
你之前从浏览器导出证书的方式可能没拿到关键的根CA证书,正确操作:
- 访问目标站点,点击地址栏的锁图标 → 选择「证书」→ 切换到「详细信息」标签页 → 点击「路径」,查看完整证书链(通常是服务器证书→中间CA→根CA)
- 选择链中最顶层的根CA证书,点击「查看证书」→ 切换到「详细信息」→ 点击「复制到文件」
- 选择「Base64编码的X.509(.CER)」格式,保存为
.pem后缀的文件(比如company_root_ca.pem) - 若根CA下还有中间CA,可将中间CA和根CA的PEM内容(从
-----BEGIN CERTIFICATE-----到-----END CERTIFICATE-----的完整块)合并到同一个.pem文件中
有效解决方法
方法1:在请求中直接指定信任的CA文件
确保你用的是包含根CA的PEM文件,修改代码:
import requests url = "https://engine.my_company.com" # 替换为你的根CA文件路径 response = requests.get(url, verify="/path/to/company_root_ca.pem")
方法2:通过环境变量全局配置
在代码中设置环境变量(需在导入requests前执行):
import os # 指定根CA文件路径 os.environ['REQUESTS_CA_BUNDLE'] = '/path/to/company_root_ca.pem' import requests response = requests.get("https://engine.my_company.com")
或者在系统终端设置环境变量(Windows需重启终端生效):
- Linux/macOS:
export REQUESTS_CA_BUNDLE=/path/to/company_root_ca.pem - Windows(PowerShell):
$env:REQUESTS_CA_BUNDLE = "C:\path\to\company_root_ca.pem"
方法3:导入系统信任库(推荐长期解决方案)
- Windows:双击根CA pem文件,选择「安装证书」→ 存储位置选「本地计算机」→ 「将所有证书放入下列存储」→ 选择「受信任的根证书颁发机构」完成导入
- Linux:将根CA pem文件复制到
/usr/local/share/ca-certificates/,执行sudo update-ca-certificates
这样requests会自动使用系统信任的CA池,无需修改代码。
为什么之前的尝试失败?
- 单独使用服务器证书或中间CA无法完成验证:
requests需要验证证书链到受信任的根CA,这两类证书的签发机构不在默认信任池中 - 追加到
certifi的cacert.pem失败,大概率是证书格式错误(比如用了DER编码而非PEM),或未正确追加完整的根CA证书块
内容的提问来源于stack exchange,提问作者Alberto B
相关产品推荐
相关产品推荐

