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

249

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

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

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

Тоби
источник
Я не уверен, что вы подразумеваете под «Конкретным сертификатом, который я импортирую, является только открытый ключ»: это просто открытый ключ (т.е. не сертификат) или сертификат не-CA?
Бруно
хм, не уверен. Я экспортировал из моего браузера в виде файла PEM. Это помогает?
Тоби
Если он экспортируется из браузера, это, вероятно, сертификат. Это сертификат сервера (с CN или subjectAltName, совпадающими с именем сервера)? Является ли это сертификатом CA (посмотрите в разделе Основные ограничения, вы сможете увидеть это с помощью своего браузера).
Бруно
2
tl; dr: хранилища доверия содержат публичные, доверенные, корневые (CA) сертификаты, тогда как хранилища идентификаторов / ключей содержат частные сертификаты идентификации; по файлам, однако, они одинаковы.
Андрей

Ответы:

346

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

Параметры 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 ):

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

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

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

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

Bruno
источник
спасибо за ответ, это немного проясняет ситуацию. Я все еще в замешательстве, хотя, когда дело доходит до использования, я могу использовать ключ pri / pub pk12 (xxx.p12) в качестве хранилища ключей (через -D) и создать SSL-соединение (доверенное) без какого-либо упоминания хранилища доверенных сертификатов через - О ... хорошо.
Тоби
57
Вам не нужно указывать хранилище доверенных сертификатов, потому что для него есть значение по умолчанию (оно связано с JRE), обычно в $JAVA_HOME/lib/security/cacerts(см. 2-ю ссылку на руководство по JSSE, которую я отправил). Как и браузеры, он содержит набор доверенных сертификатов по умолчанию. Как правило, клиент всегда будет использовать хранилище доверенных сертификатов для проверки сертификата сервера, но хранилище ключей будет использоваться только в том случае, если сервер запрашивает сертификат клиента, а сервер всегда будет использовать хранилище ключей для своего собственного ключа + сертификат, но хранилище доверенных сертификатов будет только используется, если клиент отправляет сертификат клиента.
Бруно
2
Спасибо за полезную информацию. В Weblogic есть «хранилище ключей-идентификаторов», в котором хранится SSL-сертификат сервера, а также «хранилище ключей-хранилищ», в котором хранятся SSL-сертификаты, которым доверяет сервер, поэтому я прав, если скажу, что «идентификационный ключ» -store "это не что иное, как" хранилище ключей ", а" trust-key-store "это не что иное, как" хранилище доверенных сертификатов "?
hagrawal
@Bruno также следует отметить, что когда есть "jssecacerts", "cacerts" игнорируется?
kommradHomer
61

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

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

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

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

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

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

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

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

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

Баладжи Боггарам Раманараян
источник
25

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

Musikk
источник
4
Вы можете использовать различные типы ключей (например, PKCS12) путем установки javax.net.ssl.keyStoreTypeи javax.net.ssl.trustStoreTypeсвойств системы.
Донал Феллоуз
1
@Donal: Хорошее дополнение. Вы случайно не знаете, есть ли список всех поддерживаемых контейнеров? Я знаю только о PKCS12 и JKS (первый из них - результат проб и ошибок ...).
MusiKk
2
форматы хранилища ключей различаются в зависимости от доступных провайдеров (см. этот список для тех, кто связан с Oracle JRE по умолчанию). Был также обсуждение в этом вопросе . Другие провайдеры (например, BouncyCastle) могут быть использованы для других форматов.
Бруно
21

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

Akash5288
источник
Привет, у меня есть один сценарий, где у меня есть два разных приложения в одном контейнере (tomcat). Из обоих приложений мне приходится вызывать остальные конечные точки с обеих сторон для каждого приложения. Мол, от А до В и от В до А (А и В - два приложения). Нужно ли использовать склад доверенных сертификатов в этом сценарии? Как я использую пользовательский клиент отдыха, который использует хранилище ключей. Пожалуйста, предложите.
Дипак
0

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

1) Хит URL в браузере с помощью Chrome

2) Проверьте на «я» значок слева от 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
Ганеш Ша
источник
-1

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

Команда END_TECH
источник
В доверенном магазине хранятся доверенные сертификаты.
Маркиз Лорн
-1

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

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

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

Снехал Масне
источник