首页 > 解决方案 > API 网关 - ALB:主机名/IP 与证书的替代名称不匹配

问题描述

我的设置目前看起来像:

API Gateway --- ALB --- ECS Cluster --- NodeJS Applications
             |    
             -- Lambda

我还在 API 网关上设置了自定义域名(更新:我使用了默认的 API 网关链接并遇到了同样的问题,我认为这不是自定义域问题)

当 ECS 集群中的 1 个服务通过 API 网关调用另一个服务时,我得到

主机名/IP 与证书的替代名称不匹配:“主机:someid.ap-southeast-1.elb.amazonaws.com。不在证书的替代名称中:DNS:*.execute-api.ap-southeast-1.amazonaws。 com"

为什么是这样?

更新

我注意到当我启动一个调用 API 网关的本地服务器时,我收到了类似的错误:

{
    "error": "Hostname/IP doesn't match certificate's altnames: \"Host: localhost. is not in the cert's altnames: DNS:*.execute-api.ap-southeast-1.amazonaws.com\""
}

如果我尝试禁用 HTTPS 检查:

const response = await axios({
  method: req.method,
  url,
  baseURL,
  params: req.params,
  query: req.query,
  data: body || req.body,
  headers: req.headers,
  httpsAgent: new https.Agent({
   : false // <<=== HERE!
  })
})

我得到了这个......

{
    "message": "Forbidden"
}

当我直接在 Postman 上调用底层 API 网关 URL 时,它可以工作……不知何故,它让我想起了 CORS,其中服务器似乎阻止了我的服务器 localhost 或 ECS/ELB 访问我的 API 网关?


这可能很令人困惑,所以总结一下我的尝试:

标签: node.jsamazon-web-serviceshttpsaws-api-gatewayamazon-elb

解决方案


有各种变通方法会引入安全隐患,而不是提供适当的解决方案。为了修复它,您需要为 DNS 添加一个CNAME条目someid.ap-southeast-1.elb.amazonaws.com.(该条目可能已经存在)以及一个 SSL 证书,就像 AWS 文档中关于添加备用域名的描述一样。这可以通过CloudFront控制台和ACM来完成。关键是,对于当前的证书,备用(内部!!)主机名永远不会与证书匹配,证书只能覆盖一个 IP - 因此它更多的是基础设施问题,而不是代码问题.

再次查看它时...而不是扩展面向公众的接口的 SSL 证书 - 根据本指南,更好的解决方案可能是使用单独的 SSL 证书用于 API 网关和 ALB 之间的通信;在这种情况下,甚至自签名也是可能的,因为任何外部客户端都不会访问证书。

关于文档阅读HTTP403

您配置了一个 AWS WAF Web 访问控制列表 (Web ACL) 来监控对您的 Application Load Balancer 的请求,但它阻止了一个请求。

我希望这有助于设置端到端加密,而 API 网关只有一个面向公众的接口需要 CA 证书,对于任何内部通信,自签名就足够了。

本文是关于ELB和之间的区别ALB- 虽然它可能值得考虑,但如果确实为给定场景选择了最合适的负载均衡器。如果不需要基于内容的路由,减少无用的复杂性可能会有所帮助。这将消除定义路由规则的需要......您还应该查看一次,以防坚持ALB. 我的意思是,这些问题只显示了基本场景和一些失败的代码,而不是路由规则。


推荐阅读