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

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

keytool -import -alias daldap -file somecert.cer

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

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

7 ответов

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

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

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

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

Расположение Keystore

Каждая команда 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

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.

Чтобы указать это как параметр VM:

-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?), Но это то, что я должен был сделать, чтобы это заработало.

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

В Windows 7:

C:\Users\<YOUR_ACCOUNT>\.keystore

В Linux (Ubuntu):

/home/<YOUR_ACCOUNT>/.keystore

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

#! / Бен / Баш

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

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

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

#! / usr / bin / env perl
использовать строгое;
использовать предупреждения;
используйте Cwd qw(realpath);
$_ = realpath((grep {-x && -f} map {"$_/keytool"} split(':', $ENV{PATH}))[0]);
die "Не могу найти keytool", если не определено $_;
мой $keytool = $_;
print "Использование '$keytool'.\n";
s/ Keytool$//;
$_ = realpath($_ . '../lib/security/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;
}

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

 /etc/ssl/certs/java/cacerts

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам