【发布时间】: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