Назад | Перейти на главную страницу

Несколько хранилищ ключей Java

Я создал пару ключей, используя следующую команду:

"%JAVA_HOME%\bin\keytool" -genkeypair -keysize 2048 -alias tomcat -keyalg RSA -sigalg SHA256withRSA

Я заметил, что есть хранилище ключей в папке jdk / lib / security и другое хранилище ключей в папке jre / lib / security. Я предположил, что в одном из них будет храниться только что созданная пара ключей. Пара ключей была создана в хранилище ключей по умолчанию, которое было создано в каталоге вошедших в систему пользователей.

Мой первый вопрос: почему хранилище ключей по умолчанию находится в каталоге пользователей? Это кажется странным. Могу ли я переместить это хранилище ключей?

Мой второй вопрос: почему так много хранилищ ключей?

Мой последний вопрос: поскольку моя пара ключей - единственный ключ в хранилище по умолчанию, следует ли мне переместить / скопировать его в другое место? Мне нужно, чтобы он был подписан ICA, так что это не кажется правильным.

Java перезаписывает хранилища ключей по умолчанию при каждом обновлении (ну, в большинстве случаев он устанавливается в новом месте и стирает предыдущее), поэтому каждый раз, когда вы обновляете свои пакеты, он удалял любой закрытый ключ, созданный пользователем (поскольку обновление могло также содержат изменения в доверенных хранилищах по умолчанию для удаления ненадежных центров сертификации и т. д.), поэтому по умолчанию (и наиболее разумный способ) хранить вещи в папке пользователя. Таким образом, он исключается из обновлений. Кроме того, было бы проблемой безопасности, если бы каждый пользователь на одном компьютере мог получить доступ к закрытым ключам любого другого пользователя или манипулировать хранилищем доверенных сертификатов по умолчанию, чтобы разрешить настраиваемый CA.

Сертификаты Windows ведут себя аналогичным образом: по умолчанию отображается личное хранилище для текущего пользователя. Новые закрытые ключи или доверенные сертификаты повлияют только на текущего пользователя, но машина по-прежнему будет иметь значения по умолчанию, с которыми была поставлена ​​Windows (и каждое обновление будет изменять эти значения по умолчанию, как новый ЦС или ненадежные).

Действия пользователя не должны влиять на других пользователей того же компьютера.

Что касается JRE и JDK, то первый предназначен для running среды (то есть для стандартного использования приложений), тогда как последняя предназначена для development и имеет разные потребности. Серверу приложений потребуется JDK, так как он должен «компилировать» страницы, например *.jsp и тому подобное на лету. JDK включает в себя собственную JRE, поэтому у него есть собственная копия всего, что JRE нужно для работы. Поскольку вам может потребоваться обеспечить поддержку клиентов (пользователей) иначе, чем для сервера (то есть JRE и JDK могут использовать разные версии), совместное использование общих частей может помешать.

Вы можете изменить хранилище ключей (имя и местоположение) с помощью -keystore file.jks в той же команде, которую вы ввели, но вам нужно будет ссылаться на тот же файл в любой другой команде или конфигурации, чтобы Java могла использовать то же хранилище ключей. Как вы назвали псевдоним tomcat, Я предполагаю, что вы будете использовать его в качестве хранилища ключей для сервера приложений, поэтому в файле server.xml (или catalina.xml) вам нужно будет настроить местоположение хранилища ключей.

Хранилища ключей для сервера должны находиться в каталоге с ограниченным доступом (доступным для чтения только пользователю, с которым работает сервер), например /etc/ssl/ и тому подобное.

Что касается содержимого самого файла, поскольку вам нужно, чтобы он был подписан, сначала нужно создать самозаверяющую пару ключей (как и вы), а затем создать CSR (запрос на подпись сертификата) для отправки в ЦС. После этого вы должны импортировать всю цепочку (только что подписанный сертификат и цепочку сертификатов вашего CA) в тот же псевдоним в том же хранилище ключей. Это по-прежнему будет одна запись в хранилище ключей, но под этим псевдонимом будет несколько сертификатов (и закрытый ключ).

Если вашему серверу не нужно подключаться к другому серверу, это хранилище ключей не должно содержать никаких других сертификатов. И даже если это необходимо, вместо этого у вас должно быть отдельное хранилище доверенных сертификатов (второе хранилище ключей, но только с CA, как и файл cacerts) (или полагаться на хранилище доверенных сертификатов JRE по умолчанию, или даже включать CA в то же хранилище ключей).