Zaktualizowałem dzisiaj z Java 1.6 do Java 1.7. Od tego czasu pojawia się błąd, gdy próbuję nawiązać połączenie z moim serwerem internetowym przez 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)
Oto kod:
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);
}
To tylko projekt testowy, dlatego pozwalam i używam niezaufanych certyfikatów z kodem:
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);
}
Z powodzeniem próbowałem połączyć się z https://google.com . gdzie jest moja wina?
Dzięki.
Miałem, jak sądzę, ten sam problem. Stwierdziłem, że muszę dostosować konfigurację Apache, aby zawierała nazwę serwera lub nazwę serwera dla hosta.
Ten kod nie powiódł się:
I ten kod działał:
Wireshark ujawnił, że podczas TSL / SSL Hello Alert ostrzeżenie (poziom: ostrzeżenie, opis: nierozpoznana nazwa), serwer Hello został wysłany z serwera do klienta. Było to tylko ostrzeżenie, jednak Java 7.1 od razu odpowiedziała „Fatal, Description: U nieoczekiwana wiadomość”, co, jak zakładam, oznacza, że biblioteki Java SSL nie lubią widzieć ostrzeżenia o nierozpoznanej nazwie.
Z Wiki on Transport Layer Security (TLS):
112 Ostrzeżenie o nierozpoznanej nazwie Tylko TLS; Wskaźnik nazwy serwera klienta określa nazwę hosta nieobsługiwaną przez serwer
Doprowadziło mnie to do spojrzenia na moje pliki konfiguracyjne Apache i doszedłem do wniosku, że jeśli dodałem ServerName lub ServerAlias dla nazwy wysłanej ze strony klienta / java, działałoby to poprawnie bez żadnych błędów.
źródło
ServerAlias
pracował dla mnie. Widziałem ten sam alert TLS w Wireshark.ServerName
s, Apache odpowiadaunrecognized_name
ostrzeżeniem (które może być również ostrzeżeniem śmiertelnym ). RFC 6066 precyzyjnie mówi to na ten temat: „ NIE ZALECA się wysyłania alertu na poziomie ostrzeżenia nierozpoznany_nazwa (112), ponieważ zachowanie klienta w odpowiedzi na alerty na poziomie ostrzeżenia jest nieprzewidywalne. ”. Jedynym błędem popełnianym przez tego pracownika jest założenie, że był to śmiertelny alarm. Jest to zarówno błąd JRE, jak i Apache.Możesz wyłączyć wysyłanie rekordów SNI za pomocą właściwości Systemu jsse.enableSNIExtension = false.
Jeśli możesz zmienić kod, pomaga w użyciu
SSLCocketFactory#createSocket()
(bez parametru hosta lub z podłączonym gniazdem). W takim przypadku nie wyśle wskazania nazwa_serwera.źródło
System.setProperty ("jsse.enableSNIExtension", "false");
-Djsse.enableSNIExtension=false
. Ale co jeszcze to robi? Czy jest to szkodliwe dla reszty bezpieczeństwa Java?Wystąpił również ten błąd w nowej wersji serwera Apache.
W naszym przypadku poprawka polegała na zdefiniowaniu
ServerAlias
w nazwiehttpd.conf
odpowiadającej nazwie hosta, z którym Java próbowała się połączyć. NaszServerName
ustawiono na wewnętrzną nazwę hosta. Nasz certyfikat SSL używał zewnętrznej nazwy hosta, ale to nie wystarczyło, aby uniknąć ostrzeżenia.Aby pomóc w debugowaniu, możesz użyć tego polecenia ssl:
openssl s_client -servername <hostname> -connect <hostname>:443 -state
Jeśli występuje problem z tą nazwą hosta, wydrukuje ten komunikat u góry wyjścia:
SSL3 alert read: warning:unrecognized name
Powinienem również zauważyć, że nie dostaliśmy tego błędu podczas używania tego polecenia do łączenia się z wewnętrzną nazwą hosta, mimo że nie był on zgodny z certyfikatem SSL.
źródło
openssl
. To bardzo pomocne.SSL3 alert read: warning:unrecognized name
? Widzę wydrukowany alert, ale wynik nie pomaga mi dostrzec tej różnicy w nazewnictwieOpenSSL 1.0.1e-fips 11 Feb 2013
,OpenSSL 1.0.2k-fips 26 Jan 2017
iLibreSSL 2.6.5
.Zamiast polegać na domyślnym mechanizmie hosta wirtualnego w Apache, możesz zdefiniować ostatni wirtualny host typu catchall, który używa dowolnej nazwy serwera i wieloznacznika ServerAlias, np.
W ten sposób możesz użyć SNI, a apache nie odeśle ostrzeżenia SSL.
Oczywiście działa to tylko wtedy, gdy możesz łatwo opisać wszystkie swoje domeny za pomocą składni symboli wieloznacznych.
źródło
*.mydomain.com
składni ServerAlias. Pamiętaj , że możesz dodać wiele aliasów, używającServerAlias
npServerAlias *.mydomain.com mydomain.com *.myotherdomain.com
.To powinno być przydatne. Aby ponowić próbę wystąpienia błędu SNI w Apache HttpClient 4.4 - najprostszy sposób, jaki wymyśliliśmy (patrz HTTPCLIENT-1522 ):
i
i
źródło
verifyHostname(sslsock, target)
wSSLConnectionSocketFactory.createLayeredSocket
? Ponieważtarget
zmieniono na pusty ciąg,verifyHostname
nie odniesie sukcesu. Czy brakuje mi czegoś oczywistego?Posługiwać się:
źródło
Wpadłem na ten problem z wiosennym bootowaniem i Jvm 1.7 i 1.8. W AWS nie mieliśmy opcji zmiany ServerName i ServerAlias, aby pasowały (są różne), więc wykonaliśmy następujące czynności:
W build.gradle dodaliśmy:
To pozwoliło nam ominąć problem z „Nierozpoznaną nazwą”.
źródło
Niestety nie można podać właściwości systemu do narzędzia jarsigner.exe.
Przesłałem wadę 7177232 , odnosząc się do wady @eckes 7127374 i wyjaśniając, dlaczego została ona błędnie zamknięta.
Moja wada dotyczy w szczególności wpływu na narzędzie jarsigner, ale być może doprowadzi ich to do ponownego otwarcia drugiej wady i właściwego rozwiązania problemu.
AKTUALIZACJA: W rzeczywistości okazuje się, że MOŻESZ dostarczyć właściwości systemowe do narzędzia Jarsigner, po prostu nie ma go w komunikacie pomocy. Posługiwać się
jarsigner -J-Djsse.enableSNIExtension=false
źródło
Natrafiłem na ten sam problem i okazało się, że odwrotne dns nie było poprawnie ustawione, wskazywało to na niewłaściwą nazwę hosta dla adresu IP. Po poprawieniu odwrotnej usługi DNS i ponownym uruchomieniu httpd ostrzeżenie zniknęło. (jeśli nie poprawię odwrotnego dns, dodanie ServerName również załatwiło sprawę)
źródło
My
VirtualHost
„sServerName
został wykomentowane domyślnie. Działa po odkomentowaniu.źródło
Jeśli budujesz klienta za pomocą Resttemplate, możesz ustawić tylko punkt końcowy w następujący sposób: https: // IP / ścieżka_do_usługi i ustawić parametr requestFactory.
Dzięki temu rozwiązaniu nie musisz PONOWNIE uruchamiać TOMCAT lub Apache:
źródło
Natknąłem się również na ten problem podczas aktualizacji z Java 1.6_29 do 1.7.
Niepokojące jest to, że mój klient odkrył ustawienie w panelu sterowania Java, które to rozwiązuje.
W zakładce Zaawansowane możesz zaznaczyć „Użyj zgodnego z SSL 2.0 formatu ClientHello”.
To wydaje się rozwiązać problem.
Korzystamy z apletów Java w przeglądarce Internet Explorer.
Mam nadzieję że to pomoże.
źródło
Miałem ten sam problem z serwerem Ubuntu Linux z uruchomioną wersją subversion, gdy dostęp do niego odbywa się za pośrednictwem Eclipse.
Pokazało, że problem miał związek z ostrzeżeniem, gdy uruchomiono (ponownie) Apache:
Wynika to z nowego wpisu w
ports.conf
, w którymNameVirtualHost
obok dyrektywy wprowadzono kolejną dyrektywęsites-enabled/000-default
.Po usunięciu dyrektywy
ports.conf
problem zniknął (oczywiście po ponownym uruchomieniu Apache)źródło
Aby dodać rozwiązanie tutaj. Może to pomóc użytkownikom LAMP
Winowajcą była wyżej wymieniona linia w konfiguracji wirtualnego hosta.
Konfiguracja hosta wirtualnego, gdy wystąpi błąd
Konfiguracja robocza
źródło
Oto rozwiązanie dla Appache httpclient 4.5.11. Miałem problem z certyfikatem, który poddał wildcard
*.hostname.com
. Zwrócił mi ten sam wyjątek, ale nie mogłem używać wyłączania według właściwości,System.setProperty("jsse.enableSNIExtension", "false");
ponieważ popełnił błąd w kliencie lokalizacji Google.Znalazłem proste rozwiązanie (tylko gniazdo modyfikujące):
źródło
Jest łatwiejszy sposób którym możesz po prostu użyć własnego HostnameVerifier do niejawnego zaufania do niektórych połączeń. Problem występuje w Javie 1.7, w której dodano rozszerzenia SNI, a twój błąd jest spowodowany błędną konfiguracją serwera.
Możesz użyć opcji „-Djsse.enableSNIExtension = false”, aby wyłączyć SNI w całej maszynie JVM, lub przeczytać mój blog, w którym wyjaśniam, jak zaimplementować niestandardowy weryfikator na podstawie połączenia URL.
źródło