Как узнать, какое хранилище использует моя JVM?
Мне нужно импортировать сертификат в хранилище ключей JVM. Я использую следующее:
keytool -import -alias daldap -file somecert.cer
поэтому мне нужно будет, вероятно, изменить мой вызов на что-то вроде:
keytool -import -alias daldap -file somecert.cer -keystore cacerts –storepass changeit
Ответы
Ответ 1
Ваше хранилище ключей будет в вашем JAVA_HOME---> JRE -->lib---> security--> cacerts
. Вам нужно проверить, где настроен JAVA_HOME, возможно, одно из этих мест,
В вашей команде import -keystore cacerts (дайте полный путь к вышеуказанной JRE здесь, а не просто говоря cacerts).
Ответ 2
Местоположение 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
Ответ 3
Это работает для меня:
#! /bin/bash
CACERTS=$(readlink -e $(dirname $(readlink -e $(which keytool)))/../lib/security/cacerts)
if keytool -list -keystore $CACERTS -storepass changeit > /dev/null ; then
echo $CACERTS
else
echo 'Can not find cacerts file.' >&2
exit 1
fi
Только для Linux. У моей Solaris нет readlink. В конце я использовал этот Perl- Script:
#! /usr/bin/env perl
use strict;
use warnings;
use Cwd qw(realpath);
$_ = realpath((grep {-x && -f} map {"$_/keytool"} split(':', $ENV{PATH}))[0]);
die "Can not find keytool" unless defined $_;
my $keytool = $_;
print "Using '$keytool'.\n";
s/keytool$//;
$_ = realpath($_ . '../lib/security/cacerts');
die "Can not find cacerts" unless -f $_;
my $cacerts = $_;
print "Importing into '$cacerts'.\n";
`$keytool -list -keystore "$cacerts" -storepass changeit`;
die "Can not read key container" unless $? == 0;
exit if $ARGV[0] eq '-d';
foreach (@ARGV) {
my $cert = $_;
s/\.[^.]+$//;
my $alias = $_;
print "Importing '$cert' as '$alias'.\n";
`keytool -importcert -file "$cert" -alias "$alias" -keystore "$cacerts" -storepass changeit`;
warn "Can not import certificate: $?" unless $? == 0;
}
Ответ 4
Вы можете найти его в своем "Домашнем" каталоге:
В окнах 7:
C:\User\[YOUR ACCOUNT]\.keystore
В Linux (Ubuntu):
/home/[YOUR ACCOUNT]/.keystore
Ответ 5
Mac OS X 10.12 с Java 1.8:
$JAVA_HOME/JRE/Library/безопасность
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?), но это то, что я должен был сделать, чтобы заставить его работать.
Ответ 6
Как упоминалось в DimtryB, по умолчанию хранилище ключей находится под пользовательским каталогом. Но если вы пытаетесь обновить файл cacerts
, чтобы JVM мог выбрать ключи, вам придется обновить файл cacerts
в разделе jre/lib/security
. Вы также можете просмотреть ключи, выполнив команду keytool -list -keystore cacerts
, чтобы узнать, добавлен ли ваш сертификат.
Ответ 7
Мы столкнулись с этой проблемой на Tomcat, запущенной из jre-каталога, который был (почти полностью) удален после автоматического обновления jre, так что работающий jre больше не мог найти jre.../lib/security/cacerts, потому что он не дольше.
Перезапуск Tomcat (после изменения конфигурации для запуска из другого местоположения jre) устранил проблему.