代理环境下Python脚本连接AWS S3报SSLError问题求助
解决代理环境下boto3连接S3的SSLError问题
问题根源
办公网络代理的SSL证书未被Python运行环境信任,导致boto3发起HTTPS请求时触发SSL验证失败。
解决方案
方案1:配置代理并信任代理CA证书
在boto3会话中明确设置代理参数,并指定代理的CA证书路径,这是最安全的生产环境方案:
修改你的代码如下:
import boto3 from io import BytesIO from openpyxl import load_workbook import time def downloadBRMDataToLocal(file_path): # 替换为你的办公代理地址和端口 proxy_settings = { 'http': 'http://your-office-proxy:port', 'https': 'http://your-office-proxy:port' } # 替换为你保存的代理CA证书路径(.pem格式) proxy_ca_cert = '/path/to/your-proxy-ca.pem' session = boto3.Session( aws_access_key_id='XXXXX', aws_secret_access_key='XXXX', region_name='ap-south-1', ) # 配置代理与CA证书 s3_config = boto3.session.Config( proxies=proxy_settings, ca_bundle=proxy_ca_cert ) # 注意:替换BUCKET参数为实际桶名enmovil-logistics s3_resource = session.resource('s3', config=s3_config) BUCKET = s3_resource.Bucket('enmovil-logistics') objs = list(BUCKET.objects.filter(Prefix='brm_data/')) objs.sort(key=lambda x: x.last_modified, reverse=False) for obj in objs: if not obj.key.endswith('/'): filename = obj.key.split('/')[1] print(filename) body = obj.get()['Body'].read() wb = load_workbook(filename=(BytesIO(body)), data_only=True) wb.save(file_path) while True: file_path = r"\\mydrive\sharedDataDept\LOG-PP\Rail Stagewise Transit Time Analysis\FY 22-23.xlsx" downloadBRMDataToLocal(file_path) print("Done") freq_mins = 15 time.sleep(freq_mins * 60)
如果代理需要用户名密码,格式改为http://username:password@proxy:port。
方案2:临时跳过SSL验证(仅测试用)
仅用于临时排查问题,生产环境禁用,存在安全风险:
# 创建s3_resource时添加verify=False参数 s3_resource = session.resource('s3', config=boto3.session.Config(verify=False))
方案3:系统层面信任代理证书
将代理CA证书添加到Python默认信任库:
- 运行命令获取Python证书库路径:
python -c "import certifi; print(certifi.where())" - 将代理CA证书的内容追加到该路径的文件中
- 重启脚本即可生效
内容的提问来源于stack exchange,提问作者Sahil Gupta
相关产品推荐
相关产品推荐

