Jak dowiedzieć się, jakiego magazynu kluczy używa moja maszyna JVM?

125

Muszę zaimportować certyfikat do mojego magazynu kluczy JVM. Używam następujących:

keytool -import -alias daldap -file somecert.cer

więc prawdopodobnie musiałbym zmienić moje wywołanie na coś takiego:

keytool -import -alias daldap -file somecert.cer -keystore cacerts storepass changeit
jini
źródło
1
Musisz zaimportować certyfikat do magazynu zaufanych certyfikatów JVM , chyba że jest to podpisany CSR, w takim przypadku powinieneś importować go do własnego magazynu kluczy i musisz już wiedzieć, gdzie to jest, w przeciwnym razie nie byłbyś w stanie wygenerować keypair lub CSR.
Markiz Lorne

Odpowiedzi:

129

Twój magazyn kluczy będzie w Twoim JAVA_HOME---> JRE -->lib---> security--> cacerts. Musisz sprawdzić, gdzie jest skonfigurowany Twój JAVA_HOME, prawdopodobnie jedno z tych miejsc,

  1. Komputer ---> Zaawansowane -> Zmienne środowiskowe ---> JAVA_HOME

  2. Twoje pliki wsadowe uruchamiania serwera.

W poleceniu importu -keystore cacerts (podaj tutaj pełną ścieżkę do powyższego środowiska JRE zamiast po prostu mówić cacerts).

kosa
źródło
6
/ Library / Java / Home / lib / security / cacerts w systemie Mac OS X 10.9
Sam Barnum
9
* "JAVA_HOME ---> JRE -> lib ---> security -> cacerts" Zanotuj "s" na końcu, tylko dla przyszłych czytelników.
Keir Nellyer
4
Jeśli więc zainstaluję nową wersję Javy, a JAVA_HOME wskazuje na nowy katalog, czy będę mieć problemy z certyfikatem?
Kirill Yunussov
1
@Murphy: To może pomóc ci stackoverflow.com/questions/5251323/ ...
kosa
4
Myślę, że jest to lokalizacja magazynu zaufania, a nie kluczowa lokalizacja magazynu.
user2001850
35

Lokalizacja magazynu kluczy

Każda komenda keytool ma -keystoreopcję określania nazwy i lokalizacji trwałego pliku kluczy dla magazynu kluczy zarządzanego przez keytool. Magazyn kluczy jest domyślnie przechowywany w pliku o nazwie .keystorew katalogu osobistym użytkownika, zgodnie z właściwością systemową „user.home”. Biorąc pod uwagę nazwę użytkownika uName, wartość właściwości „user.home” ma wartość domyślną

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

Tak więc, jeśli nazwa użytkownika to „cathy”, domyślną wartością jest „user.home”

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
źródło
Szukałem tego tajemniczego ~/.keystorepliku! Jeśli zostawiłem ten -keystoreparametr, nie mogłem ustalić, które domyślne keytoolkierowanie na magazyn kluczy . Ciągle szukałem innego cacertsgdzieś na maszynie. Nie spodziewałem się, że keytool będzie generowany ~/.keystorew katalogu domowym, ani że zostanie nazwany .keystorezamiast cacerts. Wypełniłeś puste miejsce, które ludzie Java powinni udokumentować! Dziękuję Ci!
George Pantazes
26

Mac OS X 10.12 z Javą 1.8:

$ JAVA_HOME / jre / lib / security

cd $JAVA_HOME

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

Stamtąd jest w:

./jre/lib/security

Mam tam magazyn kluczy Cacerts.

Aby określić to jako opcję maszyny wirtualnej:

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

Nie mówię, że to poprawny sposób (dlaczego java nie wie, jak szukać w JAVA_HOME?), Ale to właśnie musiałem zrobić, aby działał.

comfytoday
źródło
16

Możesz go znaleźć w swoim katalogu „Home”:

W systemie Windows 7:

C:\Users\<YOUR_ACCOUNT>\.keystore

W systemie Linux (Ubuntu):

/home/<YOUR_ACCOUNT>/.keystore
Evans Y.
źródło
4
nie mam tego katalogu w
systemie
1
Zrobiłem -keygen bez określania magazynu kluczy, spodziewając się, że utworzy go w bieżącym katalogu, ale utworzył go w moim domu, jak powiedziałeś. ~ / .keystore Nie mogłem go znaleźć od wieków! :-) Dzięki.
Eurospoofer
dodam, że pod cygwinem używana jest ścieżka windows, ponieważ własność java user.homejest równa $HOMEDRIVE$HOMEPATHustawionej przez windows a nie $HOMEustawionej przez cygwin gdzie HOMEDRIVE=C:iHOMEPATH=\Users\[YOUR ACCOUNT]
user1708042
13

To działa dla mnie:

#! / bin / bash

CACERTS = $ (readlink -e $ (dirname $ (readlink -e $ (które narzędzie kluczy))) /../ lib / security / cacerts)= $ ( readlink - e $ ( dirname $ ( readlink - e $ ( which keytool ))) /../ lib / security / cacerts )

if keytool -list -keystore $ CACERTS -storepass changeit> / dev / null; następnieif keytool - lista - magazyn kluczy $ CACERTS - storepass changeit > / dev / null ; następnie  
    echo $ CACERTS
jeszczejeszcze
    echo „Nie można znaleźć pliku cacerts”. > & 2„Nie można znaleźć pliku cacerts”. > & 2 
    wyjście 11
fifi

Tylko dla Linuksa. Mój Solaris nie ma linku do odczytu. W końcu użyłem tego skryptu Perl:

#! / usr / bin / env perl
użyj ścisłego;użyj ścisłego ;
używaj ostrzeżeń;używaj ostrzeżeń ;
użyj Cwd qw (realpath);użyj Cwd qw ( realpath ); 
$ _ = realpath ((grep {-x && -f} map {"$ _ / keytool"} split (':', $ ENV {PATH})) [0]);= realpath (( grep {- x && - f } map { "$ _ / keytool" } split ( ':' , $ ENV { PATH })) [ 0 ]); 
die "Nie można znaleźć narzędzia", ​​chyba że zdefiniowano $ _;die "Nie można znaleźć keytool", chyba że zdefiniowano $ _ ;  
my $ keytool = $ _;my $ keytool = $ _ ;
print "Używanie '$ keytool'. \ n";print "Używanie '$ keytool'. \ n" ; 
s / keytool $ //;/ keytool $ / /;
$ _ = realpath ($ _. '../lib/security/cacerts');lib / security / cacerts ');
die "Nie można znaleźć cacerts", chyba że -f $ _;
moje $ cacerts = $ _;
print "Importowanie do '$ cacerts'. \ n";$ cacerts '. \ n ";
`$ keytool -list -keystore" $ cacerts "-storepass changeit`;
die "Nie można odczytać kontenera kluczy", chyba że $? == 0;
zakończ, jeśli $ ARGV [0] eq '-d';- d ';
foreach (@ARGV) {
    mój $ cert = $ _;
    s /\.[^.]+$//;
    mój $ alias = $ _;
    print "Importowanie '$ cert' jako '$ alias'. \ n";$ cert 'jako' $ alias '. \ n ";
    `keytool -importcert -file" $ cert "-alias" $ alias "-keystore" $ cacerts "-storepass changeit`;
    warn "Nie można zaimportować certyfikatu: $?" chyba że $? == 0;
}
ceving
źródło
6

Jak wspomniano w DimtryB, magazyn kluczy domyślnie znajduje się w katalogu użytkownika. Ale jeśli próbujesz zaktualizować cacertsplik, aby maszyna JVM mogła wybrać klucze, będziesz musiał zaktualizować cacertsplik pod jre/lib/security. Możesz również wyświetlić klucze, wykonując polecenie, keytool -list -keystore cacertsaby sprawdzić, czy Twój certyfikat został dodany.

Sharan Rajendran
źródło
Dobrze wiedzieć, że polecenie keytool lib/securityautomatycznie dodaje poprawną ścieżkę, jeśli podana jest tylko nazwa względna.
Ceving
1
Ale to nie zadziała -importcert. Polecenie list wyświetla certyfikaty systemowe, ale polecenie importu generuje nowy plik w bieżącym katalogu.
Ceving
1
updatedb; locate cacertspomaga znaleźć lokalizacje instalacji plików cacerts.
sjas
5

W Debianie, używając wersji openjdk "1.8.0_212", znalazłem cacerts tutaj:

 /etc/ssl/certs/java/cacerts

Oczywiście byłoby przydatne, gdyby istniało standardowe polecenie, które wydrukowałoby tę ścieżkę.

Patrick Beard
źródło
1

Dla mnie, używając oficjalnego obrazu OpenJDK 12 Docker , lokalizacja magazynu kluczy Java była następująca:

/usr/java/openjdk-12/lib/security/cacerts
jonashackt
źródło
To truststore, a nie keystore.
Markiz Lorne
1
Po pierwsze: jeśli uważnie przeczytasz pytanie (i swój własny komentarz), brzmi to bardziej jak Truststore, do którego należy zaimportować certyfikat. Po drugie, różnica między Truststore i Keystore jest dość dezorientująca - obie używają terminu „Keystore” przy okazji, ponieważ używają obu formatów. Po trzecie: jeśli spojrzysz na polecenie importu, keytool -import -file example.crt -alias exampleCA -keystore truststore.jksużyjesz również parametru -keystore... dość niejasne IMHO. I wreszcie: szukałem dokładnie tego problemu - i znalazłem to pytanie. Może inni wyrażają to samo.
jonashackt
Ponadto wszystkie inne odpowiedzi odnoszą się również do tak zwanego „Truststore”, którego JDK używa do walidacji. Czy więc odrzuciłeś również wszystkie inne odpowiedzi? Otrzymałem już głos za, więc jest już ktoś, kogo moja odpowiedź pomogła.
jonashackt
0

Napotkaliśmy ten problem na serwerze Tomcat działającym z katalogu jre, który został (prawie całkowicie) usunięty po automatycznej aktualizacji środowiska jre, tak że działające środowisko jre nie mogło już znaleźć jre ... / lib / security / cacerts, ponieważ już nie istniało.

Ponowne uruchomienie Tomcata (po zmianie konfiguracji na uruchamianie z innej lokalizacji jre) rozwiązało problem.

Nicolas de Jong
źródło
0

Oprócz wszystkich powyższych odpowiedzi:

Jeśli aktualizacja pliku cacerts w katalogu JRE nie pomaga, spróbuj zaktualizować go w JDK.

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

VSh
źródło