代码之家  ›  专栏  ›  技术社区  ›  Izbassar Tolegen

如何在JDK11中信任通配符DNS*?

  •  0
  • Izbassar Tolegen  · 技术社区  · 3 年前

    有一台服务器使用以下SAN记录的证书创建HTTPS:

    SubjectAlternativeName [
      DNSName: localhost
      IPAddress: 127.0.0.1
      URIName: https://localhost
      DNSName: *
    ]
    

    当我尝试从JDK11连接到此服务器时,我收到以下错误:

    javax.net.ssl。SSLAndshakeException:找不到与主机服务匹配的主题替代DNS名称。

    其中 host-service 是服务所在的主机名。我仔细检查了信任库,它符合要求 ca-certs 信任证书。同样的应用程序在使用JDK8时也能很好地工作。

    在JDK11中,信任通配符DNS的默认行为是否已经改变,现在它不起作用了? 此外,相关问题可能是服务器运行时 TLSv1.1 。但我将客户端应用程序配置为与 -Djdk.tls.client.protocols="TLSv1.1,TLSv1.2" 因此,这应该是可行的。默认SSL上下文没有以任何方式更改,信任库位于默认路径中( /etc/pki/java ).

    0 回复  |  直到 3 年前
        1
  •  0
  •   Izbassar Tolegen    3 年前

    我唯一能想到的方法是使用不安全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);