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
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, oui, à l'exception, dit le Java SSL module dans votre machine n'est pas la confiance, la preuve de l'identité (certificat) reçu par le serveur.
Oui, Java 7 ne plus strictes de contrôle. Il y a peut être plus, mais celui que je suis sûr, c'est qu'elle ne permet pas la période de validité d'un enfant cert à la fin, après le parent/CA cert (ou de commencer à l'avant, mais dans la pratique, cela n'arrive pas). Voir PKIX Chemin d'accès n'a pas de chaîne avec les ancres de confiance erreur dans l'Environnement Windows qui dit que c'est un bug et sera corrigé.
À vérifier: si le serveur est un serveur web, vous pouvez accéder à tout (inoffensif) de la page avec un navigateur et de les utiliser qu'à regarder le cert de la chaîne. Sinon, exécutez
openssl s_client -connect $host:443 -showcerts
et une fois qu'il se connecte entrer EOF (Unix ^D, Windows ^Z), puis mettre chaque----BEGIN CERT...
à-----END CERT...
bloc dans un autre fichier et de l'exécuteropenssl x509 -noout -subject -issuer -startdate -enddate
sur chacun dans l'ordre.À résoudre: si c'est le problème, il ne semble pas être un moyen pour l'éteindre directement, sauf en désactivant tous cert contrôle (et donc de perdre une partie de la sécurité de SSL), mais en y ajoutant le serveur de l'entité cert à votre truststore doit fonctionner car Java n'est pas de vérifier la chaîne. (Vous n'avez pas besoin de supprimer ce qui existe déjà, il suffit d'utiliser un alias qui n'est pas déjà en cours d'utilisation.) Bonne chance.