有一个服务器使用具有以下 SAN 记录的证书创建 HTTPS:
SubjectAlternativeName [
DNSName: localhost
IPAddress: 127.0.0.1
URIName: https://localhost
DNSName: *
]
当我尝试从 JDK11 连接到此服务器时,出现以下错误:
javax.net.ssl.SSLHandshakeException:找不到与主机服务匹配的主题替代 DNS 名称。
其中host-service
是主机名,服务所在的位置。我仔细检查了信任库,它需要ca-certs
信任证书。同样的应用程序在使用 JDK8 时也能正常工作。
是不是在 JDK11 中信任通配符 DNS 的默认行为已经改变,现在它不起作用了?此外,相关问题可能是服务器使用TLSv1.1
. 但是我配置了我的客户端应用程序来运行,-Djdk.tls.client.protocols="TLSv1.1,TLSv1.2"
所以这应该可以工作。没有以任何方式更改默认 SSL 上下文,并且信任库位于默认路径 ( /etc/pki/java
) 中。
我能想到的唯一方法是使用不安全的 SSL 作为默认值:
TrustManagerFactory trustManagerFactory = InsecureTrustManagerFactory.INSTANCE;
SslContext sslContext;
SSLContext defaultSSLContext;
try {
sslContext = SslContextBuilder.forClient()
.trustManager(trustManagerFactory)
.build();
defaultSSLContext = SSLContext.getInstance("SSL");
defaultSSLContext.init(null, trustManagerFactory.getTrustManagers(), null);
} catch (Exception ex) {
throw new IllegalStateException(ex);
}
SSLContext.setDefault(defaultSSLContext);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句