Как узнать, какое хранилище ключей использует моя JVM?


125

Мне нужно импортировать сертификат в хранилище ключей JVM. Я использую следующее:

keytool -import -alias daldap -file somecert.cer

поэтому мне, вероятно, нужно будет изменить свой вызов на что-то вроде:

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

1
Вам необходимо импортировать сертификат в ваше хранилище доверенных сертификатов JVM , если это не подписанный CSR, и в этом случае вы должны импортировать его в свое собственное хранилище ключей, и вы уже должны знать, где он находится, иначе вы не смогли бы сгенерировать keypair или CSR.
Маркиз Лорн

Ответы:


129

Ваше хранилище ключей будет в вашем JAVA_HOME---> JRE -->lib---> security--> cacerts. Вам нужно проверить, где настроен ваш JAVA_HOME, возможно, в одном из этих мест,

  1. Компьютер ---> Дополнительно -> Переменные среды ---> JAVA_HOME

  2. Пакетные файлы запуска вашего сервера.

В вашей команде импорта -keystore cacerts (укажите здесь полный путь к указанной выше JRE вместо того, чтобы просто говорить cacerts).


6
/ Библиотека / Java / Главная / lib / security / cacerts в Mac OS X 10.9
Сэм Барнум,

9
* "JAVA_HOME ---> JRE -> lib ---> security -> cacerts" Обратите внимание на "s" в конце, только для будущих читателей.
Кейр Неллиер

4
Итак, если я установлю новую версию Java, а JAVA_HOME указывает на новый каталог, возникнут ли у меня проблемы с сертификатом?
Кирилл Юнусов

1
@Murphy: это может помочь вам stackoverflow.com/questions/5251323/…
kosa

4
Я думаю, это скорее доверенный магазин, чем ключевой.
user2001850

35

Расположение хранилища ключей

Каждая команда keytool имеет -keystoreвозможность указать имя и расположение файла постоянного хранилища ключей для хранилища ключей, управляемого keytool. Хранилище ключей по умолчанию хранится в файле с именем .keystoreв домашнем каталоге пользователя, как определено системным свойством "user.home". Учитывая имя пользователя uName, значение свойства user.home по умолчанию равно

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

Таким образом, если имя пользователя - «cathy», «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


Я искал этот загадочный ~/.keystoreфайл! Если бы я оставил этот -keystoreпараметр, я не смог бы понять, на какое хранилище ключей по умолчанию нацелено keytool. Я продолжал искать других cacertsгде-то еще на машине. Я не ожидал, что keytool будет сгенерирован ~/.keystoreв домашнем каталоге или будет назван .keystoreвместо cacerts. Вы заполнили бланк, который разработчики Java должны задокументировать! Спасибо!
Джордж Пантазес

26

Mac OS X 10.12 с Java 1.8:

$ JAVA_HOME / JRE / Библиотека / безопасность

cd $JAVA_HOME

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

Оттуда это:

./jre/lib/security

У меня там есть хранилище ключей cacerts.

Чтобы указать это как параметр виртуальной машины:

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

Я не говорю, что это правильный способ (почему java не знает, что нужно искать в JAVA_HOME?), Но это то, что мне нужно было сделать, чтобы он заработал.


16

Вы можете найти его в своем «Домашнем» каталоге:

В Windows 7:

C:\Users\<YOUR_ACCOUNT>\.keystore

В Linux (Ubuntu):

/home/<YOUR_ACCOUNT>/.keystore

4
у меня нет этого каталога в Windows
simgineer

1
Я выполнил -keygen без указания хранилища ключей, ожидая, что он создаст его в текущем каталоге, но он создал его у меня дома, как вы сказали. ~ / .keystore Давно не мог найти! :-) Спасибо.
Eurospoofer

позвольте мне добавить, что в cygwin используется путь к Windows, поскольку свойство java user.homeравно $HOMEDRIVE$HOMEPATHустановленному окнами, а не $HOMEустановлено cygwin, где HOMEDRIVE=C:иHOMEPATH=\Users\[YOUR ACCOUNT]
user1708042

13

Это работает для меня:

#! / Бен / Баш

САСЕРТЫ = $ ( readlink - e $ ( dirname $ ( readlink - e $ ( which keytool ))) /../ lib / security / cacerts )

если keytool - list - keystore $ CACERTS - storepass changeit > / dev / null ; затем  
    echo $ CACERTS
else 
    echo "Не удается найти файл cacerts." > & 2 
    выход 1 fi 

Только для Linux. У моего Solaris нет ссылки для чтения. В итоге я использовал Perl-Script:

#! / usr / bin / env perl use strict ; использовать предупреждения ; используйте Cwd qw ( realpath ); 
$ _ = realpath (( grep {- x && - f } map { "$ _ / keytool" } split ( ':' , $ ENV { PATH })) [


   0 ]); die "Не могу найти keytool"
   если не определено $ _ ; мой $ keytool = $ _ ; Распечатать

 "Используя '$ keytool'. \ N" ; 
s / keytool $ / /;
$ _ = realpath ($ _. '../ lib / security / cacerts ');
die "Не могу найти cacerts", если только -f $ _;
мой $ cacerts = $ _;
print "Импорт в ' $ cacerts '. \ n";
`$ keytool -list -keystore" $ cacerts "-storepass changeit`;
die "Не могу прочитать контейнер ключей" разве что $? == 0;
выйти, если $ ARGV [0] eq ' - d ';
foreach (@ARGV) {
    мой $ cert = $ _;
    с /\.[^.]+$//;
    мой $ псевдоним = $ _;
    print "Импорт ' $ cert ' как ' $ alias '. \ n";
    `keytool -importcert -file" $ cert "-alias" $ alias "-keystore" $ cacerts "-storepass changeit`;
    предупреждать "Невозможно импортировать сертификат: $?" разве что $? == 0;
}

6

Как упоминал DimtryB, по умолчанию хранилище ключей находится в каталоге пользователя. Но если вы пытаетесь обновить cacertsфайл, чтобы JVM могла выбирать ключи, вам придется обновить cacertsфайл под jre/lib/security. Вы также можете просмотреть ключи, выполнив команду, keytool -list -keystore cacertsчтобы узнать, добавлен ли ваш сертификат.


Приятно знать, что команда keytool lib/securityавтоматически добавляет правильный путь, если дано только относительное имя.
керамика

1
Но это не сработает -importcert. Команда list показывает общесистемные сертификаты, но команда импорта создает новый файл в текущем каталоге.
событие 05

1
updatedb; locate cacertsпомогает найти места для установки файлов cacerts.
sjas

5

В Debian, используя openjdk версии "1.8.0_212", я обнаружил здесь cacerts:

 /etc/ssl/certs/java/cacerts

Конечно, было бы удобно, если бы существовала стандартная команда, которая распечатывала бы этот путь.


1

Для меня, использующего официальный образ OpenJDK 12 Docker , хранилище ключей Java располагалось следующим образом:

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

Это доверенный склад, а не склад ключей.
Marquis of Lorne

1
Во-первых: если вы внимательно прочитали вопрос (и свой собственный комментарий), это больше похоже на Truststore, куда следует импортировать сертификат. Во-вторых, разница между Truststore и Keystore довольно дезориентирует - и оба используют термин «Keystore», кстати, поскольку они используют оба формата. В-третьих: если вы посмотрите на команду импорта, keytool -import -file example.crt -alias exampleCA -keystore truststore.jksвы также используете параметр -keystore... довольно непонятно ИМХО. И последнее, но не менее важное: я искал именно эту проблему - и нашел этот вопрос. Может быть, у других будет то же самое.
jonashackt

Кроме того, все другие ответы также относятся к так называемому «Truststore», который JDK использует для проверки. Вы также проголосовали против всех остальных ответов? Я уже получил положительный голос, так что мой ответ уже кое-кому помог.
jonashackt

0

Мы столкнулись с этой проблемой на Tomcat, запущенном из каталога jre, который был (почти полностью) удален после автоматического обновления jre, поэтому запущенный jre больше не мог найти jre ... / lib / security / cacerts, потому что он больше не существовал.

Перезапуск Tomcat (после изменения конфигурации для запуска из другого местоположения jre) устранил проблему.


0

В дополнение ко всем ответам выше:

Если обновление файла cacerts в каталоге JRE не помогает, попробуйте обновить его в JDK.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.