
Я создал пару ключей с помощью следующей команды:
"%JAVA_HOME%\bin\keytool" -genkeypair -keysize 2048 -alias tomcat -keyalg RSA -sigalg SHA256withRSA
Я заметил, что в папке jdk/lib/security есть хранилище ключей, а в папке jre/lib/security — еще одно хранилище ключей. Я предположил, что одно из этих хранилищ будет содержать пару ключей, которую я только что создал. Пара ключей была создана в хранилище ключей по умолчанию, которое было создано в каталоге вошедших в систему пользователей.
Мой первый вопрос: почему хранилище ключей по умолчанию находится в каталоге пользователей? Это кажется странным. Могу ли я переместить это хранилище ключей?
Мой второй вопрос: зачем так много хранилищ ключей?
Мой последний вопрос: поскольку моя пара ключей — единственный ключ в хранилище по умолчанию, следует ли мне переместить/скопировать ее куда-то еще? Мне нужно, чтобы она была подписана ICA, поэтому то, что она сама по себе, кажется неправильным.
решение1
Java перезаписывает хранилища ключей по умолчанию при каждом обновлении (ну, в большинстве случаев он устанавливается в новом месте и стирает предыдущее), поэтому каждый раз, когда вы обновляете свои пакеты, он удаляет любой закрытый ключ, созданный пользователем (так как обновление также может содержать изменения в хранилищах доверия по умолчанию для удаления ненадежных CA и т. д.), поэтому по умолчанию (и наиболее разумный способ) — хранить вещи в папке пользователя. Таким образом, он изолируется от обновлений. Кроме того, было бы проблемой безопасности, если бы каждый пользователь на той же машине мог получить доступ к закрытым ключам любого другого пользователя или манипулировать хранилищем доверия по умолчанию, чтобы разрешить использование собственного CA.
Сертификаты Windows ведут себя похожим образом: по умолчанию отображается персональное хранилище для текущего пользователя. Новые закрытые ключи или доверенные сертификаты повлияют только на текущего пользователя, но машина по-прежнему будет иметь значения по умолчанию, с которыми поставлялась Windows (и каждое обновление будет изменять эти значения по умолчанию, как и новый CA или недоверенные).
Действия пользователя не должны влиять на других пользователей на том же компьютере.
Что касается 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) в тот же псевдоним в том же хранилище ключей. Это все равно будет одна запись в хранилище ключей, но в ней будет несколько сертификатов (и закрытый ключ) под этим псевдонимом.
Если вашему серверу не нужно подключаться к другому серверу, то это хранилище ключей не должно содержать никаких других сертификатов. И даже если это необходимо, у вас должно быть отдельное хранилище доверенных ключей (второе хранилище ключей, но только с CA в нем, как в файле cacerts) (или полагаться на хранилище доверенных ключей по умолчанию JRE, или даже включить CA в то же хранилище ключей).