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

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

Мне было интересно понять, как / когда вы различаете магазины при использовании 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 и т. Д.?

5 ответов

Решение

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

javax.net.ssl.keyStore а также javax.net.ssl.trustStore параметры являются параметрами по умолчанию, используемыми для построения KeyManagerс и 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):

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

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

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

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

Чтобы объяснить в общем случае использования / цели или обычного человека:

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

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

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

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

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

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

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

Примечание: я не говорю здесь об аутентификации клиента на стороне сервера. Если сервер также хочет выполнить проверку подлинности клиента, он также поддерживает хранилище 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

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

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

Это шаги для создания Truststore на вашем локальном компьютере с помощью Keytool. Шаги по созданию доверенного хранилища для URL-адреса на вашем локальном компьютере.

1) Нажмите URL-адрес в браузере, используя хром

2) Найдите значок "i" слева от URL-адреса в Chrome и щелкните его.

3) Проверьте параметр сертификата и щелкните его, откроется диалоговое окно.

4) проверьте вкладку "путь к сертификату" на количество сертификатов, доступных для создания хранилища доверенных сертификатов.

5) Пойдите в "details" tab -> click"Copy to File" -> Give the path and the name for the certificate вы хотите творить.

6) Проверьте, есть ли у него родительские сертификаты, и следуйте пункту "5".

7) После создания всех сертификатов откройте командную строку и перейдите по пути, по которому вы создали сертификаты.

8) предоставьте следующую команду Keytool, чтобы добавить сертификаты и создать хранилище доверенных сертификатов.

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9) Введите команду keytool для всех сертификатов и добавьте их в хранилище доверенных сертификатов.

    keytool -list -v -keystore cacerts

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

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

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

Другие вопросы по тегам