Python requests请求HTTPS站点报SSL证书过期但浏览器访问正常
报错原因
- Python的
requests库默认使用certifi包提供的独立CA根证书库做SSL校验,不会调用Chrome、Firefox等浏览器内置的证书库,也不会自动补全站点缺失的中间证书链。 - 你访问的站点存在SSL证书链部署不完整的问题,浏览器因为之前缓存过对应根/中间证书可以正常完成校验,但
requests请求时无法获取完整的证书校验链路,就会触发证书验证失败报错。 - 部分老旧版本的
requests/certifi包自带的CA证书库本身存在过期根证书,也会导致校验失败。
解决方案
方案1:升级依赖包(优先推荐)
升级requests和对应的CA证书库certifi到最新版本即可解决绝大多数根证书过期导致的校验问题,执行命令:
pip install --upgrade requests certifi
方案2:手动指定站点证书链(安全合规)
如果升级依赖后仍报错,可手动导出站点的完整证书链后指定给requests使用:
- 用浏览器打开目标站点,从地址栏的证书详情中导出完整PEM格式的证书链,保存为
nic_cert.pem文件 - 请求时添加
verify参数指向该证书文件即可:
response = requests.post(url, headers=headers, data=payload, verify="./nic_cert.pem")
方案3:临时关闭SSL校验(仅测试使用,不推荐)
如果是临时测试场景,可以手动关闭SSL校验,同时关闭对应的告警提示,修改代码如下:
import requests import urllib3 # 关闭SSL校验告警 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 原有代码不变,请求时添加verify=False参数 response = requests.post(url, headers=headers, data=payload, verify=False)
注意:该方案会跳过SSL身份校验,存在中间人攻击风险,仅适合临时测试使用,不要用于生产环境或敏感数据请求场景。
其他注意事项
- 你当前请求头中携带的
:authority属于HTTP/2协议的伪头部,requests默认不支持该类头部,可直接删除,不会影响正常请求。
内容的提问来源于stack exchange,提问作者ThoughtfulHistorian
相关产品推荐
相关产品推荐

