Trust Store vs Key Store - создание с помощью keytool - PullRequest
229 голосов
/ 14 июня 2011

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

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

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

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

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

-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 и т. Д.

Ответы [ 6 ]

312 голосов
/ 14 июня 2011

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

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

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

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

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

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

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

42 голосов
/ 16 февраля 2018

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

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

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

Во время SSL-рукопожатия

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

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

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

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

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

23 голосов
/ 14 июня 2011

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

20 голосов
/ 22 декабря 2016

Keystore используется сервером для хранения личных ключей, а 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

0 голосов
/ 21 мая 2019

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

Keystore используется для хранения ваших учетных данных (сервер или клиент), в то время как truststore используется для хранения других учетных данных (сертификаты от CA).

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

0 голосов
/ 19 декабря 2017

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

...