Вопрос-ответ

Trust Store vs Key Store - creating with keytool

Хранилище доверия против хранилища ключей - создание с помощью keytool

Я понимаю, что хранилище ключей обычно содержит закрытые / открытые ключи, а хранилище доверия хранит только открытые ключи (и представляет список доверенных сторон, с которыми вы собираетесь взаимодействовать). Что ж, это мое первое предположение, так что, если это неверно, я, вероятно, не очень хорошо начал...

Однако мне было интересно понять, как / когда вы различаете хранилища при использовании keytool.

Итак, до сих пор я создавал хранилище ключей с помощью

keytool -import -alias bob -file bob.crt -keystore keystore.ks

который создает мой файл keystore.ks. Я отвечаю yes на вопрос, доверяю ли я bob, но мне неясно, создал ли это файл keystore или файл truststore? Я могу настроить свое приложение на использование файла в любом из этих двух вариантов.

-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x

и с помощью System.setProperty( "javax.net.debug", "ssl") set я могу видеть сертификат в разделе доверенные сертификаты (но не в разделе хранилище ключей). Конкретный сертификат, который я импортирую, имеет только открытый ключ, и я намерен использовать его для отправки данных по SSL-соединению Bob (но, возможно, это лучше оставить для другого вопроса!).

Мы были бы весьма признательны за любые указания или пояснения. Является ли результат keytool одинаковым, что бы вы ни импортировали, и его простое соглашение гласит, что одно является хранилищем ключей, а другое - хранилищем доверия? Какова взаимосвязь при использовании SSL и т.д.?

Переведено автоматически
Ответ 1

Терминология действительно немного запутанная, но оба javax.net.ssl.keyStore и javax.net.ssl.trustStore используются для указания, какие хранилища ключей использовать, для двух разных целей. Хранилища ключей бывают разных форматов и даже не обязательно являются файлами (см. Этот вопрос), а keytool это просто инструмент для выполнения различных операций с ними (импорт / экспорт / список / ...).

Параметры javax.net.ssl.keyStore и javax.net.ssl.trustStore - это параметры по умолчанию, используемые для создания KeyManagers и TrustManagers (соответственно), которые затем используются для создания SSLContext, который по сути содержит настройки SSL / TLS для использования при установлении соединения SSL / TLS через SSLSocketFactory или SSLEngine. Эти системные свойства - это как раз то место, откуда берутся значения по умолчанию, которые затем используются SSLContext.getDefault(), например, само по себе используется SSLSocketFactory.getDefault(). (Все это можно настроить через API в ряде мест, если вы не хотите использовать значения по умолчанию и эти конкретные SSLContextы для заданной цели.)

Разница между KeyManager и TrustManager (и, следовательно, между javax.net.ssl.keyStore и javax.net.ssl.trustStore) заключается в следующем (цитируется из руководства по JSSE ref):


TrustManager: определяет, следует ли доверять учетным данным удаленной аутентификации (и, следовательно, соединению).


KeyManager: определяет, какие учетные данные для аутентификации отправлять на удаленный хост.


(Доступны другие параметры, и их значения по умолчанию описаны в руководстве по JSSE ref. Обратите внимание, что, хотя для хранилища доверия существует значение по умолчанию, для хранилища ключей его нет.)

По сути, хранилище ключей в javax.net.ssl.keyStore предназначено для хранения ваших закрытых ключей и сертификатов, тогда как javax.net.ssl.trustStore предназначено для хранения сертификатов CA, которым вы готовы доверять, когда удаленная сторона предоставляет свой сертификат. В некоторых случаях это может быть одно и то же хранилище, хотя часто лучше использовать разные хранилища (особенно когда они основаны на файлах).

Ответ 2

Объяснить обычным способом использования / назначения или непрофессионалом:


Хранилище доверия: используется для хранения сертификатов доверенных объектов. Процесс может поддерживать хранилище сертификатов всех доверенных сторон, которым он доверяет.


Хранилище ключей: используется для хранения ключей сервера (как открытых, так и закрытых) вместе с подписанным сертификатом.


Во время подтверждения SSL,


  1. Клиент пытается получить доступ к https://



  2. Таким образом, Сервер отвечает, предоставляя SSL-сертификат (который хранится в его хранилище ключей)



  3. Теперь клиент получает SSL-сертификат и проверяет его через trustStore (т. е. В trustStore клиента уже есть заранее определенный набор сертификатов, которым он доверяет.). Что-то вроде: Могу ли я доверять этому серверу? Это тот же сервер, с которым я пытаюсь поговорить? Никаких атак со стороны посредников?



  4. Как только клиент проверяет, что он взаимодействует с сервером, которому он доверяет, тогда SSL-связь может осуществляться по общему секретному ключу.



Примечание: Я здесь ничего не говорю об аутентификации клиента на стороне сервера. Если сервер тоже хочет выполнить аутентификацию клиента, то сервер также поддерживает хранилище доверия для проверки клиента. Тогда он становится взаимным TLS.

Ответ 3

Хранилище ключей используется сервером для хранения закрытых ключей, а Truststore используется сторонним клиентом для хранения открытых ключей, предоставляемых сервером для доступа. Я сделал это в своем производственном приложении. Ниже приведены шаги по созданию сертификатов java для связи по протоколу SSL:


  1. Сгенерируйте сертификат с помощью команды keygen в Windows:

keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950


  1. Самосертифицируйте сертификат:

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950


  1. Экспорт сертификата в папку:

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer


  1. Импорт сертификата в клиентское хранилище доверия:

keytool -importcert -alias mycert -file mycert.cer -keystore truststore

Ответ 4

Нет разницы между файлами keystore и truststore. Оба являются файлами в проприетарном формате JKS. Разница заключается в использовании: насколько мне известно, Java будет использовать только хранилище, на которое ссылается -Djavax.net.ssl.trustStore системное свойство для поиска сертификатов, которым можно доверять, при создании SSL-соединений. То же самое для ключей и -Djavax.net.ssl.keyStore. Но теоретически нормально использовать один и тот же файл для хранилищ доверия и ключей.

java