Wie finde ich heraus, welchen Keystore meine JVM verwendet?

125

Ich muss ein Zertifikat in meinen JVM-Keystore importieren. Ich benutze folgendes:

keytool -import -alias daldap -file somecert.cer

Also müsste ich wahrscheinlich meinen Anruf in etwas ändern wie:

keytool -import -alias daldap -file somecert.cer -keystore cacerts storepass changeit
jini
quelle
1
Sie müssen ein Zertifikat in Ihren JVM- Truststore importieren, es sei denn , es handelt sich um eine signierte CSR. In diesem Fall sollten Sie es in Ihren eigenen Keystore importieren , und Sie müssen bereits wissen, wo sich das befindet, sonst hätten Sie das Zertifikat nicht generieren können Schlüsselpaar oder CSR.
Marquis von Lorne

Antworten:

129

Ihr Keystore befindet sich in Ihrem JAVA_HOME---> JRE -->lib---> security--> cacerts. Sie müssen überprüfen, wo Ihr JAVA_HOME konfiguriert ist, möglicherweise an einem dieser Orte.

  1. Computer ---> Erweitert -> Umgebungsvariablen ---> JAVA_HOME

  2. Ihre Server-Start-Batch-Dateien.

In Ihrem Importbefehl -keystore cacerts (geben Sie hier den vollständigen Pfad zur obigen JRE an, anstatt nur cacerts zu sagen).

kosa
quelle
6
/ Library / Java / Home / lib / security / cacerts unter Mac OS X 10.9
Sam Barnum
9
* "JAVA_HOME ---> JRE -> lib ---> security -> cacerts" Beachten Sie das "s" am Ende, nur für zukünftige Leser.
Keir Nellyer
4
Wenn ich also eine neue Version von Java installiere und JAVA_HOME auf ein neues Verzeichnis verweist, treten dann Zertifikatprobleme auf?
Kirill Yunussov
1
@ Murphy: Dies könnte Ihnen helfen stackoverflow.com/questions/5251323/…
kosa
4
Dies ist eher der Trust Store-Standort als der Key Store-Standort, denke ich.
user2001850
35

Keystore-Speicherort

Jeder Keytool-Befehl verfügt über eine -keystoreOption zum Angeben des Namens und des Speicherorts der persistenten Keystore-Datei für den von Keytool verwalteten Keystore. Der Schlüsselspeicher wird standardmäßig in einer Datei gespeichert, die im .keystoreAusgangsverzeichnis des Benutzers benannt ist, wie durch die Systemeigenschaft "user.home" festgelegt. Bei gegebenem Benutzernamen uName wird standardmäßig der Eigenschaftswert "user.home" verwendet

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

Wenn der Benutzername also "cathy" lautet, wird standardmäßig "user.home" verwendet

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
quelle
Ich habe nach dieser Mystery- ~/.keystoreDatei gesucht ! Wenn ich den -keystoreParameter weglasse, kann ich nicht herausfinden, welches Standard-Keystore- keytoolTargeting verwendet wird. Ich suchte cacertsirgendwo anders an der Maschine nach anderen . Ich hatte nicht erwartet, dass Keytool ~/.keystoreim Home-Verzeichnis generiert oder .keystorestattdessen benannt wird cacerts. Sie haben eine Lücke ausgefüllt, die die Java-Leute dokumentieren sollten! Danke dir!
George Pantazes
26

Mac OS X 10.12 mit Java 1.8:

$ JAVA_HOME / jre / lib / security

cd $JAVA_HOME

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

Von dort ist es in:

./jre/lib/security

Ich habe dort einen Cacerts-Keystore.

So geben Sie dies als VM-Option an:

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

Ich sage nicht, dass dies der richtige Weg ist (Warum weiß Java nicht, wie man in JAVA_HOME schaut?), Aber das musste ich tun, damit es funktioniert.

comfytoday
quelle
16

Sie finden es in Ihrem "Home" -Verzeichnis:

Unter Windows 7:

C:\Users\<YOUR_ACCOUNT>\.keystore

Unter Linux (Ubuntu):

/home/<YOUR_ACCOUNT>/.keystore
Evans Y.
quelle
4
Ich habe dieses Verzeichnis nicht unter Windows
Simgineer
1
Ich habe einen Schlüssel ausgeführt, ohne einen Schlüsselspeicher anzugeben, und erwartet, dass er einen im aktuellen Verzeichnis erstellt, aber er hat ihn bei Ihnen zu Hause erstellt, wie Sie sagten. ~ / .keystore Konnte es seit Ewigkeiten nicht finden! :-) Vielen Dank.
Eurospoofer
Lassen Sie mich hinzufügen, dass unter Cygwin der Windows-Pfad verwendet wird, da die Java-Eigenschaft user.homegleich ist, $HOMEDRIVE$HOMEPATHdie von Windows festgelegt wurde, und nicht $HOMEvon Cygwin festgelegt wird, wobei HOMEDRIVE=C:undHOMEPATH=\Users\[YOUR ACCOUNT]
user1708042
13

Das funktioniert bei mir:

#! / bin / bash

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

if keytool - list - keystore $ CACERTS - storepass changeit > / dev / null ; dann  
    echo $ CACERTS
sonst 
    echo 'Cacerts-Datei kann nicht gefunden werden.' > & 2 
    Ausfahrt 1 fi 

Nur für Linux. Mein Solaris hat keinen Readlink. Am Ende habe ich dieses Perl-Skript verwendet:

#! / usr / bin / env perl use strict ; verwenden Warnungen ; benutze Cwd qw ( realpath ); 
$ _ = realpath (( grep {- x && - f } map { "$ _ / keytool" } split ( ':' , $ ENV { PATH })) [ 0 ]); die "Keytool kann nicht gefunden werden", es sei denn , $ _ definiert ; mein $ keytool = $ _ ; drucken


  
  

 "Verwenden von '$ keytool'. \ N" ; 
s / keytool $ / /;
$ _ = realpath ($ _. '../ lib / security / cacerts ');
die "Kann keine Cacerts finden", es sei denn -f $ _;
meine $ cacerts = $ _;
print "Importieren in ' $ cacerts '. \ n";
`$ keytool -list -keystore" $ cacerts "-storepass changeit`;
die "Kann Schlüsselcontainer nicht lesen" außer $? == 0;
Beenden, wenn $ ARGV [0] eq ' - d ';
foreach (@ARGV) {
    mein $ cert = $ _;
    s /\.[^.‹+$//;
    mein $ alias = $ _;
    print "Importieren von ' $ cert ' als ' $ alias '. \ n";
    `keytool -importcert -file" $ cert "-alias" $ alias "-keystore" $ cacerts "-storepass changeit`;
    warn "Zertifikat kann nicht importiert werden: $?" es sei denn $? == 0;
}}
ceving
quelle
6

Wie DimtryB erwähnt hat, befindet sich der Keystore standardmäßig im Benutzerverzeichnis. Wenn Sie jedoch versuchen, die cacertsDatei zu aktualisieren , damit die JVM die Schlüssel auswählen kann, müssen Sie die cacertsDatei unter aktualisieren jre/lib/security. Sie können die Schlüssel auch anzeigen, indem Sie den Befehl ausführen, um festzustellen keytool -list -keystore cacerts, ob Ihr Zertifikat hinzugefügt wurde.

Sharan Rajendran
quelle
Gut zu wissen, dass der Befehl keytool lib/securityautomatisch den richtigen Pfad hinzufügt, wenn nur der relative Name angegeben wird.
Ceving
1
Aber das wird nicht funktionieren -importcert. Der Befehl list zeigt die systemweiten Zertifikate an, der Befehl import generiert jedoch eine neue Datei im aktuellen Verzeichnis.
Ceving
1
updatedb; locate cacertsHilft bei der Suche nach den Installationsorten der Cacerts-Dateien.
Sjas
5

Unter Debian habe ich unter Verwendung der openjdk-Version "1.8.0_212" hier Cacerts gefunden:

 /etc/ssl/certs/java/cacerts

Sicher wäre es praktisch, wenn es einen Standardbefehl gäbe, der diesen Pfad ausdrucken würde.

Patrick Beard
quelle
1

Für mich mit dem offiziellen OpenJDK 12 Docker-Image war der Speicherort des Java-Keystores:

/usr/java/openjdk-12/lib/security/cacerts
jonashackt
quelle
Das ist ein Truststore, kein Keystore.
Marquis von Lorne
1
Erstens: Wenn Sie die Frage sorgfältig lesen (und Ihren eigenen Kommentar), klingt dies eher wie ein Truststore, in den ein Zertifikat importiert werden sollte. Zweitens ist der Unterschied zwischen Truststore und Keystore ziemlich verwirrend - und beide verwenden übrigens den Begriff "Keystore", da sie beide das Format verwenden. Drittens: Wenn Sie sich den Importbefehl ansehen, verwenden keytool -import -file example.crt -alias exampleCA -keystore truststore.jksSie auch den Parameter -keystore... IMHO ziemlich unklar. Und zu guter Letzt: Ich habe genau nach diesem Problem gesucht - und diese Frage gefunden. Vielleicht erwarten andere dasselbe.
Jonashackt
Darüber hinaus beziehen sich alle anderen Antworten auch auf den sogenannten "Truststore", den das JDK zur Validierung verwendet. Haben Sie auch alle anderen Antworten abgelehnt? Ich habe bereits eine positive Bewertung erhalten, daher hat mir bereits jemand mit meiner Antwort geholfen.
Jonashackt
0

Dieses Problem trat bei einem Tomcat auf, der aus einem jre-Verzeichnis ausgeführt wurde, das nach einem automatischen jre-Update (fast vollständig) entfernt wurde, sodass das laufende jre jre ... / lib / security / cacerts nicht mehr finden konnte, da es nicht mehr vorhanden war.

Ein Neustart von Tomcat (nachdem die Konfiguration so geändert wurde, dass sie von einem anderen Speicherort ausgeführt wird) hat das Problem behoben.

Nicolas de Jong
quelle
0

Zusätzlich zu allen obigen Antworten:

Wenn das Aktualisieren der cacerts-Datei im JRE-Verzeichnis nicht hilft, versuchen Sie, sie im JDK zu aktualisieren.

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

VSh
quelle