3

我正在使用 Play Framework 2.3.8,但在向某些主机发出 HTTPS 请求时遇到问题。在这种情况下,我似乎无法使用WS 客户端连接到 Zendesk API 主机 (xxxxx.zendesk.com) 。

我最初得到的错误是:

无法调用动作,最终报错:java.net.ConnectException: HostnameVerifier 异常。

这很奇怪,因为如果我在浏览器中或通过ssl s_client查看证书,它看起来像是文件。CN 条目与域匹配。

如果我禁用主机名验证,我会从 Cloudflare 收到一条错误消息,其中包含“禁止”消息。它是 HTML,而不是我所期望的 JSON。

然后我尝试使用Postmancurl发布相同的请求。请求成功,我得到了 JSON 格式的响应。

然后我使用Charles Web Debugging Proxy拦截来自 Play Framework 的 HTTPS 请求,并将其与 Postman 发送的请求进行比较。奇怪的是,如果查尔斯拦截了请求,请求就会成功!查尔斯没有对证书问题做出任何解释。

我看到其他人抱怨 Cloudflare 的类似问题,在他们的案例中,结果证明他们的客户端不支持 TLS 1.2。我检查了一下,我正在运行 JVM 的 1.8 版,它支持 TLS 1.2 默认值,甚至尝试使用配置变量强制 TLS 1.2 以防万一,但这并没有帮助。

我认为我正在使用的 Play Framework 版本中的 SSL 存在一些问题。

4

1 回答 1

1

最后,我尝试使用Wireshark作为最后的手段来尝试确定从我的其他客户端(curl/Postman)和 Play Framework WS 客户端发送的请求之间的差异。

我注意到工作客户端发送域名作为握手的一部分。然后单击它可能是一个 SNI 问题。

果然,Play Framework 2.3.x 不支持 SNI

仅有的两个真正的选择是使用单独的 HTTP 客户端,例如play-ws,或者将我的 Play Framework 版本更新到 2.4.x。

我选择了后者,现在它正在工作。

主机名验证问题实际上是一个红鲱鱼,与缺乏对 SNI 的支持有关。我能够毫无问题地重新启用它。

我希望这可以帮助有同样问题的人!

于 2018-10-01T03:30:33.360 回答