【问题标题】:Using HttpBuilder API in Java 11, where do you specify the hostNameVerifier? [duplicate]在 Java 11 中使用 HttpBuilder API,在哪里指定 hostNameVerifier? [复制]
【发布时间】:2019-03-22 09:18:22
【问题描述】:

我们正在将服务从 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。

【问题讨论】:

  • 不向 Java 11 HTTP 客户端添加主机名验证器 API 是经过深思熟虑的决定。默认情况下启用严格的主机名验证(并且可能在某些环境中全局禁用,例如测试)。我可以问一下连接到不在其证书中标识自己的“安全”服务器的用例是什么。也许你有这样的服务器/服务的例子?
  • @chegar999 我们有一个设置,机器在专用网络中相互通信,并使用相互 ssl 来保护对服务的访问。所有内部证书都是使用相同的(自己的)CA 生成的。 (我们为公开的端点使用适当的证书,不用担心)。在这种情况下,有一个新的 Java 客户端需要连接到环回接口上的这些服务之一。从 JDK 10 升级到 11 时突然发生这种行为变化令人惊讶。未来,我们将研究修改我们的证书创建并添加必要的信息以避免设置标志。

标签: java ssl self-signed java-11 java-http-client


【解决方案1】:

有一个名为“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-23
    • 2017-11-15
    • 2019-05-03
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2013-01-06
    相关资源
    最近更新 更多