AWS EC2新实例运行Python代码遇SSL: CERTIFICATE_VERIFY_FAILED错误求助
Hey,我碰到过好几次类似的AWS EC2新实例SSL验证问题,结合你的场景(Windows Server 2012,旧实例正常新实例报错),给你几个靠谱的排查和解决方向:
解决AWS EC2 Windows Server 2012实例中Python SSL证书验证失败的问题
1. 先检查系统根证书是否缺失/过时
新创建的EC2 Windows实例往往默认没有同步最新的根证书,而旧实例因为运行时间长,可能已经通过Windows更新补全了。你可以这么操作:
- 打开控制面板 → Internet选项 → 内容标签 → 证书 → 受信任的根证书颁发机构
- 对比旧实例的证书列表,看看是否缺少API服务证书对应的根CA证书
- 快速同步根证书的方法:打开命令提示符,执行
certutil -syncWithWU,让系统从Windows更新服务器拉取最新的根证书;也可以直接从旧实例导出需要的根证书,导入到新实例的受信任根存储区
2. 确认Python环境的证书配置
不同Python发行版的证书依赖逻辑不一样,排查起来可以分两步:
- 如果是标准CPython,它通常依赖系统根证书,但也可能用
certifi库维护自己的证书链。你可以检查Python安装目录下的Lib\site-packages\certifi\cacert.pem文件,对比旧实例的这个文件是否一致。要是新实例的文件版本旧,要么执行pip install --upgrade certifi更新,要么直接把旧实例的cacert.pem复制过来替换 - 用requests测试的话,可以临时指定证书文件验证(别用
verify=False,生产环境绝对禁止):import requests # 替换成你的证书路径,比如旧实例的cacert.pem路径 response = requests.get("你的API地址", verify="C:/PythonXX/Lib/site-packages/certifi/cacert.pem")
3. 排查网络和代理配置差异
新实例的网络设置可能和旧实例不一样,这也会影响SSL验证:
- 打开Internet选项 → 连接 → 局域网设置,确认是否启用了代理服务器,旧实例如果没代理,新实例也得保持一致
- 检查AWS安全组和网络ACL,确保实例能访问证书验证需要的地址(比如CRL吊销列表、OCSP服务地址),这些是SSL验证过程中必须访问的
- 先用浏览器打开API地址,如果浏览器也弹证书警告,那问题肯定在系统证书;如果浏览器正常,那大概率是Python环境的证书配置问题
4. 验证API服务的证书本身
虽然旧实例没问题,但也不妨确认下API的证书是否有变化:
- 用浏览器访问API,查看证书详情,确认证书没过期、CA是受信任的,而且SAN(主题备用名称)包含你访问的域名
- 用OpenSSL命令在实例上验证(如果装了OpenSSL):
看输出里的验证结果,有没有明确的错误提示openssl s_client -connect your-api-domain:443
内容的提问来源于stack exchange,提问作者user20726
相关产品推荐
相关产品推荐

