Я создал пару ключей, используя следующую команду:
"%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 в то же хранилище ключей).