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

Amazon Linux 2环境Python requests发起请求出现SSL证书验证失败问题求解

问题根因
  • Python的requests库默认依赖certifi第三方包提供的CA根证书集合,不会直接读取Amazon Linux 2系统级的/etc/pki/tls/certs/ca-bundle.crt文件,所以你追加到系统CA bundle的证书对requests默认配置不生效,这也是CURL可以正常请求但requests报错的核心原因
  • 你传入的自签名证书可能存在格式错误、权限不足的问题:Amazon Linux 2上运行Python的用户(比如ec2-user)需要拥有你指定的crt文件的读权限,且证书必须是PEM格式,多级自签名场景还需要包含完整的证书链
  • 证书的SAN(主体可选名称)字段与请求地址不匹配:如果证书仅绑定了域名但你用IP请求,或者反过来,也会触发校验失败,Windows环境可能因为证书导入时的兼容配置未触发该报错
解决方案

方案1:配置环境变量(全局生效,无需修改代码)

  • 临时生效:在终端执行命令
    export REQUESTS_CA_BUNDLE=/etc/pki/tls/certs/ca-bundle.crt
  • 永久生效:将上述命令追加到~/.bashrc(对应当前用户)或者/etc/profile(对应系统所有用户),执行source ~/.bashrc或source /etc/profile后生效
  • 配置完成后直接运行原有Python代码即可,不需要额外加verify参数

方案2:代码中指定完整证书链(仅当前代码生效)

  • 先确认证书权限足够,执行命令:
    sudo chmod 644 /home/ec2-user/ssl_cert/MyAppcert.crt
  • 如果是多级自签名证书,需要把根CA证书、中间证书、服务端证书按顺序拼接为完整链文件:
    cat rootCA.crt intermediate.crt MyAppcert.crt > /home/ec2-user/ssl_cert/full_chain.crt
  • 代码修改为指定完整链路径:
    import requests
    requests.get("https://<my-endpoint>:8888/", verify="/home/ec2-user/ssl_cert/full_chain.crt")
    

方案3:导入证书到certifi的CA包(当前Python环境全局生效)

  • 先找到当前Python环境的certifi证书路径:
    python -c "import certifi; print(certifi.where())
  • 执行命令将自签名证书追加到certifi的CA证书集合中:
    cat /home/ec2-user/ssl_cert/MyAppcert.crt >> $(python -c "import certifi; print(certifi.where())")

临时测试方案(禁止生产环境使用)

如果仅做临时测试,可以直接关闭证书验证,同时关闭告警:

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

requests.get("https://<my-endpoint>:8888/", verify=False)

内容的提问来源于stack exchange,提问作者Rahul Kumbhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:36:05