AWS APIGateway.2合规通过后SSL后端认证校验未生效问题
根因分析
你配置的客户端证书校验逻辑不生效,核心原因是架构链路不匹配:
- 你通过
aws-serverless-express将Nest服务包装为Lambda函数运行,API Gateway对接Lambda走的是AWS内部的函数调用链路,并非端到端的HTTPS直连。你在NestApplicationOptions中配置的httpsOptions仅对直接接收的HTTPS入站请求生效,Lambda触发场景下不会触发TLS层的证书校验逻辑,所以无论API Gateway是否解绑证书,请求都能正常通过。 - Security Hub的APIGateway.2检查仅校验API Gateway侧是否给stage绑定了客户端证书,不校验后端是否实际开启校验,所以你完成前两步操作后就直接通过了合规检查。
两种可行解决方案
方案1:切换为HTTP/HTTPS后端集成
如果要复用你当前写的SSL校验代码,需要调整集成方式:
- 将Nest服务部署在可以直接接收HTTPS请求的环境(EC2、ECS、ALB等)
- 将API Gateway的后端集成从Lambda集成改为HTTPS集成,配置后端地址为你部署服务的HTTPS地址
- 这种场景下API Gateway向后端发起请求时会携带绑定的客户端证书,你现有配置的
requestCert、rejectUnauthorized逻辑会正常生效,解绑证书后请求会直接被SSL层拦截报错。
方案2:保留Lambda集成,新增应用层证书校验
如果不想调整现有Lambda部署架构,可以通过应用层校验实现同等效果:
- 计算你创建的API Gateway客户端证书的SHA1/MD5指纹
- 两种校验数据获取方式二选一:
- 方式一:在API Gateway中配置集成请求,新增自定义请求头,将API Gateway客户端证书的指纹作为固定值传入后端
- 方式二:直接从Lambda触发事件的
requestContext.identity.clientCert字段中获取API Gateway传递的客户端证书信息,无头部伪造风险,更推荐
- 在Nest服务中新增全局守卫,拦截所有请求校验拿到的证书指纹是否和你本地存储的一致,不一致直接返回401未授权。
额外注意事项
你配置的自定义域名映射仅影响API的调用入口,和后端客户端证书校验逻辑没有直接关联,确保你绑定客户端证书的stage和自定义域名映射的stage是同一个即可。
内容的提问来源于stack exchange,提问作者kartoon
相关产品推荐
相关产品推荐

