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
相关产品推荐
相关产品推荐

