Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Сегодня я перешел с Java 1.6 на Java 1.7. С 9X_javax тех пор, когда я пытаюсь установить соединение 9X_java-api с моим веб-сервером через SSL, возникает 9X_core-java ошибка:

javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name
    at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1288)
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1904)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1027)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1262)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1289)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1273)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:523)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1296)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at java.net.URL.openStream(URL.java:1035)

Вот код:

SAXBuilder builder = new SAXBuilder();
Document document = null;

try {
    url = new URL(https://some url);
    document = (Document) builder.build(url.openStream());
} catch (NoSuchAlgorithmException ex) {
    Logger.getLogger(DownloadLoadiciousComputer.class.getName()).log(Level.SEVERE, null, ex);  
}

Это всего лишь тестовый проект, поэтому 9X_jre я разрешаю и использую ненадежные сертификаты 9X_java с кодом:

TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {

        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public void checkClientTrusted(
                java.security.cert.X509Certificate[] certs, String authType) {
        }

        public void checkServerTrusted(
                java.security.cert.X509Certificate[] certs, String authType) {
        }
    }
};

try {

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {

    Logger.getLogger(DownloadManager.class.getName()).log(Level.SEVERE, null, e);
} 

Мне удалось подключиться к https://google.com. в чем 9X_jre моя вина?

Спасибо.

234
0
14
Общее количество ответов: 14

Ответ #1

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

В Java 7 появилась поддержка SNI, которая 9X_ssl включена по умолчанию. Я обнаружил, что 9X_java-api некоторые неправильно настроенные серверы 9X_java-libraries отправляют предупреждение «Нераспознанное 9X_openjdk имя» в подтверждении связи SSL, которое 9X_.java игнорируется большинством клиентов ... за 9X_tls исключением Java. Как упомянул @Bob Kerns, инженеры 9X_jre Oracle отказываются «исправлять» эту ошибку 9X_java / функцию.

В качестве обходного пути они 9X_oraclejdk предлагают установить свойство jsse.enableSNIExtension. Чтобы ваши 9X_javax программы работали без повторной компиляции, запустите 9X_java-se приложение как:

java -Djsse.enableSNIExtension=false yourClass

Свойство также можно задать 9X_javax в коде Java, но оно должно быть установлено 9X_javax перед любыми действиями SSL. После загрузки библиотеки SSL вы можете 9X_jre изменить свойство, но это won't have any effect on the SNI status. Чтобы отключить 9X_java-se SNI во время выполнения (с указанными выше 9X_openjdk ограничениями), используйте:

System.setProperty("jsse.enableSNIExtension", "false");

Недостатком 9X_jdk установки этого флага является то, что SNI 9X_javax отключен везде в приложении. Чтобы использовать 9X_j2se SNI и по-прежнему поддерживать неправильно 9X_j2se настроенные серверы:

  1. Создайте SSLSocket с именем хоста, к которому вы хотите подключиться. Назовем это sslsock.
  2. Попробуйте запустить sslsock.startHandshake(). Это будет заблокировано до тех пор, пока это не будет выполнено, или сгенерирует исключение в случае ошибки. При возникновении ошибки в startHandshake() получите сообщение об исключении. Если он равен handshake alert: unrecognized_name, значит, вы обнаружили неверно настроенный сервер.
  3. Когда вы получили предупреждение unrecognized_name (фатальное в Java), попробуйте снова открыть SSLSocket, но на этот раз без имени хоста. Это фактически отключает SNI (в конце концов, расширение SNI предназначено для добавления имени хоста в сообщение ClientHello).

Для SSL-прокси Webscarab 9X_tls this commit реализует настройку отката.

313
4

  • Для тех, кто интересуется Java 8, Oracle все еще не изменил поведение и по-прежнему требует от программиста ловить ...

Ответ #2

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

У меня была, как мне кажется, та же проблема. Я 9X_jre обнаружил, что мне нужно настроить конфигурацию 9X_core-java Apache, чтобы включить ServerName или ServerAlias 9X_.java ​​для хоста.

Ошибка этого кода:

public class a {
   public static void main(String [] a) throws Exception {
      java.net.URLConnection c = new java.net.URL("https://mydomain.com/").openConnection();
      c.setDoOutput(true);
      c.getOutputStream();
   }
}

И этот код 9X_j2se сработал:

public class a {
   public static void main(String [] a) throws Exception {
      java.net.URLConnection c = new java.net.URL("https://google.com/").openConnection();
      c.setDoOutput(true);
      c.getOutputStream();
   }
}

Wireshark обнаружил, что во время 9X_oraclejdk приветствия TSL / SSL предупреждение Предупреждение 9X_core-java (уровень: предупреждение, описание: нераспознанное 9X_java-api имя), приветствие сервера Отправлялся с 9X_javax сервера клиенту. Это было всего лишь предупреждением, однако 9X_jre Java 7.1 немедленно ответила «Fatal, Description: Unexpected 9X_.java Message», что, как я полагаю, означает, что 9X_oraclejdk библиотеки Java SSL не хотят видеть предупреждение 9X_core-java о нераспознанном имени.

Из вики по безопасности 9X_java транспортного уровня (TLS):

112 Предупреждение 9X_j2se о нераспознанном имени Только TLS; В индикаторе 9X_java-se имени сервера клиента указано имя хоста, не 9X_.java поддерживаемое сервером

Это заставило меня 9X_java-api взглянуть на мои файлы конфигурации Apache, и 9X_oraclejdk я обнаружил, что если я добавил ServerName 9X_java-api или ServerAlias ​​для имени, отправленного 9X_oraclejdk со стороны клиента / java, он работал правильно 9X_java без каких-либо ошибок.


  ServerName mydomain.com
  ServerAlias www.mydomain.com

91
6

  • Это сработало и для меня. (сработало бы лучше, е ...

Ответ #3

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Вы можете отключить отправку записей SNI 9X_openjdk с помощью системного свойства jsse.enableSNIExtension 9X_ssl = false.

Если вы можете изменить код, это 9X_tls поможет использовать SSLCocketFactory#createSocket() (без параметра хоста 9X_java-libraries или с подключенным сокетом). В этом случае 9X_javax он не будет отправлять указание server_name.

37
3

  • У меня работает с `-Djsse.enableSNIExtension = false`. Но что еще он делает? Вредно ли это для остальной части ...

Ответ #4

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Мы также столкнулись с этой ошибкой при 9X_oraclejdk новой сборке сервера Apache.

Исправление 9X_openjdk в нашем случае заключалось в том, чтобы 9X_jre определить ServerAlias в httpd.conf, который соответствовал имени 9X_core-java хоста, к которому Java пыталась подключиться. Наш 9X_tls ServerName был установлен на внутреннее имя хоста. В 9X_oraclejdk нашем сертификате SSL использовалось имя 9X_tls внешнего хоста, но этого было недостаточно, чтобы 9X_java избежать предупреждения.

Для облегчения отладки 9X_jdk вы можете использовать эту команду ssl:

openssl s_client -servername -connect :443 -state

Если 9X_ssl есть проблема с этим именем хоста, он напечатает 9X_java-api это сообщение в верхней части вывода:

SSL3 alert read: warning:unrecognized name

Следует 9X_openjdk также отметить, что мы не получали эту ошибку 9X_ssl при использовании этой команды для подключения 9X_java-libraries к внутреннему имени хоста, даже если оно 9X_java-libraries не соответствовало сертификату SSL.

19
2

  • Благодарим за включение примера о том, к ...

Ответ #5

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Вместо того, чтобы полагаться на механизм 9X_java виртуального хоста по умолчанию в apache, вы 9X_tls можете определить один последний общий виртуальный 9X_.java хост, который использует произвольное имя 9X_java-se сервера и подстановочный знак ServerAlias, например

ServerName catchall.mydomain.com
ServerAlias *.mydomain.com

Таким 9X_oraclejdk образом вы можете использовать SNI, и apache 9X_jdk не будет отправлять обратно предупреждение 9X_java SSL.

Конечно, это работает, только если вы 9X_java-se можете легко описать все свои домены, используя 9X_java-se синтаксис с подстановочными знаками.

15
0

Ответ #6

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Это должно быть полезно. Чтобы повторить 9X_jdk попытку при ошибке SNI в Apache HttpClient 9X_j2se 4.4 - самый простой способ, который мы придумали 9X_java (см. HTTPCLIENT-1522):

public class SniHttpClientConnectionOperator extends DefaultHttpClientConnectionOperator {

    public SniHttpClientConnectionOperator(Lookup socketFactoryRegistry) {
        super(socketFactoryRegistry, null, null);
    }

    @Override
    public void connect(
            final ManagedHttpClientConnection conn,
            final HttpHost host,
            final InetSocketAddress localAddress,
            final int connectTimeout,
            final SocketConfig socketConfig,
            final HttpContext context) throws IOException {
        try {
            super.connect(conn, host, localAddress, connectTimeout, socketConfig, context);
        } catch (SSLProtocolException e) {
            Boolean enableSniValue = (Boolean) context.getAttribute(SniSSLSocketFactory.ENABLE_SNI);
            boolean enableSni = enableSniValue == null || enableSniValue;
            if (enableSni && e.getMessage() != null && e.getMessage().equals("handshake alert:  unrecognized_name")) {
                TimesLoggers.httpworker.warn("Server received saw wrong SNI host, retrying without SNI");
                context.setAttribute(SniSSLSocketFactory.ENABLE_SNI, false);
                super.connect(conn, host, localAddress, connectTimeout, socketConfig, context);
            } else {
                throw e;
            }
        }
    }
}

и

public class SniSSLSocketFactory extends SSLConnectionSocketFactory {

    public static final String ENABLE_SNI = "__enable_sni__";

    /*
     * Implement any constructor you need for your particular application -
     * SSLConnectionSocketFactory has many variants
     */
    public SniSSLSocketFactory(final SSLContext sslContext, final HostnameVerifier verifier) {
        super(sslContext, verifier);
    }

    @Override
    public Socket createLayeredSocket(
            final Socket socket,
            final String target,
            final int port,
            final HttpContext context) throws IOException {
        Boolean enableSniValue = (Boolean) context.getAttribute(ENABLE_SNI);
        boolean enableSni = enableSniValue == null || enableSniValue;
        return super.createLayeredSocket(socket, enableSni ? target : "", port, context);
    }
}

и

cm = new PoolingHttpClientConnectionManager(new SniHttpClientConnectionOperator(socketFactoryRegistry), null, -1, TimeUnit.MILLISECONDS);

13
1

  • Это было именно то, что я искал, большое вам спасибо! Я не нашел другого способа поддержки SNI и серверов, которые одновременно отвеч ...

Ответ #7

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Использование:

  • System.setProperty ("jsse.enableSNIExtension", "false");
  • Перезагрузите Tomcat (важно)

9X_ssl

11
0

Ответ #8

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

К сожалению, вы не можете предоставить системные 9X_core-java свойства инструменту jarsigner.exe.

Я отправил 9X_java-se дефект 7177232, сославшись на дефект @eckes 7127374 и 9X_core-java объяснив, почему он был закрыт по ошибке.

Мой 9X_tls дефект связан с воздействием на инструмент 9X_tls jarsigner, но, возможно, он приведет к повторному 9X_java открытию другого дефекта и правильному решению 9X_java-libraries проблемы.

ОБНОВЛЕНИЕ: На самом деле оказывается, что 9X_openjdk вы МОЖЕТЕ предоставить системные свойства 9X_.java инструменту Jarsigner, но этого просто нет 9X_core-java в справочном сообщении. Используйте jarsigner -J-Djsse.enableSNIExtension=false

5
2

  • Спасибо Бобу за ответ. К сожалению, Oracle все еще не понимает всего этого. Предупреждение SNI не является фатальным, его можно рассматривать как фатальный. Но большинство типичных клиентов SSL (то есть браузеров) ...

Ответ #9

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Разберитесь с этой проблемой с помощью весенней загрузки и 9X_ssl jvm 1.7 и 1.8. В AWS у нас не было возможности 9X_tls изменить ServerName и ServerAlias ​​на совпадение 9X_j2se (они разные), поэтому мы сделали следующее:

В 9X_java-libraries build.gradle мы добавили следующее:

System.setProperty("jsse.enableSNIExtension", "false")
bootRun.systemProperties = System.properties

Это позволило нам 9X_java-libraries обойти проблему с «Нераспознанным именем».

5
0

Ответ #10

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Я столкнулся с той же проблемой, и оказалось, что 9X_tls обратный DNS был настроен неправильно, он 9X_j2se указывал на неправильное имя хоста для IP. После 9X_j2se того, как я исправлю обратный DNS и перезапущу 9X_j2se httpd, предупреждение исчезнет. (если я 9X_java-api не исправляю обратный DNS, добавление ServerName 9X_java-api тоже помогло мне)

3
0

Ответ #11

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Мой VirtualHost ServerName был закомментирован по умолчанию. Это 9X_java-api сработало после раскомментирования.

2
0

Ответ #12

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Если вы создаете клиент с Resttemplate, вы 9X_core-java можете установить конечную точку только 9X_java-libraries следующим образом: https://IP/path_to_service и установить requestFactory.
С 9X_javax помощью этого решения вам не нужно перезапускать 9X_j2se TOMCAT или Apache:

public static HttpComponentsClientHttpRequestFactory requestFactory(CloseableHttpClient httpClient) {
    TrustStrategy acceptingTrustStrategy = new TrustStrategy() {
        @Override
        public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            return true;
        }
    };

    SSLContext sslContext = null;
    try {
        sslContext = org.apache.http.ssl.SSLContexts.custom()
                .loadTrustMaterial(null, acceptingTrustStrategy)
                .build();
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    }   

    HostnameVerifier hostnameVerifier = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    final SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext,hostnameVerifier);

    final Registry registry = RegistryBuilder.create()
            .register("http", new PlainConnectionSocketFactory())
            .register("https", csf)
            .build();

    final PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
    cm.setMaxTotal(100);
    httpClient = HttpClients.custom()
            .setSSLSocketFactory(csf)
            .setConnectionManager(cm)
            .build();

    HttpComponentsClientHttpRequestFactory requestFactory =
            new HttpComponentsClientHttpRequestFactory();

    requestFactory.setHttpClient(httpClient);

    return requestFactory;
}

2
0

Ответ #13

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Я также столкнулся с этой проблемой при 9X_javax обновлении Java 1.6_29 до 1.7.

К сожалению, мой 9X_java-api клиент обнаружил настройку в панели управления 9X_javax Java, которая решает эту проблему.

На вкладке 9X_oraclejdk "Дополнительно" установите флажок "Использовать 9X_core-java формат ClientHello, совместимый с SSL 2.0".

Кажется, проблема 9X_javax решена.

Мы используем Java-апплеты в браузере 9X_openjdk Internet Explorer.

Надеюсь, это поможет.

1
0

Ответ #14

Ответ на вопрос: Предупреждение о подтверждении связи SSL: ошибка unrecognized_name с момента обновления до Java 1.7.0

Вот решение для Appache httpclient 4.5.11. У 9X_j2se меня возникла проблема с сертификатом, который 9X_java-se имеет подстановочный знак *.hostname.com. Он вернул мне 9X_java-libraries то же исключение, но я не должен использовать 9X_javax отключение по свойству System.setProperty("jsse.enableSNIExtension", "false");, потому что это 9X_.java привело к ошибке в клиенте местоположения 9X_core-java Google.

Я нашел простое решение (только модифицируя 9X_core-java сокет):

import io.micronaut.context.annotation.Bean;
import io.micronaut.context.annotation.Factory;
import org.apache.http.client.HttpClient;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContexts;

import javax.inject.Named;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket;
import java.io.IOException;
import java.util.List;

@Factory
public class BeanFactory {

    @Bean
    @Named("without_verify")
    public HttpClient provideHttpClient() {
        SSLConnectionSocketFactory connectionSocketFactory = new SSLConnectionSocketFactory(SSLContexts.createDefault(), NoopHostnameVerifier.INSTANCE) {
            @Override
            protected void prepareSocket(SSLSocket socket) throws IOException {
                SSLParameters parameters = socket.getSSLParameters();
                parameters.setServerNames(List.of());
                socket.setSSLParameters(parameters);
                super.prepareSocket(socket);
            }
        };

        return HttpClients.custom()
                .setSSLSocketFactory(connectionSocketFactory)
                .build();
    }


}

1
0