【问题标题】:Proxy calls to SSL endpoint via AWS API Gateway通过 AWS API Gateway 对 SSL 端点的代理调用
【发布时间】:2015-11-12 04:37:24
【问题描述】:

目前我的 api 可以通过 SSL 端点访问。我尝试将 aws api 网关配置为代理对我的端点的请求。

我已启用输入传递并将 application/json 设置为内容类型。

无论如何,当我在aws web interface 上尝试测试请求时,使用 GET 方法访问类似于 https://subdomain.domain.com/v1/resource 的 SSL url,我收到以下错误。

Execution log for request test-request
Thu Aug 06 06:55:27 UTC 2015 : Starting execution for request: test-invoke-request
Thu Aug 06 06:55:27 UTC 2015 : API Key: test-invoke-api-key
Thu Aug 06 06:55:27 UTC 2015 : Method request path: {}
Thu Aug 06 06:55:27 UTC 2015 : Method request query string: {}
Thu Aug 06 06:55:27 UTC 2015 : Method request headers: {}
Thu Aug 06 06:55:27 UTC 2015 : Method request body before transformations: null
Thu Aug 06 06:55:27 UTC 2015 : Endpoint request URI: https://xyz.domain.com/v1/resource
Thu Aug 06 06:55:27 UTC 2015 : Endpoint request headers: {Accept=application/json, User-Agent=AmazonAPIGateway_6cb3krv5t9}
Thu Aug 06 06:55:27 UTC 2015 : Endpoint request body after transformations: 
Thu Aug 06 06:55:27 UTC 2015 : Execution failed due to configuration error: handshake alert: unrecognized_name

SSL 证书缺少什么?

感谢任何帮助或线索。

【问题讨论】:

  • 先简单排查:https://xyz.domain.com/v1/resource用浏览器访问时会抛出ssl错误吗?
  • 这很好用,实际上现在正在我们的生产环境中使用。感谢您的评论。

标签: rest ssl amazon-web-services aws-api-gateway


【解决方案1】:

我认为这个问题的答案是您的 Web 服务器的一些微妙的错误配置,浏览器可能倾向于忽略,但 Java(在 AWS 基础设施中)不会。

这个问题并不完全是 SSL handshake alert: unrecognized_name error since upgrade to Java 1.7.0 的重复,因为它发生在不同的(从你的角度来看)环境中......但我相信这个问题解释了你所看到的。

现代 TLS (SSL) 堆栈有一个功能可以解决一个古老的问题:在 HTTP over SSL (HTTPS) 中,SSL 协商必然发生在请求标头之前,包括 Host: 标头,已发送...并且只能向客户端提供一个 SSL 证书。在引入服务器名称识别 (SNI) 扩展之前,这实质上意味着您的服务器上每个公共 IP 地址只能使用 1 个 SSL 证书,因此如果您有多个具有单独 SSL 证书的域,则必须有一个公共每个证书的 IP 地址,以便 Web 服务器为域名提供正确的证书,因为证书已绑定到服务器配置中的 IP 地址。

现在,至少对于现代浏览器来说,SNI 允许浏览器在服务器发送证书之前向服务器提示它要请求的主机名......这可能是几个之一,对于不同的域。这消除了每个证书一个静态 IP 的旧且浪费的做法,因为它允许在服务器正在侦听的一个 IP 地址后面配置多个证书。

客户端(在这种情况下是连接到您的 API 网关的“出站”组件)在 TLS 协商中“先对话”,并且 SNI 在第一条消息中。如果服务器理解消息构造,但不希望看到该特定主机名,则应该返回一个致命错误,但它也可以只发送一条警告消息。

该消息可能是警告,看起来很像您在日志中看到的内容。如果 Java TLS 实现非常严格,并且您的服务器以这种方式配置错误(无法识别 SNI 上下文中的主机名,并发送警告而不是错误),那么我会期望这种行为,即使其他客户端(用户代理库和浏览器)可能会继续 SSL 协商而不会出现明显错误,如果服务器默认提供的证书确实有效并且与域匹配,则“原谅”警告级别的警报。

如果我正确地拼凑了这个难题,您应该能够使用像 tshark 这样的数据包嗅探器来确认此行为,并相应地纠正您的 Web 服务器的行为。

【讨论】:

  • 嗨,迈克尔。我会验证这一点。谢谢。
【解决方案2】:

对于API Gateway 团队的某个人来说,这似乎是一个非常具体的问题。这里的社区无法真正帮助您。尝试通过 AWS 论坛上的 API Gateway section 联系 AWS。

【讨论】:

  • 那是我的第一选择。我已经有一个多星期没有在线程上进行任何活动了。所以我又在这里发帖了。
猜你喜欢
  • 1970-01-01
  • 2017-04-07
  • 2021-09-19
  • 1970-01-01
  • 2018-11-13
  • 2022-11-15
  • 2018-05-04
  • 2020-02-24
  • 2018-01-27
相关资源
最近更新 更多