Как узнать, какое хранилище использует моя 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, возможно, одно из этих мест,

  • Компьютер --- > Дополнительно → Переменные окружения --- > 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) устранил проблему.