node.js - 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 网关?
这可能很令人困惑,所以总结一下我的尝试:
- 在现有设置中,ECS 内部的服务可以通过 API 网关调用另一个服务。发生这种情况时,由于 HTTPS 错误而失败
- 为了解决它,我设置了
rejectUnauthorized: false
,但 API 网关返回 HTTP 403 - 在localhost上运行时,错误类似
- 我尝试调用 ELB 而不是 API 网关,它可以工作......
解决方案
有各种变通方法会引入安全隐患,而不是提供适当的解决方案。为了修复它,您需要为 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
. 我的意思是,这些问题只显示了基本场景和一些失败的代码,而不是路由规则。
推荐阅读
- typescript - 未捕获的引用错误:app.js 中未定义导出
- maven - 为什么 Tomcat Maven 插件无法重新部署并出现错误 404?
- data-science - 如果我只关心特征重要性,我应该在测试和训练之间拆分数据吗?
- c# - C# 项目需要 .NET 4.7.1 但我无法安装它
- ios - 从本地文件反应原生视频
- colors - 有没有一种将 RGB 三元组分类为颜色组的快速方法?
- firebase-admin - 使用 firebase-admin-java 时如何启用 http 日志?
- reactjs - 在反应中处理复选框
- r - 从字符串中提取多个路径
- javascript - 原始数据方法