Trust Store vs Key Store - создание с помощью keytool

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

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

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

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

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

-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"), я могу видеть сертификат под доверенными сертификатами (но не в разделе хранилища ключей). Конкретный сертификат, который я импортирую, имеет только открытый ключ, и я намерен использовать его для отправки материала через SSL-соединение с Бобом (но, возможно, это лучше всего оставить для другого вопроса!).

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

Ответ 1

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

Параметры javax.net.ssl.keyStore и javax.net.ssl.trustStore являются параметрами по умолчанию, используемыми для сборки KeyManager и TrustManager (соответственно), а затем используются для создания 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. Обратите внимание, что хотя значение доверия по умолчанию магазина, для хранилища ключей нет ни одного.)

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

Ответ 2

Объяснить общий способ использования/цели или непрофессионала:

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

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

Во время установления связи SSL,

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

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

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

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

Примечание. Я ничего не говорю о проверке подлинности клиента на стороне сервера. Если сервер также хочет выполнить проверку подлинности клиента, тогда сервер также поддерживает trustStore для проверки клиента.

Ответ 3

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

Ответ 4

Хранилище ключей используется сервером для хранения личных ключей, а хранилище доверенных сертификатов используется сторонним клиентом для хранения открытых ключей, предоставленных сервером для доступа. Я сделал это в моем производственном приложении. Ниже приведены шаги для генерации 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

Ответ 5

Проще говоря:

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

Хранилище ключей необходимо, когда вы настраиваете серверную сторону по протоколу SSL, оно используется для хранения сертификата идентификации сервера, который сервер будет предоставлять клиенту при подключении, в то время как настройка доверительного хранилища на стороне клиента должна содержать, чтобы соединение работало. Если вы используете браузер для подключения к любому веб-сайту по протоколу SSL, он проверяет сертификат, представленный сервером, в своем хранилище доверенных сертификатов.

Ответ 6

keystore просто хранит секретные ключи, а магазины доверия хранят открытые ключи. Вы захотите создать сертификат java для связи SSL. Вы можете использовать команду keygen в Windows, это, вероятно, будет самым простым решением.