使用Python编写API Gateway端点测试遇SSL认证问题
解决API Gateway自定义域名SSL证书验证失败问题
问题分析
调用绑定自定义域名的API Gateway时出现[SSL: CERTIFICATE_VERIFY_FAILED]证书验证错误,但使用官方API Gateway域名能正常返回403响应,说明认证逻辑本身无问题,故障点在于自定义域名的SSL证书信任链未被Python环境识别。
解决方案
1. 确认SSL证书配置有效性
- 检查自定义域名绑定的证书:需为公共信任CA颁发的有效证书(比如AWS ACM证书,要确保证书覆盖该自定义域名,且部署在对应AWS区域);若为自签名证书,Python默认不会信任,需手动导入。
- 验证证书链完整性:用浏览器访问自定义域名的
/health端点,查看证书是否显示"安全",确认颁发者是否在系统信任列表中。
2. 在Python请求中处理SSL验证
方法一:指定信任的CA证书(推荐生产/测试环境使用)
将自定义域名的根CA证书导出为.pem格式文件,在请求中通过verify参数指定证书路径:
import requests from aws_requests_auth.aws_auth import AWSRequestsAuth import boto3 api_ep = "<custom domain>.com" session = boto3.Session() credentials = session.get_credentials() auth = AWSRequestsAuth( aws_access_key = credentials.access_key, aws_secret_access_key = credentials.secret_key, aws_host = api_ep, aws_region = "<region>", aws_service = "execute-api") # 指定CA证书路径 response = requests.get("https://" + api_ep + "/health", auth=auth, verify="/path/to/your/root-ca.pem") print(response.content)
方法二:临时禁用SSL验证(仅用于本地测试,不安全)
若仅做临时测试,可关闭SSL验证,同时关闭对应的安全警告:
import requests from aws_requests_auth.aws_auth import AWSRequestsAuth import boto3 import urllib3 # 关闭不安全请求警告 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) api_ep = "<custom domain>.com" session = boto3.Session() credentials = session.get_credentials() auth = AWSRequestsAuth( aws_access_key = credentials.access_key, aws_secret_access_key = credentials.secret_key, aws_host = api_ep, aws_region = "<region>", aws_service = "execute-api") # 禁用SSL验证 response = requests.get("https://" + api_ep + "/health", auth=auth, verify=False) print(response.content)
3. 排查本地环境CA证书问题
如果是本地Python环境的CA证书库缺失导致信任失败,可更新certifi库(requests依赖的CA证书管理工具):
pip install --upgrade certifi
内容的提问来源于stack exchange,提问作者OfirW
相关产品推荐
相关产品推荐

