Pourquoi dois-je obtenir une poignée de main à l'échec (Java SSL)
Je me connecte à un service web via HTTPS. J'ai fait tout ce que je pense est nécessaire pour le faire fonctionner, mais à la fin j'obtiens une poignée de main échec.
J'ai découvert que comme un nouvel utilisateur, je ne peux pas poster plus de 2 liens en raison de "la protection anti-spam" - merci beaucoup stackoverflow...de toute façon, voici un lien vers un pastebin post avec tous les liens explicités...donc quand j'écris "link#1" ici, il est fait référence à ces liens: http://pastebin.com/y4zGNRC7
- J'ai vérifié le même comportement à l'aide de client http (GET sur l'URL du service) et fait appel au service web via un CXF proxy
- Je suis à la fois le fichier de clés et truststore - j'ai essayé les deux "dans le code ( lien n ° 1 ) et en définissant les propriétés du système - Système, par exemple.setProperty("javax.net.le protocole ssl.keyStore", "mykeystore.jks");
- SSL de débogage est activé ( javax.net.debug=tous )
- SSL debug laisse échapper le contenu de deux magasin de clés et truststore (c'est à dire ressemble à java "sait") - lien#2
- semble que il ya certains de communication client-serveur en cours, mais ensuite il se bloque pour une raison quelconque lien#3
- J'ai réussi à connecter au serveur en utilisant le client et certificats d'autorité de certification à la fois dans un navigateur (Chrome) et à l'aide d'openssl s_client
- wireshark montre moins de client-serveur de parler de java ( lien n ° 4 ) alors, par exemple à partir de Chrome ( lien n ° 5 )
Une autre chose étrange est que je semble être d'obtenir le même comportement lorsque j'ai mis le fichier de clés et lorsque je n'ai pas (la seule différence est que quand je fais le keystore contenu imprimé dans la console, mais c'est tout).
J'ai essayé de googler le problème et j'ai vu de nombreux des postes similaires ici sur stackoverflow, mais rien n'y fit.
J'ai essayé de changer la version du protocole ("TLSv1", "SSLv3", même l'étrange v2 Bonjour).
Toute aide serait appréciée - peut-être qu'il y a une chose que j'ai ont peut-être oublié...je suis désespérée ici...
Merci
PS je suis en cours d'exécution java 1.6 mise à jour 30 sur Fedora Core 15 (64bit)
"j'ai découvert que comme un nouvel utilisateur, je ne peux pas poster plus de 2 liens en raison de "la protection anti-spam" - merci beaucoup stackoverflow". Si vous utilisez beaucoup ce site, vous vous rendrez compte que c'est DONC le spam des mesures de protection sont une BONNE CHOSE.
Et sur le sujet de liens, il est considéré comme une mauvaise forme de post pastebin liens et similaires parce qu'ils s'évaporent vite faire de la question inintelligibles pour les futurs lecteurs.
Voici la stacktrace pastebin.com/dbXPYRmS
Ouais désolé je me suis un peu agité, mais je comprends comment il aide à lutter contre les spam... les liens Externes sont de l'omi, une belle façon de "ne pas polluer" la question avec trop de détails....plus n'est-il pas une limite de caractères? Pastebin vous permet de choisir la "date d'expiration" de vos messages...et "jamais" semble une bonne option 😉 Ce serait bien si stackoverflow lui-même fourni une telle fonction.
OriginalL'auteur Jakub Hlavatý | 2012-02-12
Vous devez vous connecter pour publier un commentaire.
Le problème était que, même si le fichier de clés et truststore a été fixé, java a décidé de ne pas envoyer le certificat du client pour le serveur. La raison pour cela était le fait que le serveur demande d'un certificat signé par le RootCA autorité, mais le client certificat est signé par un SubCA autorité (qui est délivré par le RootCA).
À l'origine, le fichier de clés ne contient que le client cert et le truststore la SubCA cert.
J'ai ensuite essayé d'ajouter l'SubCA cert pour le fichier de clés trop, mais en java, tout simplement ignorés.
Si cela résout le hanshake échec mystère, mais n'est pas mon problème.
J'ai créé une autre question pour que...soupir 🙁
pourquoi ne pas java envoyer le certificat du client lors de la connexion SSL?
OriginalL'auteur Jakub Hlavatý
De ne pas fournir suffisamment d'informations, mais je devine votre client truststore n'est pas correctement configuré. Le truststore contient les certificats qui sont utilisés pour signer d'autres certificats, et doit inclure le certificat racine(s) pour le serveur et le client cert chaînes. Le client de magasin de clés contient le client SSL certificat et la clé privée.
Il semble que le client keystore est chargé, mais le certificat du client n'est pas présentée sur le serveur et c'est pourquoi la négociation échoue. Le journal affiche un vide client de la chaîne de certification. Je n'ai aucune idée de pourquoi 🙁
OriginalL'auteur James K Polk
Je pense que le magasin de confiance ne contenant pas de l'autorité de certification est la plus probable. Vous pouvez utiliser le Java
keytool
pour importer le certificat pour le site dans lecacerts
fichier en faisant quelque chose comme:Par défaut le fichier cacerts mot de passe du fichier de clés est
changeit
. Lecacerts
fichier est généralement sousjre/lib/security
répertoire.Notez qu'avec le protocole SSL de débogage sur le contenu des deux le truststore et keystore est imprimée dans la console. Aussi le certificat du client et la CA cert (pas la racine) suffit pour que cela fonctionne dans un navigateur.
J'ai essayé de vérifier le contenu des magasins avec l'utilitaire keytool et tout semble OK. J'ai même essayé d'installer les deux magasins par l'intermédiaire de la ligne de commande au démarrage (c'est à dire
-Djavax.net.ssl.keyStore=
) en vain...OriginalL'auteur Michael