JDK 11 HttpClient выдает ошибку "Нет альтернативного DNS-имени субъекта"

Я пишу простой REST API-клиент на основе JDK11 HttpClient, простой код, как показано ниже:

public class MyClass {

    private static final X509TrustManager TRUST_MANAGER = new X509TrustManager() {
        public void checkClientTrusted(X509Certificate[] xcs, String string) {
        }

        public void checkServerTrusted(X509Certificate[] xcs, String string) {
        }

        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    };

    private static HttpClient getNewHttpClient() {
        int timeout = 600;
        try {

            HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);

            SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
            sslContext.init(null, new TrustManager[]{TRUST_MANAGER}, new SecureRandom());

            // Install the all-trusting host verifier
            HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

            //Set SSL parameters
            SSLParameters parameters = new SSLParameters();
            parameters.setEndpointIdentificationAlgorithm("HTTPS");
                HttpClient httpClient = HttpClient.newBuilder()
                    .connectTimeout(Duration.ofMillis(timeout * 1000))
                    .sslContext(sslContext)
                    .sslParameters(parameters)
                    .build();
            return httpClient;
        } catch (Exception e) {
            logger.warn("Unable to create HttpClient with disabled SSL Certificate verifying, default client will be used", e);
            return HttpClient.newHttpClient();
        }
    }

    public static void main(String[] args) {
        HttpRequest requestBuilder = HttpRequest.newBuilder()
                .uri(URI.create("https://somehostname.xx.xxx.net"))
                .GET()
                .build();

        getNewHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
    }
}

Проблема в том, что когда я пытаюсь открыть какой-либо домен SSL, я получаю сообщение об ошибке:

Причина: java.security.cert.CertificateException: не найдено альтернативного DNS-имени субъекта, соответствующего somehostname.xx.xxx.net.

Как я могу решить эту проблему?

1 ответ

Хотя полное отключение проверки имени хоста (то есть для всей виртуальной машины) может быть вариантом, это может быть опасно. Вы также можете отключить проверку имени хоста, если вы унаследовали свой TRUST_MANAGER от javax.net.ssl.X509ExtendedTrustManager.

          private static final TrustManager DUMMY_TRUST_MANAGER = new X509ExtendedTrustManager() {        
    @Override
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
        return new java.security.cert.X509Certificate[0];
    }
    @Override
    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { }
    @Override
    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { }
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType, SSLEngine engine) throws CertificateException { }
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType, Socket socket) throws CertificateException { }
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType, SSLEngine engine) throws CertificateException { }
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType, Socket socket) throws CertificateException { }
};

Конечно, это также полностью отключит любые проверки сертификатов, представленных вашему клиенту.

Также существует открытая проблема на https://bugs.openjdk.java.net/browse/JDK-8213309, чтобы добавить API в JDK, чтобы специально отключить проверку имени хоста. Если у вас тоже есть доступ к базе данных ошибок openjdk, вы можете проголосовать за проблему.

Другие вопросы по тегам