java - 在 Java 11 中使用 HttpBuilder API,在哪里指定 hostNameVerifier?
问题描述
我们正在将服务从 JDK 10.0.1 迁移到 JDK 11。该服务使用 TLS 连接进行通信,其中服务器具有自签名证书。
此证书的 CA 已添加到两个 JVM 的 cacerts 中。
使用 JDK 10,这足以使用 HttpBuilder API 并与该服务进行通信。当运行相同的代码(仅从 jdk.incubator.http 到 java.net.http 的更改)到 JDK 11 时,我遇到了臭名昭著的“java.security.cert.CertificateException:没有主题替代名称存在”错误?
我知道这很容易通过创建具有自定义实现的 HostNameVerifier 来解决,然后与 HttpsUrlConnection 一起使用。
但如果可能的话,我宁愿坚持使用 HttpBuilder API。
解决方案
有一个系统属性恰当地命名为“jdk.internal.httpclient.disableHostnameVerification”,可用于禁用检查:http://hg.openjdk.java.net/jdk/jdk/file/4254bed3c09d/src/java.net。 http/share/classes/jdk/internal/net/http/common/Utils.java#l110
当我这样启动服务时,我的问题得到了解决:
java -Djdk.internal.httpclient.disableHostnameVerification -jar FancyService.jar
推荐阅读
- webstorm - Comparing files from different project
- laravel - Socket IO的实现
- c++ - function template with unused template parameter
- php - Ajax Auth redirect on Laravel 5.6
- python - 在 kivy 中非常频繁地运行函数 (Kivy Clock/FreeClock)
- json - JSON 和 Scala 解析器
- html - CSS填充父高度并保留
- jquery - 未捕获的 TypeError: $(...).lightGallery(...).destroy 不是函数
- android - RecyclerView的透明背景
- javascript - 键位功能不起作用