Comment importer un nouveau certificat Java CA sans utiliser l'utilitaire de ligne de commande keytool?

StackOverflow https://stackoverflow.com/questions/1650596

  •  22-07-2019
  •  | 
  •  

Question

Résumé: comment installer un nouveau certificat racine dans Java à l'aide de code Java?

Nous avons une application de bureau qui accède à divers services Web. Récemment, l'un d'entre eux a remplacé son certificat SSL par un autre signé par Trustwave. Alors que les certificats SSL de Trustwave sont acceptés par les navigateurs Internet classiques, Java ne semble pas être fourni avec les certificats racine prérequis et nous avons perdu l'accès au service Web donné avec le message d'erreur suivant:

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

Nous avons obtenu un sursis temporaire en persuadant le fournisseur de revenir à Verisign, mais nous devons être prêts quand ils reviendront. J'ai donc besoin de notre logiciel de bureau pour installer automatiquement le certificat racine Trustwave en fonction des besoins. Nos clients ne sont pas assez au fait des technologies pour utiliser la commande keytool et je préférerais ne pas le script car cela me semble une solution fragile (implémentations séparées pour Mac et PC, lutte contre les restrictions d’exécution de Vista, difficulté à trouver le bon JRE dans lequel installer. , etc.).

J'imagine que keytool utilise Java en interne. Quelle commande puis-je utiliser dans Java pour répliquer les fonctionnalités de keytool et installer le certificat racine par programme?

Était-ce utile?

La solution

Je ne sais pas si cela est possible, mais vous pouvez implémenter votre propre TrustManager pour autoriser cette connexion ou cette autorité de certification. Ici sont les bases.

Autres conseils

IMHO, Sun n'a pas exposé keytool via une API, principalement pour empêcher les développeurs de modifier l'ensemble des autorités de certification approuvées. Je peux très bien imaginer des attaquants exploitant ce code pour insérer leurs propres certificats racine dans le magasin de données de confiance, compromettant ainsi le modèle même du magasin de données de confiance.

En fait, si vous examinez le code source de la classe KeyTool (package sun.security.tools), il est non seulement final, il dispose également d'un constructeur privé qui empêche tout appelant de créer une instance de la classe KeyTool à partir de code. . KeyTool a une méthode principale, faisant de la ligne de commande (et donc d’un utilisateur OS) la seule manière d’initialiser et de communiquer avec KeyTool.

Les seules approches (simplistes) restantes seraient:

  • Initialisez keytool en tant que processus de l'application et transmettez des arguments de ligne de commande pour installer le certificat de l'autorité de certification racine. Cela seul est une mauvaise idée, et je recommanderais d'informer l'utilisateur de ce qui se passe.
  • Évitez d'utiliser keytool et donnez plutôt aux utilisateurs des instructions sur l'installation de l'autorité de certification racine à l'aide de Keyman ou KeyTool IUI . Ne parlant que pour moi ici, je préfère ce dernier.

Vous pouvez toujours appeler KeyTool en tant que processus Runtime.exec (...) .

Si vous souhaitez installer le certificat sur le magasin de clés de la racine approuvée sur la machine de bureau, vous devez obtenir une autorisation pour le faire. C'est la même chose avec keytool , vous avez besoin d'un mot de passe pour accéder au magasin de clés de la racine approuvée. Si vous voulez être rapide, vous pouvez

  • écrit le certificat dans un fichier, un flux d'octets ou autre chose
  • importation à l'aide de la classe KeyTool ( sun.security.tools.KeyTool )

Mais à mon humble avis, si le certificat n’est pas valide, il n’est pas digne de confiance. Je dirais qu'il y a une bonne raison à cela.

Solution de ligne de commande. Sur Mac, la maison Java est / Bibliothèque / Java / Accueil. Essayez:

$ sudo -i
# cd /Library/Java/Home
# keytool -import -trustcacerts -alias CAName -file CA.crt -keystore lib/security/cacerts

Remplacez CAName par le nom de votre autorité de certification et CA.crt par un chemin d'accès à votre fichier de certificat (PEM fonctionne). Il vous demandera un mot de passe pour le magasin de clés. Le mot de passe par défaut est donné dans l'article lié.

Je devais le faire pour l'un des certificats d'AC de RapidSSL.

Sun a publié ce code pour créer une version mise à jour de votre fichier cacerts en fonction de tout hôte cible exécutant https avec tous les certificats:

https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

Vos nouveaux comptes seront nommés jssecacerts dans le répertoire en cours. Copiez simplement ce nouveau fichier sur votre fichier jre / lib / security / cacerts.

Je ne fais aucun commentaire sur la sécurité de votre nouveau fichier cacerts.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top