我的设置当前看起来像:
API Gateway --- ALB --- ECS Cluster --- NodeJS Applications
|
-- Lambda
我还在API网关上设置了自定义域名(更新:我使用了默认的API网关链接,并遇到了同样的问题,我认为这不是自定义域问题)
当ECS群集中的一项服务通过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,在该服务器上,服务器似乎阻止了我的服务器(本地主机或ECS / ELB)访问我的API网关?
这也许很令人困惑,所以我总结了一下:
rejectUnauthorized: false
,但API网关返回了HTTP 403 答案 0 :(得分:1)
有多种变通办法,它们会带来安全隐患,而不是提供适当的解决方案。为了对其进行修复,您需要将CNAME
的{{1}}条目添加到DNS(该条目可能已经存在)和一个SSL证书中,就像AWS文档中所描述的那样。 Adding an Alternate Domain Name。这可以通过CloudFront控制台和ACM完成。关键是,在当前证书的情况下,备用(内部!!)主机名将永远不会与仅覆盖单个IP的证书相匹配-因此,与其说是代码问题,不如说是基础设施问题
当再次对其进行审核时...而不是扩展面向公众的接口的SSL证书-更好的解决方案可能是使用单独的SSL证书进行API网关和ALB之间的通信, guide;在这种情况下,甚至可以进行自签名,因为该证书永远不会被任何外部客户端访问。
关于someid.ap-southeast-1.elb.amazonaws.com.
和docs读为:
您配置了一个AWS WAF Web访问控制列表(Web ACL)以监视对您的Application Load Balancer的请求,并阻止了该请求。
希望这有助于设置端到端加密...而API网关只有一个面向公众的接口需要CA证书,无论内部通信如何,自签名都足够。
此article涉及HTTP403
和ELB
之间的差异-尽管确实已经为给定方案选择了最合适的负载均衡器,但可能值得考虑。如果不需要基于内容的路由,则减少无用的复杂性可能会有所帮助。这样就无需定义路由规则...如果您坚持使用ALB
,也应该仔细阅读一次。我的意思是,这些问题仅显示了基本情况和一些失败的代码,但没有显示路由规则。