首页 > 解决方案 > 在 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。

标签: javasslself-signedjava-11java-http-client

解决方案


有一个系统属性恰当地命名为“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

推荐阅读