Come faccio a sapere quale keystore utilizza la mia JVM?


125

Devo importare un certificato nel mio keystore JVM. Sto usando il seguente:

keytool -import -alias daldap -file somecert.cer

quindi dovrei probabilmente cambiare la mia chiamata in qualcosa del tipo:

keytool -import -alias daldap -file somecert.cer -keystore cacerts storepass changeit

1
È necessario importare un certificato nel vostro JVM truststore, a meno che il suo un CSR, nel qual caso si dovrebbe essere importare nella tua firma proprio chiavi, e si deve già sapere dove sia, altrimenti non sarebbe stato in grado di generare la coppia di chiavi o CSR.
Marchese di Lorne,

Risposte:


129

Il tuo keystore sarà nel tuo JAVA_HOME---> JRE -->lib---> security--> cacerts. Devi controllare dove è configurato il tuo JAVA_HOME, possibilmente uno di questi posti,

  1. Computer ---> Avanzate -> Variabili d'ambiente ---> JAVA_HOME

  2. I file batch di avvio del server.

Nel comando di importazione -castore di chiavi (fornire qui il percorso completo per il JRE sopra invece di dire semplicemente cacert).


6
/ Libreria / Java / Home / lib / security / cacerts su Mac OS X 10.9
Sam Barnum

9
* "JAVA_HOME ---> JRE -> lib ---> security -> cacerts" Nota la "s" alla fine, solo per eventuali lettori futuri.
Keir Nellyer,

4
Quindi, se installo una nuova versione di Java e JAVA_HOME punta a una nuova directory, avrò problemi di certificazione?
Kirill Yunussov,

1
@Murphy: questo potrebbe aiutarti a stackoverflow.com/questions/5251323/…
kosa,

4
questa è la posizione del negozio di fiducia piuttosto che la posizione del negozio chiave credo.
user2001850

35

Posizione del keystore

Ogni comando keytool ha -keystoreun'opzione per specificare il nome e il percorso del file persistente keystore per il keystore gestito da keytool. Il keystore è memorizzato per impostazione predefinita in un file denominato .keystorenella home directory dell'utente, come determinato dalla proprietà di sistema "user.home". Dato il nome utente uName, il valore della proprietà "user.home" è impostato su

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

Pertanto, se il nome utente è "cathy", "user.home" viene impostato automaticamente

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


Ho cercato questo ~/.keystorefile misterioso ! Se avessi lasciato il -keystoreparametro, non sarei riuscito a capire quale keytooltargeting per archivio di chiavi predefinito . Continuavo a cercare cacertsaltrove altrove sulla macchina. Non mi aspettavo che keytool ~/.keystorevenisse generato nella home directory, né che fosse chiamato .keystoreinvece di cacerts. Hai riempito uno spazio vuoto che la gente di Java dovrebbe documentare! Grazie!
George Pantazes,

26

Mac OS X 10.12 con Java 1.8:

$ JAVA_HOME / jre / lib / security

cd $JAVA_HOME

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

Da lì è in:

./jre/lib/security

Ho un keystore cacerts lì dentro.

Per specificare questo come opzione VM:

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

Non sto dicendo che questo è il modo corretto (Perché Java non sa guardare all'interno di JAVA_HOME?), Ma questo è quello che dovevo fare per farlo funzionare.


16

Puoi trovarlo nella tua directory "Home":

Su Windows 7:

C:\Users\<YOUR_ACCOUNT>\.keystore

Su Linux (Ubuntu):

/home/<YOUR_ACCOUNT>/.keystore

4
non ho questa directory su windows
simgineer

1
Ho fatto un -keygen senza specificare un keystore, aspettandomi che ne creasse uno nella directory corrente, ma lo ha creato nella mia casa come hai detto. ~ / .keystore Non l'ho trovato per secoli! :-) Grazie.
Eurospoofer,

lasciatemi aggiungere che sotto cygwin viene utilizzato il percorso di windows poiché la proprietà java user.homeè uguale a $HOMEDRIVE$HOMEPATHimpostata da windows e non su $HOMEimpostata da cygwin dove HOMEDRIVE=C:eHOMEPATH=\Users\[YOUR ACCOUNT]
user1708042

13

Questo funziona per me:

#! / Bin / bash

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

if keytool - list - keystore $ CACERTS - storepass changeit > / dev / null ; poi  
    echo $ CACERTS
else 
    echo 'Impossibile trovare il file cacerts.' > & 2 
    uscita 1 fi 

Solo per Linux. Il mio Solaris non ha link di lettura. Alla fine ho usato questo Perl-Script:

#! / usr / bin / env perl use strict ; usare avvertenze ; usa Cwd qw ( realpath ); 
$ _ = realpath (( grep {- x && - f } map { "$ _ / keytool" } split ( ':' , $ ENV { PATH })) [ 0 ]); die "Impossibile trovare keytool" se non definito $ _ ; my $ keytool = $ _ ; Stampa


  
  

 "Uso di '$ keytool'. \ N" ; 
s / keytool $ / /;
$ _ = realpath ($ _. '../ lib / security / cacerts ');
muore "Impossibile trovare i dolci" a meno che -f $ _;
my $ cacerts = $ _;
stampa "Importazione in ' $ cacerts '. \ n";
`$ keytool -list -keystore" $ cacerts "-storepass changeit`;
die "Impossibile leggere il contenitore di chiavi" a meno che $? == 0;
esce se $ ARGV [0] eq ' - d ';
foreach (@ARGV) {
    my $ cert = $ _;
    s /\.[^.]+$//;
    my $ alias = $ _;
    stampa "Importazione di ' $ cert ' come ' $ alias '. \ n";
    `keytool -importcert -file" $ cert "-alias" $ alias "-keystore" $ cacerts "-storepass changeit`;
    avvisa "Impossibile importare il certificato: $?" a meno che $? == 0;
}

6

Come indicato da DimtryB, per impostazione predefinita il keystore si trova nella directory dell'utente. Ma se stai cercando di aggiornare il cacertsfile, in modo che JVM possa scegliere le chiavi, dovrai aggiornare il cacertsfile in jre/lib/security. Puoi anche visualizzare le chiavi eseguendo il comando keytool -list -keystore cacertsper vedere se il tuo certificato è stato aggiunto.


Bello sapere che il comando keytool aggiunge lib/securityautomaticamente il percorso corretto se viene dato solo il nome relativo.
ceving

1
Ma questo non funzionerà -importcert. Il comando list mostra i certificati a livello di sistema ma il comando import genera un nuovo file nella directory corrente.
ceving

1
updatedb; locate cacertsaiuta a trovare dove si trovano le posizioni di installazione dei file di cacerts.
sjas,

5

Su Debian, usando la versione openjdk "1.8.0_212", ho trovato i cookie qui:

 /etc/ssl/certs/java/cacerts

Sarebbe sicuramente utile se ci fosse un comando standard che stamperebbe questo percorso.


1

Per me usando l' immagine Docker ufficiale OpenJDK 12 , la posizione del keystore Java era:

/usr/java/openjdk-12/lib/security/cacerts

Questo è un truststore, non un keystore.
Marchese di Lorne,

1
Primo: se leggi attentamente la domanda (e il tuo commento), sembra più un Truststore, dove un certificato dovrebbe essere importato. In secondo luogo, la differenza tra Truststore e Keystore è piuttosto disorientante - ed entrambi usano il termine "Keystore" tra l'altro, poiché usano entrambi il formato. Terzo: se dai un'occhiata al comando import, keytool -import -file example.crt -alias exampleCA -keystore truststore.jksusi anche il parametro -keystore... IMHO abbastanza poco chiaro. E ultimo ma non meno importante: stavo cercando quell'esatto problema e ho trovato quella domanda. Forse altri espongono lo stesso.
jonashackt,

Inoltre, tutte le altre risposte si riferiscono anche al cosiddetto "Truststore" che JDK utilizza per convalidare. Quindi hai anche declassato tutte le altre risposte? Ho già ricevuto un voto, quindi c'è già qualcuno a cui la mia risposta mi ha aiutato.
jonashackt,

0

Abbiamo riscontrato questo problema su un Tomcat in esecuzione da una directory jre che era (quasi completamente) rimossa dopo un aggiornamento jre automatico, in modo che il jre in esecuzione non potesse più trovare jre ... / lib / security / cacerts perché non esisteva più.

Il riavvio di Tomcat (dopo aver modificato la configurazione per l'esecuzione dalla diversa posizione jre) ha risolto il problema.


0

Oltre a tutte le risposte sopra:

Se l'aggiornamento del file cacerts nella directory JRE non aiuta, prova ad aggiornarlo in JDK.

C: \ Programmi \ Java \ jdk1.8.0_192 \ jre \ lib \ security

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.