web-dev-qa-db-fra.com

Pourquoi ai-je un échec de prise de contact (Java SSL)

Je me connecte à un service Web via HTTPS. J'ai fait tout ce que je pense être nécessaire pour le faire fonctionner, mais à la fin, j'arrive à une poignée de main.

J'ai découvert qu'en tant que 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 article Pastebin avec tous les liens énoncés ... alors quand J'écris "lien # 1" ici c'est une référence à ces liens: http://Pastebin.com/y4zGNRC7

  • J'ai vérifié le même comportement en utilisant HttpClient (GET sur l'URL du service) et en appelant le service Web via un proxy CXF
  • Je configure à la fois le magasin de clés et le magasin de clés de confiance - j'ai essayé à la fois la méthode "en code" (lien # 1) et la définition des propriétés du système - c'est-à-dire System.setProperty ("javax.net.ssl.keyStore", "mykeystore.jks" );
  • Le débogage SSL est activé (javax.net.debug = all)
  • Le débogage SSL efface le contenu du magasin de clés et du magasin de clés de confiance (c'est-à-dire ressemble à Java "les connaît") - lien # 2
  • semble qu'il y ait une communication client-serveur en cours, mais il se bloque pour une raison lien # 3
  • J'ai réussi à me connecter au serveur en utilisant les certificats client et CA à la fois dans un navigateur (Chrome) et en utilisant openssl s_client
  • wireshark montre moins de conversations client-serveur de Java (lien # 4) puis par exemple de Chrome (lien # 5)

Une autre chose étrange est que je semble avoir le même comportement lorsque je configure le fichier de clés et quand je ne le fais pas (la seule différence est que lorsque je fais le contenu du fichier de clés est imprimé dans le console, mais c'est tout).

J'ai essayé de googler le problème et j'ai vu de nombreux messages similaires ici sur stackoverflow, mais rien n'y fait. J'ai essayé de changer la version du protocole ("TLSv1", "SSLv3", même le bizarre v2 Hello). Toute aide serait appréciée - peut-être y a-t-il une chose fondamentale que j'aurais pu ignorer ... Je suis désespéré ici ... Thanx

PS J'exécute Java 1.6 update 30 sur Fedora Core 15 (64bit)

11
Jakub Hlavatý

Le problème était que même si le magasin de clés et le magasin de clés de confiance étaient définis, Java a décidé de ne pas envoyer le certificat client au serveur. La raison en était le fait que le serveur avait demandé un certificat signé par l'autorité RootCA, mais le certificat client est signé par une autorité SubCA (qui est émise par RootCA).

À l'origine, le magasin de clés contenait uniquement le certificat client et le magasin de clés certifiées SubCA. J'ai ensuite essayé d'ajouter le certificat SubCA au magasin de clés aussi, mais Java je l'ai simplement ignoré.

Donc, cela résout le mystère de l'échec du hanshake, mais pas mon problème.

J'ai créé une question distincte pour ça ... soupir : --- (pourquoi Java n'envoie pas le certificat client pendant la prise de contact SSL?

5
Jakub Hlavatý

Je pense que le magasin de confiance ne contenant pas l'autorité de certification est le problème le plus probable. Vous pouvez utiliser le Java keytool pour importer le certificat du site dans le fichier cacerts en faisant quelque chose comme:

keytool -keystore pathtocacerts -import -trustcacerts -v -alias aliasName -file root.crt

Le mot de passe par défaut du magasin de clés cacerts est changeit. Le fichier cacerts se trouve généralement sous jre/lib/security répertoire.

3
Michael

Vous ne fournissez pas suffisamment d'informations, mais je suppose que votre client truststore n'est pas correctement configuré. Le magasin de clés de confiance contient les certificats de confiance utilisés pour signer d'autres certificats et doit inclure le ou les certificats racine pour les chaînes de certificats serveur et client. Le magasin de clés client contient le certificat SSL client et la clé privée.