AWS API Gateway前置ALB时证书不匹配问题求助
问题解决:API Gateway集成ALB时SSL主机名不匹配错误
你遇到的错误核心是API Gateway请求ALB时默认用AWS原生ELB域名作为Host头,但ALB绑定的证书是*.example.co.uk,导致SSL握手时主机名验证失败。直接访问子域名正常是因为浏览器自动用子域名作为Host头,而API Gateway默认用Endpoint URL的域名当Host。
下面是具体的解决方法:
方案1:给API Gateway配置自定义域名(推荐)
- 在API Gateway控制台创建自定义域名(比如
api.example.co.uk),选择和ALB相同的AWS证书(*.example.co.uk)。 - 将自定义域名映射到你的REST API的部署阶段。
- 在Cloudflare添加CNAME记录,把
api.example.co.uk指向API Gateway生成的域名(格式类似d-xxxxxx.execute-api.eu-west-2.amazonaws.com)。 - 修改API Gateway的HTTP集成Endpoint URL为ALB对应的子域名(比如
https://service1.example.co.uk),而非ALB的原生ELB域名。
这样API Gateway对外用自定义域名,内部请求ALB时用匹配证书的子域名,SSL验证即可通过。
方案2:在API Gateway集成请求中自定义Host头
如果不想配置API Gateway自定义域名,直接修改集成请求的Host头:
- 进入API Gateway控制台,找到你的REST API的对应资源和方法。
- 切换到集成请求标签,滚动到HTTP Headers部分。
- 点击添加头,输入
Host作为名称,值填写你要访问的ALB子域名(比如service1.example.co.uk)。 - 保存配置并重新部署API Gateway。
可以用curl验证配置是否生效:
curl -H "Host: service1.example.co.uk" https://<ALB_address>.elb.eu-west-2.amazonaws.com
如果返回正常,说明自定义Host头的配置有效。
为什么加NLB没用?
你之前尝试的NLB没解决问题,是因为你仍然用了NLB的原生域名(比如xxxxxx.nlb.eu-west-2.amazonaws.com)作为API Gateway的Endpoint URL,Host头还是不匹配证书的*.example.co.uk。如果要通过NLB解决,需要给NLB绑定同样的证书,并用自定义域名访问NLB,再让API Gateway集成到这个自定义域名。
额外检查点
- 确认AWS证书的**主体备用名称(SAN)**包含你使用的所有子域名,
*.example.co.uk可以覆盖所有子域名,这部分一般没问题。 - 确保ALB的安全组允许API Gateway的IP段访问(可在API Gateway控制台的资源策略或ALB安全组中配置)。
- 确认Cloudflare的DNS解析中,子域名的CNAME确实指向ALB的域名,若开启了Cloudflare的“橙色云”,需确保SSL模式为“完全”或“严格”。
内容的提问来源于stack exchange,提问作者Domenico
相关产品推荐
相关产品推荐

