Как мне узнать, какое хранилище ключей использует моя 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, возможно, в одном из этих мест,
Компьютер ---> Дополнительно -> Переменные среды ---> JAVA_HOME
Пакетные файлы запуска вашего сервера.
В вашей команде импорта -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