API 网关 - ALB:主机名/IP 与证书的替代名称不匹配

Posted

技术标签:

【中文标题】API 网关 - ALB:主机名/IP 与证书的替代名称不匹配【英文标题】:API Gateway - ALB: Hostname/IP doesn't match certificate's altnames 【发布时间】:2019-02-01 00:57:16 【问题描述】:

我目前的设置如下:

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

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

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

主机名/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 网关?


这可能很混乱,所以总结一下我的尝试:

在现有设置中,ECS 内的服务可能会通过 API 网关调用另一个服务。发生这种情况时,由于 HTTPS 错误而失败 为了解决这个问题,我设置了rejectUnauthorized: false,但是API网关返回HTTP 403 在localhost上运行时,报错类似 我尝试调用 ELB 而不是 API 网关,它可以工作...

【问题讨论】:

我没有任何真正的见解,但也许检查内部与外部 IP 和 DNS 可能是一个开始? @akaphenom 但我应该将什么严格视为问题?我的 ALB 是面向公众的。我应该查看什么 IP 或 DNS 设置? 你可以试试process.env.NODE_TLS_REJECT_UNAUTHORIZED = false 看起来像一个配置问题,如果您有支持计划,也许可以联系 aws 支持?我不会在这里推荐任何解决方案,因为如果你首先设置它,你实际上不应该禁用 https 检查或上面评论中的标志。这是一个糟糕的黑客行为。我没有看到其他人面临这个问题,所以您可能应该询问 aws 团队。很可能是一些配置问题 您的设置中的 Host: someid.ap-southeast-1.elb.amazonaws.com 是什么? 【参考方案1】:

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

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

关于HTTP403 docs 阅读:

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

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

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

【讨论】:

以上是关于API 网关 - ALB:主机名/IP 与证书的替代名称不匹配的主要内容,如果未能解决你的问题,请参考以下文章

主机名/IP 与证书的替代名称不匹配

在MFC中如何获取电脑IP 主机名 网关 MAC 子网掩码等

NPM 没有安装包。主机名/IP 地址与证书的替代名称不匹配:

与 HTTPS 微服务通信时,HTTPS 网关 API 无法验证第一个证书

允许从 API Gateway 到私有 ALB 的请求

为微服务 API 网关配置 Nginx