调用AWS API时SSL验证失败求助:本地Python 2.7代码报错
我之前碰到过几乎一模一样的情况——本地跑了两年的代码突然报SSL错误,但Lambda上完全正常,核心问题基本都出在本地环境的SSL证书链或验证配置上,毕竟AWS托管的Lambda环境会自动维护证书,而本地环境可能因为系统更新、文件损坏或路径变动出问题。下面是一步步的排查和解决方法:
1. 先确认CA证书路径是否有效
Botocore默认会使用系统的CA证书来验证DynamoDB的SSL连接,如果证书文件丢失或路径不对,就会报No such file or directory错误。
方法A:手动指定证书路径到代码里
在初始化DynamoDB资源前,给botocore指定正确的CA证书文件路径:
import sys, os, boto3, json import botocore # 根据你的系统替换成正确的证书路径 # Linux一般是 /etc/ssl/certs/ca-certificates.crt # macOS如果用brew装的openssl,路径是 /usr/local/etc/openssl/cert.pem botocore.session.Session().set_config_variable('ca_certificates_file', '/path/to/valid/ca-bundle.crt') payload = json.dumps({'query':query}) dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('table1') response = table.get_item(Key={'item': 'item1'})
方法B:设置环境变量
在运行代码前,设置SSL_CERT_FILE环境变量指向有效的证书文件:
# Linux/macOS终端 export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt # 然后运行你的Python脚本 python your_script.py
2. 验证Python 2.7的SSL模块配置
Python 2.7已经停止维护,系统更新可能导致其依赖的底层SSL库路径变动。可以先运行以下代码检查默认证书路径:
import ssl print(ssl.get_default_verify_paths())
输出里的cafile和capath如果显示不存在,就需要手动替换成系统中实际存在的证书路径。
3. 临时跳过SSL验证(仅限测试)
如果想快速确认是不是证书验证的问题,可以在初始化DynamoDB时关闭验证(生产环境绝对不要用):
dynamodb = boto3.resource('dynamodb', verify=False)
如果这样代码能正常运行,就坐实了是证书验证的问题,再回到步骤1修复。
4. 检查本地系统时间
这个很容易被忽略:SSL证书验证对时间敏感,如果本地系统时间和实际时间偏差过大(比如超过1小时),也会触发验证失败。先确认你的系统时间是否准确,同步一下时间再测试。
为什么之前正常现在突然报错?
大概率是近期的系统更新、杀毒软件清理、环境变量改动,导致原本有效的CA证书路径失效,或者证书文件被损坏/删除了——毕竟代码本身没改,Lambda上也能正常运行,排除AWS服务端的问题。
内容的提问来源于stack exchange,提问作者Sebastien Michaud

