Wie kann ich die SSL-Protokoll-version, die in java? Und wie weiß ich welche? javax.net.ssl.SSLException: Received fatal alert: protocol_version
Ich bin mit Apache HttpClient 4.3 die Interaktion mit der API von hubic.com. Mein minimal reproduzierbare Beispiel ist nur ein Einzeiler:
HttpClientBuilder.create().build().execute(new HttpGet("https://hubic.com"));
Jedoch wirft:
Exception in thread "main" javax.net.ssl.SSLException: Received fatal alert: protocol_version
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1991)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1104)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1343)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1371)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1355)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:275)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:254)
at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:117)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:314)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
Hier ist die Ausgabe, wenn ich mit System.setProperty("javax.net.debug", "all");
:
trustStore is: /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts
trustStore type is : jks
trustStore provider is :
init truststore
adding as trusted cert: [... extremely large list ...]
trigger seeding of SecureRandom
done seeding SecureRandom
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Allow unsafe renegotiation: false
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 for SSLv3
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 for SSLv3
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256 for SSLv3
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 for SSLv3
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 for SSLv3
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 for SSLv3
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 for SSLv3
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 for TLSv1
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 for TLSv1.1
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 for TLSv1.1
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256 for TLSv1.1
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 for TLSv1.1
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 for TLSv1.1
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 for TLSv1.1
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 for TLSv1.1
%% No cached client session
*** ClientHello, TLSv1.2
RandomCookie: GMT: 1402182685 bytes = { 227, 155, 148, 161, 7, 104, 221, 182, 254, 133, 216, 198, 118, 211, 223, 229, 43, 82, 207, 1, 102, 245, 112, 117, 253, 69, 43, 162 }
Session ID: {}
Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_SHA, TLS_ECDH_ECDSA_WITH_RC4_128_SHA, TLS_ECDH_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_MD5, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
Compression Methods: { 0 }
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1}
Extension ec_point_formats, formats: [uncompressed]
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA, MD5withRSA
Extension server_name, server_name: [type=host_name (0), value=hubic.com]
***
[write] MD5 and SHA1 hashes: len = 225
0000: 01 00 00 DD 03 03 54 94 9C 1D E3 9B 94 A1 07 68 ......T........h
0010: DD B6 FE 85 D8 C6 76 D3 DF E5 2B 52 CF 01 66 F5 ......v...+R..f.
0020: 70 75 FD 45 2B A2 00 00 46 C0 23 C0 27 00 3C C0 pu.E+...F.#.'.<.
0030: 25 C0 29 00 67 00 40 C0 09 C0 13 00 2F C0 04 C0 %.).g.@...../...
0040: 0E 00 33 00 32 C0 2B C0 2F 00 9C C0 2D C0 31 00 ..3.2.+./...-.1.
0050: 9E 00 A2 C0 08 C0 12 00 0A C0 03 C0 0D 00 16 00 ................
0060: 13 C0 07 C0 11 00 05 C0 02 C0 0C 00 04 00 FF 01 ................
0070: 00 00 6E 00 0A 00 34 00 32 00 17 00 01 00 03 00 ..n...4.2.......
0080: 13 00 15 00 06 00 07 00 09 00 0A 00 18 00 0B 00 ................
0090: 0C 00 19 00 0D 00 0E 00 0F 00 10 00 11 00 02 00 ................
00A0: 12 00 04 00 05 00 14 00 08 00 16 00 0B 00 02 01 ................
00B0: 00 00 0D 00 1A 00 18 06 03 06 01 05 03 05 01 04 ................
00C0: 03 04 01 03 03 03 01 02 03 02 01 02 02 01 01 00 ................
00D0: 00 00 0E 00 0C 00 00 09 68 75 62 69 63 2E 63 6F ........hubic.co
00E0: 6D m
main, WRITE: TLSv1.2 Handshake, length = 225
[Raw write]: length = 230
0000: 16 03 03 00 E1 01 00 00 DD 03 03 54 94 9C 1D E3 ...........T....
0010: 9B 94 A1 07 68 DD B6 FE 85 D8 C6 76 D3 DF E5 2B ....h......v...+
0020: 52 CF 01 66 F5 70 75 FD 45 2B A2 00 00 46 C0 23 R..f.pu.E+...F.#
0030: C0 27 00 3C C0 25 C0 29 00 67 00 40 C0 09 C0 13 .'.<.%.).g.@....
0040: 00 2F C0 04 C0 0E 00 33 00 32 C0 2B C0 2F 00 9C ./.....3.2.+./..
0050: C0 2D C0 31 00 9E 00 A2 C0 08 C0 12 00 0A C0 03 .-.1............
0060: C0 0D 00 16 00 13 C0 07 C0 11 00 05 C0 02 C0 0C ................
0070: 00 04 00 FF 01 00 00 6E 00 0A 00 34 00 32 00 17 .......n...4.2..
0080: 00 01 00 03 00 13 00 15 00 06 00 07 00 09 00 0A ................
0090: 00 18 00 0B 00 0C 00 19 00 0D 00 0E 00 0F 00 10 ................
00A0: 00 11 00 02 00 12 00 04 00 05 00 14 00 08 00 16 ................
00B0: 00 0B 00 02 01 00 00 0D 00 1A 00 18 06 03 06 01 ................
00C0: 05 03 05 01 04 03 04 01 03 03 03 01 02 03 02 01 ................
00D0: 02 02 01 01 00 00 00 0E 00 0C 00 00 09 68 75 62 .............hub
00E0: 69 63 2E 63 6F 6D ic.com
[Raw read]: length = 5
0000: 15 03 00 00 02 .....
[Raw read]: length = 2
0000: 02 46 .F
main, READ: SSLv3 Alert, length = 2
main, RECV TLSv1.2 ALERT: fatal, protocol_version
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLException: Received fatal alert: protocol_version
Wird keine exception geworfen, wenn ich versuche, Zugriff auf z.B. https://google.com. So ist es denke SSL mit Java nicht völlig kaputt auf meinem system, aber es hat zu tun mit die Kombination mit hubic.com.
Den Fehler protocol_version
ist nicht sehr hilfreich, aber in diese Frage es wird vorgeschlagen, dass mein Kunde arbeitet mit einem anderen Protokoll version als der server (denke ich "server und client konnte keine Einigung auf ein Protokoll" wäre genauer).
Wie kann ich herausfinden, welches Protokoll-Versionen, die server Stimmen und wie aktiviere ich diese in meinem client? Und sollte ich mir sorgen machen über das Thema (z.B. wie stellt hubic erlaubt nur eine alte nicht unterstütztes Protokoll? (Firefox sicherlich nicht beschweren über irgendetwas unsicher).
Sie erhalten diese Fehlermeldung, wenn Sie versuchen, die Website zugreifen mit SSLv3, weil die Websites nicht unterstützt. Google funktioniert, weil es immer noch unterstützt SSLv3. Also irgendwo in deinen Einstellungen oder code, müssen Sie beschränkt sich zu SSLv3.
Ich habe den debug-Ausgabe
Ich habe meine komplette code (naja... den kompletten Inhalt der main-Methode). Es ist nur so, dass eine einzige Zeile. Ich habe keine Ahnung, wo eine Einschränkung auf SSLv3 kommen würden. Wie kann ich das herausfinden?
Ich sehe aus dem debug-Java hat eine TLS1.2 handshake anstelle des gemeinsamen SSLv23 handshake. Der server selbst tun können, nur TLS1.0 und es nicht nur ankündigen, diese ältere version. Ich bin nicht vertraut mit Java, aber Sie benötigen entweder den Protokoll-version TLSv1 oder SSLv23 zu sprechen, die mit diesem server.
InformationsquelleAutor yankee | 2014-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehe ich aus dem debug-Java hat eine TLS1.2 handshake anstelle des gemeinsamen SSLv23 handshake:
Dem server selbst tun können, nur TLS1.0 und es nicht nur ankündigen, diese ältere version.
Ich bin nicht vertraut mit Java, aber Sie benötigen entweder den Protokoll-version TLSv1 oder SSLv23 zu sprechen, die mit diesem server.
Den folgenden code würde nur TLSv1 mit Apache HttpClient:
BEARBEITEN, umfassen die Frage aus dem Kommentar:
Wenn der Kunde kündigt TLS1.2 in der ClientHello und die server tun kann, nur TLS1.0 sollte es ankündigen, also Antworten mit TLS1.0. Der client kann dann die Verbindung schließen, wenn TLS1.0 ist nicht gut genug, oder fahren Sie mit TLS1.0. Aber, in diesem Fall der server hat nur gesagt, der client, dass er nicht wie diese version und die Verbindung geschlossen. Firefox und andere stattdessen tun SSLv23 Ankündigung, wo Sie das tun, TLS1.0-handshake, aber auch verkünden, dass das beste Protokoll-version, die Sie unterstützen. Dies funktioniert in der Regel gut für die älteren Servern ab SSL3.0, aber auch für die neueren Server.
Können Sie überprüfen, das Verhalten der server mit einer aktuellen Perl/IO::Socket::SSL und dieses Skript.
Hier kannst du sehen, dass die Gastgeber, unterstützt SSLv23 und TLSv1 Händeschütteln, aber nicht die verwendeten TLSv1_2 handshake.
Da diese Frage wichtig ist, das problem zu verstehen habe ich ihn Hinzugefügt und die Antwort auf meine Antwort.
Plus eine für das perl-Skript, das nach github.com/noxxi/p5-ssl-tools
InformationsquelleAutor Steffen Ullrich
HttpClient kann eine
SSLContext
für seineSSLConnectionSocketFactory
.Können Sie das entsprechende TLS-version in den Eigenschaften für die
SSLContext
mit dergetInstance
statische Methode.Etwas wie
SSLContext context = SSLContext.getInstance("TLSv1");
Wenn Sie brauchen, um zu erzwingen, nur ein Protokoll (wie
getInstance
zurückkehren können, man unterstützt mehrere Protokolle), können Sie diesetEnabledProtocols
Methode (das dauert eineString[]
) auf dercontext
Sie wieder mitgetInstance
.Exception in thread "main" java.lang.IllegalStateException: SSLContextImpl is not initialized
InformationsquelleAutor Powerlord
Habe ich auch dieses Problem. Bestimmte Seiten nicht zugänglich sind, wirft die geheimnisvolle:
javax.net.ssl.SSLException: Received fatal alert: protocol_version
Habe ich versucht, es auszubessern, im folgenden einige Hinweise, die hier gegeben werden, aber ohne Erfolg. An einer Stelle der übliche Gedanke, "es funktioniert, bevor..", begann wirklich an mir zu nagen.
Zunächst hatte ich angenommen hatte sich etwas geändert in der Seite, die ich versuchte zu verbinden. Jedoch, dies ist eine veraltete Art von Website, es war nicht so wahrscheinlich. So, was könnte es sonst sein..? An einem Punkt dachte ich "Java-version". Unwahrscheinlich, aber vielleicht einen Versuch Wert.
Als es ist, ich kann die Inhalte aus bereits Fehler-Seiten werfen, wenn ich kompilieren meine code mit dem SDK 1.6.0_25. Neuere Versionen gibt mir Probleme: 1.7.0_51, und 1.8.0.
Habe ich gekocht es bis auf das kleinste Stück möglich, wenn die Wirkung der Reproduktion der one-liner ursprünglich geschrieben von "Yankee" vor. Ich habe die gleiche Linie, einschließlich der gleichen URL.
Kompilieren mit dem SDK 1.6 funktioniert es.
Ich bin nicht ausreichend qualifiziert, die in Java und SSL zu verstehen, die root-Problem dahinter. Aber, jemand sollte in der Lage sein, um den code nebeneinander, und es aufzuspüren..
Davor retten, dass jemand ein paar Stunden verplempert.
InformationsquelleAutor user3376448
Sieht es aus wie Sie nicht mit java 1.8
In Java 1.8 der Standard-TLS-Protokoll-version ist v1.2, in der Erwägung, dass in Java 1.6,1.7 Standard ist TLS1.0.
Wie Sie sehen können in den Protokollen
ClientHello, TLSv1.2
es heißt, Sie sind entweder mit java 1.6 oder 1.7
nun können Sie entweder den-Schalter auf 1,8
oder
Fügen Sie einfach
in Ihrer Anwendung Klasse vor der main-Klasse
halten Sie die aktuelle java-version
.. hoffe das hilft !!
Haben Sie sich die Eigenschaft in Ihrem code?
Überprüfen Sie auch für SSL-SERVER-TEST via ssllabs erhalten Sie die Protokolle, die vom server unterstützt.
InformationsquelleAutor Samrat K