Comment puis-je utiliser les différents certificats sur des connexions?

Un module que je suis en ajoutant à notre grande application Java a pour converser avec une autre société du SSL site sécurisé. Le problème est que le site utilise un certificat auto-signé. J'ai une copie du certificat pour vérifier que je ne suis pas de la rencontre d'un man-in-the-middle attack, et j'ai besoin d'incorporer ce certificat dans notre code de telle façon que la connexion au serveur sera couronnée de succès.

Voici le code de base:

void sendRequest(String dataPacket) {
  String urlStr = "https://host.example.com/";
  URL url = new URL(urlStr);
  HttpURLConnection conn = (HttpURLConnection)url.openConnection();
  conn.setMethod("POST");
  conn.setRequestProperty("Content-Length", data.length());
  conn.setDoOutput(true);
  OutputStreamWriter o = new OutputStreamWriter(conn.getOutputStream());
  o.write(data);
  o.flush();
}

Sans aucune manipulation supplémentaire mis en place pour le certificat auto-signé, ce meurt à l'âge de conn.getOutputStream() avec l'exception suivante:

Exception in thread "main" 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
....
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
....
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Idéalement, mon code doit enseigner Java à accepter cette un certificat auto-signé, pour cette une tache dans l'application, et nulle part ailleurs.

Je sais que je peux importer le certificat dans la JRE de l'autorité de certification magasin, et qui va permettre à Java à l'accepter. Ce n'est pas une approche que je veux prendre si je peux aider; il semble très invasive à faire sur l'ensemble des machines de nos clients pour un module, ils ne peuvent pas utiliser; il aurait une incidence sur toutes les autres applications Java à l'aide de la même JRE, et je n'aime pas que même si les chances de toute autre application Java jamais accès à ce site est nul. Il n'est également pas une opération triviale: sur UNIX, je dois obtenir des droits d'accès pour modifier le JRE de cette façon.

J'ai aussi vu que je peux créer un TrustManager instance qui n'a coutume de les vérifier. Il semble que je pourrais peut-être même créer un TrustManager que les délégués à la vraie TrustManager dans tous les cas, à l'exception de ce seul certificat. Mais il semble que ce TrustManager est installé à l'échelle mondiale, et je présume aurait une incidence sur toutes les autres connexions à partir de notre application, et qui ne sent pas assez bonne pour moi, soit.

Quel est le meilleur, standard, ou le meilleur moyen de mettre en place une application Java pour accepter un certificat auto-signé? Puis-je accomplir tous les objectifs que j'ai à l'esprit ci-dessus, ou vais-je avoir à faire des compromis? Est-il une option impliquant les fichiers et les répertoires et les paramètres de configuration, et peu-à-peu de code?

  • petit, de travail correctif: rgagnon.com/javadetails/...
  • s'il vous plaît ne pas suggérer cette page. Il désactive la vérification de confiance. Vous allez non seulement accepter le certificat auto-signé que vous voulez, vous êtes aussi à accepter un certificat d'un MITM attaquant va vous présenter avec.
InformationsquelleAutor skiphoppy | 2009-05-13