我正在使用Play Framework 2.3.8,但无法向某些主机发出HTTPS请求。在这种情况下,我似乎无法使用WS client连接到Zendesk API主机(xxxxx.zendesk.com)。
我最初遇到的错误是:
无法调用该操作,最终出现错误:java.net.ConnectException:HostnameVerifier异常。
这很奇怪,因为如果我在浏览器中或通过ssl s_client查看证书,该证书将查找文件。 CN条目与域匹配。
如果我disable hostname verification,我从Cloudflare收到一条错误消息,消息为“禁止”。它是HTML格式,而不是我所期望的JSON。
然后,我尝试使用Postman和curl发布相同的请求。请求成功,并且我以JSON返回了响应。
然后,我使用Charles Web Debugging Proxy拦截了来自Play框架的HTTPS请求,并将其与Postman发送的请求进行了比较。奇怪的是,如果Charles拦截了请求,则请求成功!查尔斯对证书问题没有透露任何信息。
我已经看到其他人抱怨Cloudflare的类似问题,事实证明,他们的客户端不支持TLS 1.2。我检查了一下,然后运行了支持TLS 1.2默认值的JVM 1.8版,甚至尝试使用config变量强制TLS 1.2,以防万一,但这无济于事。
我认为在我使用的Play Framework版本中SSL出现了一些问题。
答案 0 :(得分:1)
最后,我尝试使用Wireshark来尝试确定其他客户端(curl / Postman)和Play Framework WS客户端发送的请求之间的差异。
我注意到工作中的客户发送了域名,作为握手的一部分。然后单击它可能是SNI问题。
果然Play Framework 2.3.x does not support SNI。
仅有的两个实际选择是使用单独的HTTP客户端(如play-ws或将我的Play Framework版本更新为2.4.x。
我选择了后者,现在可以使用了。
主机名验证问题实际上是一个麻烦,与缺乏对SNI的支持有关。我能够毫无问题地重新启用它。
我希望这对遇到同样问题的人有所帮助!