Как мне узнать, какое хранилище ключей использует моя JVM? - PullRequest
111 голосов
/ 24 января 2012

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

keytool -import -alias daldap -file somecert.cer

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

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

Ответы [ 9 ]

113 голосов
/ 24 января 2012

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

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

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

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

30 голосов
/ 24 января 2012

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

Каждая команда 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
* 1012.*http://docs.oracle.com/javase/1.5/docs/tooldocs/windows/keytool.html
24 голосов
/ 02 ноября 2016

Mac OS X 10.12 с Java 1.8:

$ JAVA_HOME / jre / lib / security

cd $JAVA_HOME

/ Библиотека / Java / JavaVirtualMachines / jdk1.8.0_40.jdk / Содержание /Домой

Оттуда он находится:

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

15 голосов
/ 11 ноября 2013

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

В Windows 7:

C:\Users\<YOUR_ACCOUNT>\.keystore

В Linux (Ubuntu):

/home/<YOUR_ACCOUNT>/.keystore
13 голосов
/ 05 декабря 2012

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

#! /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.У моего соляриса нет ссылки на чтение.В конце концов я использовал этот 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;
}
6 голосов
/ 05 июля 2012

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

0 голосов
/ 25 апреля 2019

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

 /etc/ssl/certs/java/cacerts

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

0 голосов
/ 05 марта 2019

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

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

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

0 голосов
/ 26 октября 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...