CentOS环境下Python requests访问站点SSL证书验证失败如何解决
问题原因与解决步骤
1. 核心错误点
你混淆了requests两个SSL参数的作用:
cert参数用于客户端身份验证,需要传入客户端的证书+私钥组合,你传入服务端站点证书必然会触发PEM加载报错,因为缺少匹配的私钥。- 自定义信任的服务端证书/CA根证书,需要将证书路径传给
verify参数。
2. 单请求临时解决方案
确认你导出的证书文件路径正确,直接使用以下代码即可正常访问:
import requests resp = requests.get('https://dadosabertos.bndes.gov.br', verify='./bndes-gov-br.pem') print(resp.status_code)
如果你导出的是完整证书链,直接将证书链文件路径传给verify参数即可。
3. 全局生效方案(无需每次请求传参)
requests默认使用certifi库提供的CA证书包,将站点证书追加到该证书包即可实现全局信任:
3.1 查找certifi证书包路径
执行以下Python代码获取路径:
import certifi print(certifi.where()) # 输出示例:/opt/python3/lib/python3.6/site-packages/certifi/cacert.pem
3.2 追加站点证书到证书包
执行shell命令(替换为上一步输出的实际路径):
cat ./bndes-gov-br.pem >> /opt/python3/lib/python3.6/site-packages/certifi/cacert.pem
操作完成后直接调用requests.get('https://dadosabertos.bndes.gov.br')即可正常访问。
4. 系统级信任方案
如果需要系统所有程序都信任该证书,可配置系统CA存储:
# 复制证书到系统CA锚点目录 cp ./bndes-gov-br.pem /etc/pki/ca-trust/source/anchors/ # 更新系统CA证书 update-ca-trust extract
之后配置环境变量REQUESTS_CA_BUNDLE=/etc/pki/tls/certs/ca-bundle.crt,requests就会优先使用系统CA证书库完成验证。
内容的提问来源于stack exchange,提问作者neves
相关产品推荐
相关产品推荐

