Сегодня я обновился с Java 1.6 до Java 1.7. С тех пор возникает ошибка, когда я пытаюсь установить соединение с моим веб-сервером через SSL:
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);
}
Это только тестовый проект, поэтому я разрешаю и использую ненадежные сертификаты с кодом:
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 . где моя вина?
Спасибо.
У меня было то, во что я верю. Я обнаружил, что мне нужно настроить конфигурацию Apache, чтобы включить ServerName или ServerAlias для хоста.
Этот код не удался:
И этот код работал:
Wireshark обнаружил, что во время приветствия TSL / SSL предупреждение с предупреждением (уровень: предупреждение, описание: нераспознанное имя) было отправлено с сервера на клиент. Это было всего лишь предупреждение, однако, Java 7.1 затем немедленно ответила «Фатальным, Описание: Неожиданное сообщение», что, как я предполагаю, означает, что библиотеки Java SSL не любят видеть предупреждение о нераспознанном имени.
Из Вики по безопасности транспортного уровня (TLS):
112 Только нераспознанное имя, предупреждение TLS; Индикатор имени сервера клиента указал имя хоста, которое не поддерживается сервером
Это заставило меня взглянуть на мои файлы конфигурации Apache, и я обнаружил, что, если я добавляю имя ServerName или ServerAlias для имени, отправляемого со стороны клиента / Java, оно работает правильно, без каких-либо ошибок.
источник
ServerAlias
работали для меня. Я видел такое же предупреждение TLS в Wireshark.ServerName
s, Apache отвечаетunrecognized_name
предупреждением (которое также может быть фатальным ). RFC 6066 точно говорит об этом по этой теме: « НЕ РЕКОМЕНДУЕТСЯ отправлять предупреждение уровня unrecognized_name (112) уровня предупреждения, потому что поведение клиента в ответ на предупреждения уровня предупреждения непредсказуемо ». Единственная ошибка, допущенная этим сотрудником, заключается в предположении, что это было смертельное предупреждение. Это такая же ошибка в JRE, как и в Apache.Вы можете отключить отправку записей SNI с помощью свойства System jsse.enableSNIExtension = false.
Если вы можете изменить код, который он помогает использовать
SSLCocketFactory#createSocket()
(без параметра хоста или с подключенным сокетом). В этом случае он не отправит указание server_name.источник
System.setProperty ("jsse.enableSNIExtension", "false");
-Djsse.enableSNIExtension=false
. Но что еще это делает? Это вредно для остальной безопасности Javas?Мы также столкнулись с этой ошибкой при новой сборке сервера Apache.
Исправление в нашем случае состояло в том, чтобы определить
ServerAlias
в,httpd.conf
что соответствует имени хоста, к которому пытается подключиться Java. НашимServerName
было установлено внутреннее имя хоста. Наш SSL-сертификат использовал внешнее имя хоста, но этого было недостаточно, чтобы избежать предупреждения.Чтобы помочь отладке, вы можете использовать эту команду ssl:
openssl s_client -servername <hostname> -connect <hostname>:443 -state
Если есть проблема с этим именем хоста, он напечатает это сообщение в верхней части вывода:
SSL3 alert read: warning:unrecognized name
Следует также отметить, что мы не получили эту ошибку при использовании этой команды для подключения к внутреннему имени хоста, даже если она не соответствует сертификату SSL.
источник
openssl
. Это очень полезно.SSL3 alert read: warning:unrecognized name
? Я вижу напечатанное предупреждение, но вывод не помогает мне увидеть эту разницу в именахOpenSSL 1.0.1e-fips 11 Feb 2013
,OpenSSL 1.0.2k-fips 26 Jan 2017
иLibreSSL 2.6.5
.Вместо того чтобы полагаться на механизм виртуального хоста по умолчанию в apache, вы можете определить один последний виртуальный хост, который использует произвольное имя сервера и подстановочный знак ServerAlias, например
Таким образом, вы можете использовать SNI, и apache не будет отправлять предупреждение SSL.
Конечно, это работает, только если вы можете легко описать все свои домены, используя подстановочный синтаксис.
источник
*.mydomain.com
подстановочный сертификат, либо укажите все используемые поддомены, либо используйте синтаксис для ServerAlias. Обратите внимание, что вы можете добавить несколько псевдонимов, используяServerAlias
, напримерServerAlias *.mydomain.com mydomain.com *.myotherdomain.com
.Это должно быть полезно. Повторить попытку ошибки SNI в Apache HttpClient 4.4 - самый простой способ, которым мы пришли (см. HTTPCLIENT-1522 ):
и
и
источник
verifyHostname(sslsock, target)
вSSLConnectionSocketFactory.createLayeredSocket
? Посколькуtarget
переменная изменена на пустую строку,verifyHostname
она не будет успешной. Я что-то упускаю здесь очевидное?Использование:
источник
Наткнулся на эту проблему с пружинной загрузкой и jvm 1.7 и 1.8. В AWS у нас не было возможности изменить ServerName и ServerAlias, чтобы они совпадали (они разные), поэтому мы сделали следующее:
В build.gradle мы добавили следующее:
Это позволило нам обойти проблему с «Нераспознанным именем».
источник
К сожалению, вы не можете предоставить системные свойства для инструмента jarsigner.exe.
Я отправил дефект 7177232 , ссылаясь на дефект 7eckes @eckes и объясняя, почему он был закрыт по ошибке.
Мой дефект касается именно воздействия на инструмент jarsigner, но, возможно, это приведет к повторному открытию другого дефекта и правильному решению проблемы.
ОБНОВЛЕНИЕ: На самом деле, оказывается, что вы МОЖЕТЕ предоставить системные свойства инструменту Jarsigner, но его нет в справочном сообщении. использование
jarsigner -J-Djsse.enableSNIExtension=false
источник
Я столкнулся с той же проблемой, и оказалось, что обратный DNS не был настроен правильно, он указал на неправильное имя хоста для IP. После того, как я исправил реверс DNS и перезапустил httpd, предупреждение исчезло. (если я не исправляю обратный DNS, добавление ServerName также помогло мне)
источник
Мой
VirtualHost
«sServerName
был закомментирован по умолчанию. Сработало после раскомментирования.источник
Если вы создаете клиент с Resttemplate, вы можете установить конечную точку только так: https: // IP / path_to_service и установить requestFactory.
С этим решением вам не нужно перезапускать ваш TOMCAT или Apache:
источник
Я также сталкивался с этой проблемой при обновлении с Java 1.6_29 до 1.7.
Что удивительно, мой клиент обнаружил настройку в панели управления Java, которая решает эту проблему.
На вкладке «Дополнительно» вы можете установить флажок «Использовать совместимый с SSL 2.0 формат ClientHello».
Кажется, это решает проблему.
Мы используем Java-апплеты в браузере Internet Explorer.
Надеюсь это поможет.
источник
У меня была такая же проблема с сервером Ubuntu Linux, на котором работала Subversion при доступе через Eclipse.
Он показал, что проблема была связана с предупреждением, когда Apache (пере) запускался:
Это произошло из-за новой записи в
ports.conf
, гдеNameVirtualHost
наряду с директивой была введена другая директиваsites-enabled/000-default
.После удаления директивы
ports.conf
проблема исчезла (естественно, после перезапуска Apache)источник
Просто чтобы добавить решение здесь. Это может помочь пользователям LAMP
Вышеупомянутая строка в конфигурации виртуального хоста была виновником.
Конфигурация виртуального хоста при ошибке
Рабочая конфигурация
источник
Вот решение для Appache httpclient 4.5.11. У меня была проблема с сертификатом, который имеет подстановочный знак
*.hostname.com
. Он вернул мне то же исключение, но я не должен использовать отключение по свойству,System.setProperty("jsse.enableSNIExtension", "false");
потому что он сделал ошибку в клиенте местоположения Google.Я нашел простое решение (только изменение сокета):
источник
Есть более простой способ, где вы можете просто использовать свой собственный HostnameVerifier, чтобы неявно доверять определенным соединениям. Проблема возникает в Java 1.7, где были добавлены расширения SNI, и ваша ошибка связана с неправильной настройкой сервера.
Вы можете использовать «-Djsse.enableSNIExtension = false», чтобы отключить SNI во всей JVM, или прочитать мой блог, где я объясняю, как реализовать пользовательский верификатор поверх URL-соединения.
источник