代码之家  ›  专栏  ›  技术社区  ›  Jiew Meng

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

  •  9
  • Jiew Meng  · 技术社区  · 7 年前

    我的设置当前看起来像:

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

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

    Hostname/IP与证书的altnames不匹配:“Host:someid.ap-southeast-1.elb.amazonaws.com。不在证书的altnames中:DNS:*.execute api.ap-southeast-1.amazonaws.com“

    为什么会这样?

    {
        "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,在CORS中,服务器似乎正在阻止我的服务器localhost或ECS/ELB访问我的API网关?


    这可能会让人很困惑,所以我试过的总结是:

    • 在现有设置中,ECS内部的服务可以通过API网关调用其他服务。当这种情况发生时,它会因为HTTPS错误而失败
    • 为了解决这个问题,我 rejectUnauthorized: false ,但API网关返回HTTP 403
    • 我试着调用ELB而不是API网关,它工作。。。
    1 回复  |  直到 7 年前
        1
  •  5
  •   Martin Zeitler    4 年前

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

    再次回顾时。。。与其扩展面向公共接口的SSL证书,不如使用单独的SSL证书,用于API网关和ALB之间的通信 guide ; 在这种情况下,甚至可以进行自签名,因为任何外部客户机都不会访问证书。

    HTTP403 这个 docs 阅读:

    您配置了AWS WAF web访问控制列表(web ACL)来监视对应用程序负载平衡器的请求,它阻止了一个请求。

    这个 article 是关于两者的区别 ELB ALB 阿尔布 . 我的意思是,这些问题只显示了基本场景和一些失败的代码,而没有显示路由规则。

    推荐文章