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

时间:2018-08-26 04:26:28

标签: node.js amazon-web-services https aws-api-gateway amazon-elb

我的设置当前看起来像:

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网关?


这也许很令人困惑,所以我总结了一下:

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

1 个答案:

答案 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涉及HTTP403ELB之间的差异-尽管确实已经为给定方案选择了最合适的负载均衡器,但可能值得考虑。如果不需要基于内容的路由,则减少无用的复杂性可能会有所帮助。这样就无需定义路由规则...如果您坚持使用ALB,也应该仔细阅读一次。我的意思是,这些问题仅显示了基本情况和一些失败的代码,但没有显示路由规则。