AWS Lambda(Python3.8)中SSL验证失败问题排查求助
解决AWS Lambda中Python请求API时的SSL验证失败(ssl.SSLEOFError)问题
可能的原因及修复方案
1. 显式指定CA证书路径
AWS Lambda的Python运行时自带CA证书,但自定义安装的Certifi可能覆盖默认路径,导致证书无法被requests识别。
- 修复代码:
import certifi import requests # 强制使用Certifi提供的证书文件 response = requests.post( "https://api.pagerduty.com/xxx", verify=certifi.where() ) - 同时确认部署包中包含
certifi/cacert.pem文件,避免打包时遗漏证书资源。
2. 排查PyOpenSSL兼容性冲突
Python 3.8的Lambda运行时自带ssl库,额外安装的PyOpenSSL可能与系统库版本冲突,引发SSL协议错误。
- 修复:
- 尝试降低PyOpenSSL版本至
22.1.0(该版本与Python 3.8兼容性较好),修改requirements.txt:pyOpenSSL==22.1.0 certifi==2024.2.2 - 若无需自定义SSL功能,直接移除PyOpenSSL依赖,使用Lambda自带的ssl库即可。
- 尝试降低PyOpenSSL版本至
3. 验证网络访问权限
EOF错误有时并非证书问题,而是VPC/安全组限制了Lambda的出站HTTPS流量。
- 修复:
- 若Lambda部署在VPC内,确保配置了NAT网关,允许出站访问443端口。
- 检查安全组出站规则,添加允许访问
api.pagerduty.com的HTTPS(443端口)流量。 - 先测试请求公开HTTPS站点(如
https://httpbin.org/post),确认是否为网络层面的问题。
4. 强制指定兼容的TLS版本
PagerDuty API要求使用TLS 1.2及以上版本,Lambda默认的TLS配置可能不匹配。
- 修复代码:
import ssl import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager class TLS12Adapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): ctx = ssl.create_default_context() # 禁用旧版TLS,强制使用1.2+ ctx.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 ctx.set_ciphers('DEFAULT@SECLEVEL=1') kwargs['ssl_context'] = ctx return super().init_poolmanager(*args, **kwargs) # 给requests会话挂载自定义适配器 session = requests.Session() session.mount('https://', TLS12Adapter()) response = session.post("https://api.pagerduty.com/xxx")
5. 构建兼容Lambda环境的依赖包
本地环境(如macOS)编译的依赖可能与Lambda的Amazon Linux 2环境不兼容,引发SSL底层错误。
- 修复:使用Docker在Amazon Linux 2环境中构建依赖:
# 挂载当前目录到容器,安装依赖到指定目录 docker run -v "$PWD":/var/task public.ecr.aws/sam/build-python3.8:latest /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/" - 随后用CDK部署该目录下的依赖,确保二进制文件与Lambda运行时兼容。
内容的提问来源于stack exchange,提问作者Inderjeet Singh
相关产品推荐
相关产品推荐

