playframework - Play Framework WS 主机名验证证书问题
问题描述
我正在使用 Play Framework 2.3.8,但在向某些主机发出 HTTPS 请求时遇到问题。在这种情况下,我似乎无法使用WS 客户端连接到 Zendesk API 主机 (xxxxx.zendesk.com) 。
我最初得到的错误是:
无法调用动作,最终报错:java.net.ConnectException: HostnameVerifier 异常。
这很奇怪,因为如果我在浏览器中或通过ssl s_client查看证书,它看起来像是文件。CN 条目与域匹配。
如果我禁用主机名验证,我会从 Cloudflare 收到一条错误消息,其中包含“禁止”消息。它是 HTML,而不是我所期望的 JSON。
然后我尝试使用Postman和curl发布相同的请求。请求成功,我得到了 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 存在一些问题。
解决方案
最后,我尝试使用Wireshark作为最后的手段来尝试确定从我的其他客户端(curl/Postman)和 Play Framework WS 客户端发送的请求之间的差异。
我注意到工作客户端发送域名作为握手的一部分。然后单击它可能是一个 SNI 问题。
果然,Play Framework 2.3.x 不支持 SNI。
仅有的两个真正的选择是使用单独的 HTTP 客户端,例如play-ws,或者将我的 Play Framework 版本更新到 2.4.x。
我选择了后者,现在它正在工作。
主机名验证问题实际上是一个红鲱鱼,与缺乏对 SNI 的支持有关。我能够毫无问题地重新启用它。
我希望这可以帮助有同样问题的人!
推荐阅读
- c# - Dapper - 获取有关已执行查询语句的信息
- python - 如何计算字符串中项目的重复次数?
- python - 找不到文件怎么显示?
- mongodb - $addToSet 使用了太多内存,无法溢出到磁盘。内存限制:104857600 字节
- c# - 基于电子邮件的 Woocommerce API 查找客户详细信息
- mysql - 将子查询转换为联接?
- css - VSCode Prettier 不格式化 CSS
- selenium - 如何使用 Python 填写 JavaScript 表单?
- swift - 我正在尝试使用 CoreBluetooth 模块,但我的部分代码没有运行
- javascript - Javascripts:无法读取未定义的属性“toLowerCase”