Comment puis-je configurer le protocole SSL version de java? Et comment savoir lequel? javax.net.le protocole ssl.SSLException: Reçu alerte fatale: protocol_version
Je suis à l'aide d'Apache HttpClient 4.3 pour interagir avec l'API de hubic.com. Mon minimale reproduit exemple est juste une seule ligne:
HttpClientBuilder.create().build().execute(new HttpGet("https://hubic.com"));
Cependant que les lancers:
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)
Voici la sortie, si je lance avec 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
Aucune exception n'est levée si j'essaie d'accéder, par exemple https://google.com. Donc, il suppose que le protocole SSL avec Java ne peut pas être complètement cassé sur mon système, mais il doit faire avec la combinaison avec hubic.com.
L'erreur protocol_version
n'est pas très utile, mais dans cette question il est suggéré que mon client utilise un autre protocole de la version que le serveur (je suppose que "le serveur et le client n'a pas pu s'entendre sur un protocole" serait plus exact).
Comment puis-je savoir quel version du protocole, le serveur sera d'accord et comment puis-je permettre à mon client? Et dois-je m'inquiéter au sujet de la question (par exemple, comme le fait hubic seulement permettre à un vieux protocole non pris en charge? (Firefox n'est certainement pas de se plaindre de quelque chose de non sécurisé).
- avez-vous essayé le Système.setProperty("javax.net.debug", "tous"); et le Système.setProperty("https.les protocoles", "SSLv3"); (comme l'a suggéré stackoverflow.com/questions/22318729/...) ?
- Vous obtenez cette erreur exactement si vous essayez d'accéder au site avec SSLv3, parce que les sites ne le supporte pas. Google fonctionne, car il prend toujours en charge de SSLv3. Donc quelque part dans vos paramètres ou de code, vous devez avoir restreint-vous de SSLv3.
- J'ai ajouté la sortie de débogage
- J'ai posté mon code complet (enfin... le contenu complet de la méthode main). C'est juste que seule ligne. Je n'ai aucune idée d'où une restriction de SSLv3 viendrait. Comment puis-je le savoir?
- Je vois depuis le débogage que Java n'a TLS1.2 poignée de main au lieu de la plus commune SSLv23 poignée de main. Le serveur lui-même ne peut faire que TLS1.0 et échoue juste annoncer cette ancienne version. Je ne suis pas familier avec Java, mais vous avez besoin de définir la version du protocole de TLSv1 ou SSLv23 à parler avec ce serveur.
- En effet, c'est elle. Si j'ai mis de soutien à TLS1.0 ET d'autres versions de TLS, il ne fonctionne pas. Si j'ai mis de soutien à SEULEMENT TLS1.0 il fonctionne. Comment avez-vous comprendre cela? Allez-vous poster une réponse afin que je puisse l'accepter (je serai heureux d'ajouter le réel de code java à votre réponse).
- "Comment avez-vous comprendre cela?" - beaucoup de débogage de SSL problèmes, voir noxxi.de/howto/ssl-debugging.html
Vous devez vous connecter pour publier un commentaire.
Je vois depuis le débogage que Java n'a TLS1.2 poignée de main au lieu de la plus commune SSLv23 poignée de main:
Le serveur lui-même ne peut faire que TLS1.0 et échoue juste annoncer cette ancienne version.
Je ne suis pas familier avec Java, mais vous avez besoin de définir la version du protocole de TLSv1 ou SSLv23 à parler avec ce serveur.
Le code suivant devrait définir uniquement TLSv1 avec Apache HttpClient:
MODIFIER pour inclure la question de commentaire:
Si le client annonce TLS1.2 dans le ClientHello et le serveur ne peut faire que TLS1.0 il devrait en faire l'annonce, c'est à dire répondre avec TLS1.0. Le client peut alors fermer la connexion si TLS1.0 n'est pas assez bon ou continuer avec TLS1.0. Mais, dans ce cas, le serveur juste de dire au client qu'il n'aime pas cette version et a fermé la connexion. Firefox et les autres au lieu de faire un SSLv23 annonce, où ils font un TLS1.0 poignée de main, mais aussi annoncer de la meilleure version du protocole qu'ils soutiennent. C'est généralement bon pour les serveurs les plus anciens à partir de SSL3.0 mais aussi pour les nouveaux serveurs.
Vous pouvez vérifier le comportement du serveur avec une récente Perl/IO::Socket::SSL et ce script.
Vous pouvez voir ici, que les hôtes prend en charge SSLv23 et TLSv1 des poignées de main, mais pas l'utilisé TLSv1_2 poignée de main.
HttpClient peut prendre un
SSLContext
pour sonSSLConnectionSocketFactory
.Vous pouvez définir les TLS version dans les propriétés de la
SSLContext
avec legetInstance
méthode statique.Quelque chose comme
SSLContext context = SSLContext.getInstance("TLSv1");
Si vous avez besoin de force avec tout un protocole (comme
getInstance
peut retourner un qui prend en charge plusieurs protocoles de), vous pouvez utiliser lesetEnabledProtocols
méthode (qui prend unString[]
) sur lacontext
vous avez récupéré à l'aide degetInstance
.Exception in thread "main" java.lang.IllegalStateException: SSLContextImpl is not initialized
J'ai également rencontré ce problème. Certains sites ne sont pas accessibles, en jetant le mystérieux:
javax.net.le protocole ssl.SSLException: Reçu alerte fatale: protocol_version
J'ai essayé de le réparer, en suivant certains conseils donnés ici, mais sans succès. A un moment, la pensée habituelle “ça marchait avant..”, a vraiment commencé à me harceler.
Au début, j'avais supposé que quelque chose avait changé dans le site, j'ai essayé de vous connecter. Cependant, comme c'est un héritage genre de site, il n'était pas probable. Alors, quoi d'autre pourrait-il être..? À un moment j'ai pensé “Java-version”. Peu probable, mais peut-être vaut la peine d'essayer.
Comme il est, je récupère le contenu à partir d'erreur des jets de sites, si je compile mon code avec SDK 1.6.0_25. Des versions plus récentes me donne des problèmes: 1.7.0_51, et 1.8.0.
J'ai bouilli vers le bas à la plus petite pièce possible, si l'effet de reproduire le one-liner initialement posté par “Yankee” ci-dessus. J'ai utilisé la même ligne, y compris la même URL.
Compiler avec le SDK 1.6, il fonctionne.
Je ne suis pas suffisamment qualifié en Java et SSL pour comprendre l'enjeu derrière tout cela. Mais, quelqu'un devrait être en mesure de mettre le code côté par côté, et de le suivre vers le bas..
Cela peut sauver quelqu'un d'un peu gaspillé des heures.
Il semble que vous n'êtes pas à l'aide de java 1.8
En Java 1.8 par défaut le protocole TLS version est v1.2, tandis que dans Java 1.6,1.7 valeur par défaut est TLS1.0.
Comme vous pouvez le voir dans les logs
ClientHello, TLSv1.2
cela signifie que vous êtes soit à l'aide de java 1.6 ou 1.7
maintenant, vous pouvez soit passer à 1,8
ou
Juste ajouter
dans votre application de classe avant la classe principale
vous garder au courant de la version java
.. espérons que cette aide !!