Comment savoir quel keystore utilise ma JVM?

125

J'ai besoin d'importer un certificat dans mon keystore JVM. J'utilise ce qui suit:

keytool -import -alias daldap -file somecert.cer

je devrais donc probablement changer mon appel en quelque chose comme:

keytool -import -alias daldap -file somecert.cer -keystore cacerts storepass changeit
jini
la source
1
Vous devez importer un certificat dans votre truststore JVM , à moins qu'il ne s'agisse d' un CSR signé, auquel cas vous devriez l'importer dans votre propre keystore, et vous devez déjà savoir où il se trouve, sinon vous n'auriez pas pu générer le keypair ou le CSR.
Marquis of Lorne

Réponses:

129

Votre keystore sera dans votre fichier JAVA_HOME---> JRE -->lib---> security--> cacerts. Vous devez vérifier où votre JAVA_HOME est configuré, éventuellement l'un de ces endroits,

  1. Ordinateur ---> Avancé -> Variables d'environnement ---> JAVA_HOME

  2. Les fichiers de commandes de démarrage de votre serveur.

Dans votre commande d'importation -keystore cacerts (indiquez ici le chemin complet du JRE ci-dessus au lieu de simplement dire cacerts).

kosa
la source
6
/ Bibliothèque / Java / Accueil / lib / security / cacerts sur Mac OS X 10.9
Sam Barnum
9
* "JAVA_HOME ---> JRE -> lib ---> security -> cacerts" Notez le "s" à la fin, juste pour les futurs lecteurs.
Keir Nellyer
4
Donc, si j'installe une nouvelle version de Java et que JAVA_HOME pointe vers un nouveau répertoire, vais-je avoir des problèmes de certificat?
Kirill Yunussov
1
@Murphy: Cela pourrait vous aider stackoverflow.com/questions/5251323/…
kosa
4
c'est l'emplacement du magasin de confiance plutôt que l'emplacement du magasin clé, je pense.
user2001850
35

Emplacement du keystore

Chaque commande keytool a une -keystoreoption pour spécifier le nom et l'emplacement du fichier de keystore persistant pour le keystore géré par keytool. Le keystore est par défaut stocké dans un fichier nommé .keystoredans le répertoire de base de l'utilisateur, tel que déterminé par la propriété système "user.home". Étant donné le nom d'utilisateur uName, la valeur de la propriété "user.home" est par défaut

C:\Users\uName on Windows 7 systems
C:\Winnt\Profiles\uName on multi-user Windows NT systems
C:\Windows\Profiles\uName on multi-user Windows 95 systems
C:\Windows on single-user Windows 95 systems

Ainsi, si le nom d'utilisateur est "cathy", "user.home" prend la valeur par défaut

C:\Users\cathy on Windows 7 systems
C:\Winnt\Profiles\cathy on multi-user Windows NT systems
C:\Windows\Profiles\cathy on multi-user Windows 95 systems

http://docs.oracle.com/javase/1.5/docs/tooldocs/windows/keytool.html

dbrin
la source
J'ai cherché ce ~/.keystorefichier mystère ! Si j'ai omis le -keystoreparamètre, je ne pouvais pas déterminer le keytoolciblage par défaut du keystore . J'ai continué à chercher cacertsailleurs sur la machine. Je ne m'attendais pas à ce que keytool soit généré ~/.keystoredans le répertoire personnel, ni à ce qu'il soit nommé à la .keystoreplace de cacerts. Vous avez rempli un espace que les gens de Java devraient documenter! Je vous remercie!
George Pantazes
26

Mac OS X 10.12 avec Java 1.8:

$ JAVA_HOME / jre / lib / sécurité

cd $JAVA_HOME

/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home

De là, c'est dans:

./jre/lib/security

J'ai un keystore cacerts là-dedans.

Pour spécifier ceci comme option VM:

-Djavax.net.ssl.trustStore=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit

Je ne dis pas que c'est la bonne façon (pourquoi java ne sait-il pas regarder dans JAVA_HOME?), Mais c'est ce que j'ai dû faire pour que cela fonctionne.

confortable aujourd'hui
la source
16

Vous pouvez le trouver dans votre répertoire "Accueil":

Sous Windows 7:

C:\Users\<YOUR_ACCOUNT>\.keystore

Sous Linux (Ubuntu):

/home/<YOUR_ACCOUNT>/.keystore
Evans Y.
la source
4
je n'ai pas ce répertoire sous windows
simgineer
1
J'ai fait un -keygen sans spécifier de keystore, en m'attendant à ce qu'il en crée un dans le répertoire courant, mais il l'a créé chez moi, comme vous l'avez dit. ~ / .keystore Impossible de le trouver depuis des lustres! :-) Merci.
Eurospoofer
laissez-moi ajouter que sous cygwin le chemin windows est utilisé puisque la propriété java user.homeest égale à $HOMEDRIVE$HOMEPATHset par windows et non sur $HOMEset par cygwin où HOMEDRIVE=C:etHOMEPATH=\Users\[YOUR ACCOUNT]
user1708042
13

Cela fonctionne pour moi:

#! / bin / bash

CACERTS = $ ( readlink - e $ ( dirname $ ( readlink - e $ ( quel keytool ))) /../ lib / security / cacerts )

if keytool - list - keystore $ CACERTS - storepass changeit > / dev / null ;  puis
    echo $ CACERTS
else 
    echo 'Impossible de trouver le fichier cacerts.' > & 2 
    sortie 1 fi 

Uniquement pour Linux. Mon Solaris n'a pas de lien de lecture. À la fin, j'ai utilisé ce Perl-Script:

#! / usr / bin / env perl use strict ; utiliser des avertissements

 ; utilisez Cwd qw ( realpath ); 
$ _ = chemin réel (( grep {- x && - f } carte { "$ _ / keytool" } split ( ':' , $ ENV { CHEMIN })) [ 0 ]); die "Impossible de trouver keytool" sauf si défini $ _ ; my "Utilisation de '$ keytool'. \ n"
  
  
 $ keytool = $ _ ; impression
  ; 
s / keytool $ / /;
$ _ = chemin réel ($ _. '../ lib / security / cacerts ');
die "Impossible de trouver les cacerts" sauf si -f $ _;
mes $ cacerts = $ _;
print "Importation dans ' $ cacerts '. \ n";
`$ keytool -list -keystore" $ cacerts "-storepass changeit`;
die "Impossible de lire le conteneur de clé" à moins que $? == 0;
exit si $ ARGV [0] eq ' - d ';
foreach (@ARGV) {
    mon $ cert = $ _;
    s /\.[^.edral+$//;
    mon $ alias = $ _;
    print "Importation de ' $ cert ' en tant que ' $ alias '. \ n";
    `keytool -importcert -file" $ cert "-alias" $ alias "-keystore" $ cacerts "-storepass changeit`;
    warn "Impossible d'importer le certificat: $?" à moins que $? == 0;
}
plafond
la source
6

Comme DimtryB l'a mentionné, par défaut, le keystore se trouve sous le répertoire utilisateur. Mais si vous essayez de mettre à jour le cacertsfichier, afin que la JVM puisse choisir les clés, vous devrez mettre à jour le cacertsfichier sous jre/lib/security. Vous pouvez également afficher les clés en exécutant la commande keytool -list -keystore cacertspour voir si votre certificat est ajouté.

Sharan Rajendran
la source
C'est bien de savoir que la commande keytool ajoute lib/securityautomatiquement le chemin correct si on ne lui donne que le nom relatif.
ceving
1
Mais cela ne fonctionnera pas -importcert. La commande list affiche les certificats à l'échelle du système mais la commande d'importation génère un nouveau fichier dans le répertoire courant.
ceving
1
updatedb; locate cacerts aide à trouver où se trouvent les emplacements d'installation des fichiers cacerts.
sjas
5

Sur Debian, en utilisant la version openjdk "1.8.0_212", j'ai trouvé des cacerts ici:

 /etc/ssl/certs/java/cacerts

Bien sûr, ce serait pratique s'il y avait une commande standard qui imprimerait ce chemin.

Patrick Beard
la source
1

Pour moi, en utilisant l'image officielle OpenJDK 12 Docker , l'emplacement du keystore Java était:

/usr/java/openjdk-12/lib/security/cacerts
Jonashackt
la source
C'est un truststore, pas un keystore.
Marquis of Lorne
1
Premièrement: si vous lisez attentivement la question (et votre propre commentaire), cela ressemble plus à un Truststore, où un certificat doit être importé. Deuxièmement, la différence entre Truststore et Keystore est assez désorientante - et les deux utilisent le terme "Keystore" btw, car ils utilisent tous les deux le format. Troisièmement: Si vous regardez la commande d'importation, keytool -import -file example.crt -alias exampleCA -keystore truststore.jksvous utilisez également le paramètre -keystore... assez peu clair à mon humble avis. Et le dernier mais non le moindre: je cherchais ce problème exact - et j'ai trouvé que c'était une question. Peut-être que d'autres font la même chose.
jonashackt
De plus, toutes les autres réponses font également référence au soi-disant "Truststore" que le JDK utilise pour valider. Alors, avez-vous également voté contre toutes les autres réponses? J'ai déjà reçu un vote positif, donc il y a déjà quelqu'un que ma réponse a aidé.
jonashackt
0

Nous avons rencontré ce problème sur un Tomcat fonctionnant à partir d'un répertoire jre qui a été (presque entièrement) supprimé après une mise à jour automatique de jre, de sorte que le jre en cours d'exécution ne pouvait plus trouver jre ... / lib / security / cacerts car il n'existait plus.

Le redémarrage de Tomcat (après avoir modifié la configuration pour s'exécuter à partir d'un autre emplacement jre) a résolu le problème.

Nicolas de Jong
la source
0

En plus de toutes les réponses ci-dessus:

Si la mise à jour du fichier cacerts dans le répertoire JRE n'aide pas, essayez de le mettre à jour dans JDK.

C: \ Program Files \ Java \ jdk1.8.0_192 \ jre \ lib \ security

VSh
la source