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

Python Requests中自签名证书引发的SSLError问题求助

解决Python requests访问内部HTTPS站点的证书验证失败问题

问题根源

浏览器能正常访问是因为系统/浏览器的信任库已预装公司内部根CA证书,但Python的requests默认使用certifi提供的公共根证书池,不包含内部CA,因此无法完成证书链验证。

正确的证书导出步骤

你之前从浏览器导出证书的方式可能没拿到关键的根CA证书,正确操作:

  1. 访问目标站点,点击地址栏的锁图标 → 选择「证书」→ 切换到「详细信息」标签页 → 点击「路径」,查看完整证书链(通常是服务器证书→中间CA→根CA)
  2. 选择链中最顶层的根CA证书,点击「查看证书」→ 切换到「详细信息」→ 点击「复制到文件」
  3. 选择「Base64编码的X.509(.CER)」格式,保存为.pem后缀的文件(比如company_root_ca.pem)
  4. 若根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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:32:38