Java 7 (agissant en tant que client) Échec de la prise de contact SSL avec keystore et truststore qui fonctionnaient dans Java 6

Je suis en train de faire un JBoss 5.1 de la section 7.4, et Java 6 à 7 de la migration, et d'obtenir une poignée de main à l'échec.

Le fichier de clés et truststore sont ceux que nous avons utilisé avec succès pour les âges avec Java 6.

J'ai écrit quelques tests pour limiter le problème, ce n'est certainement pas JBoss, mais plutôt de Java 7.

Avec SSL enregistrement activé, j'obtiens ceci:

17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) %% Invalidated:  [Session-2, SSL_RSA_WITH_RC4_128_SHA]
17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, SEND TLSv1 ALERT:  fatal, description = certificate_unknown
17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, WRITE: TLSv1 Alert, length = 2
17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, called closeSocket()
17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, handling exception: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
17:44:30,041 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, called close()
17:44:30,042 INFO  [stdout] (http-/192.168.147.20:8080-120) http-/192.168.147.20:8080-120, called closeInternal(true)

Il y a quelques threads de toucher à ce (ou similaire) problème, où les gens sont ce qui suggère à recréer certs ou truststores avec différents paramètres. Je préfère ne pas aller dans cette voie, puisque j'ai récemment sans succès essayé de créer plus de ces magasins de clés et truststores pour les différents comptes d'un même webservice.

Depuis que nous avons été à l'aide de ces vieux (fichier de stockage des clés et truststore) dans la production avec la version 6 de Java, j'aimerais les garder si possible.

Il semble que le problème peut être causé par Java 7 est plus serré au sujet de la vérification de truststore chaîne de certificat?

Est-il possible de définir un certain nombre de drapeaux pour se détendre de la vérification, qu'elle se comporte comme la version 6 de Java?

Une chose que je ne suis pas sûr à 100% sur de savoir comment interpréter le message d'échec: je pense que c'est de me dire que c'est ma machine (pas le supprimer du serveur), ce qui n'est pas convaincu que la machine distante est sûr. Est-ce exact?

Toute aide/idées appréciées!

==========================================================

Comme l'a suggéré, ont ajouté PEM (avec chaîne), exportés à partir de firefox lors de l'accès à l'WS URL, pour le truststore. Ce n'est pas de poignée de main, mais modifie légèrement l'échec.

***
%% Invalidated:  [Session-1, SSL_RSA_WITH_RC4_128_SHA]
main, SEND TLSv1 ALERT:  fatal, description = certificate_unknown
main, WRITE: TLSv1 Alert, length = 2
[Raw write]: length = 7
0000: 15 03 01 00 02 02 2E                               .......
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)

==============================================================

Aussi, comme suggéré dans d'autres threads, j'ai écrit un autre test qui utilise un TrustManager qui ne valide pas les chaînes de certificats, et a couru avec mon original truststore.

Ce test est capable de se connecter, et montre ainsi que ma machine est la validation de la machine distante est le seul problème, et que mon fichier est bien.

Cependant, je ne peux pas utiliser cette approche pour notre client webservice, depuis que utilise le Sun RPC lib, et la connexion se passe quelque part profondément à l'intérieur de leur code, donc je ne peux pas le toucher.

source d'informationauteur stupor-mundi