Mam program Java, który łączy się z serwerem internetowym przy użyciu protokołu SSL/TLS i wysyła różne żądania HTTP za pośrednictwem tego połączenia. Serwer to localhost i używa certyfikatu z podpisem własnym, ale mój kod używa niestandardowych TrustManagers i ignoruje nieważne certyfikaty. Do tej pory działało idealnie.Odbieranie wyjątku SSLHandshakeException: handshake_failure pomimo mojego klienta ignorującego wszystkie certyfikaty
Jedyną różnicą na serwerze jest to, że był używany do uruchamiania jboss 6 i teraz działa jboss 7. Nie jestem pewien, czy jest to problem z konfiguracją, czy też występuje problem z moim kodem, ale dostaję te same błędy, jeśli próbuję połączyć się przy użyciu innych programów opartych na Javie, takich jak WebScarab lub ZAP.
W każdym razie czy jest coś, co mogę zrobić, aby obejść ten problem? Tutaj jest błąd w całości:
Received fatal alert: handshake_failure
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)
Oto komunikaty debugowania przed awarią:
main, WRITE: TLSv1 Handshake, length = 75
main, WRITE: SSLv2 client hello message, length = 101
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, handshake_failure
Może Cię to zainteresować: http://stackoverflow.com/a/4686924/372643 – Bruno
@Bruno Tak, widziałem to wcześniej podczas wyszukiwania w Google. Czy to błąd w Javie? Nie mogę zobaczyć, jak to może/powinno być domyślnym zachowaniem, gdy określę SSLContext jako TLS. – Rsaesha
To nie jest błąd, jest to zgodne z projektem (protokół SSLv2 dotyczy kompresji wstecznej). Zobacz [JSSE Ref/SSLContext] (http://docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#SSLContext): "* Na przykład getInstance (" SSLv3 ") może zwrócić instancję implementującą "SSLv3" i "TLSv1" * [...] Możesz kontrolować, które protokoły są faktycznie włączone dla połączenia SSL, używając metody setEnabledProtocols (String [] protocol) ". W twoim przypadku 'https.protocols' zajmuje się' setEnabledProtocols' dla 'HttpsURLConnection'. – Bruno