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


person Toby    schedule 14.06.2011    source источник
comment
Я не уверен, что вы имеете в виду под конкретным сертификатом, который я импортирую, имеет только открытый ключ: это просто открытый ключ (то есть не сертификат) или сертификат, не относящийся к CA?   -  person Bruno    schedule 14.06.2011
comment
хммм, не уверен. Я экспортировал из своего браузера как файл PEM. Это помогает?   -  person Toby    schedule 14.06.2011
comment
Если он экспортирован из браузера, вероятно, это сертификат. Это сертификат сервера (с именем CN или subjectAltName, совпадающим с именем сервера)? Это сертификат CA (посмотрите в разделе "Основные ограничения", вы должны увидеть это в своем браузере).   -  person Bruno    schedule 14.06.2011
comment
tl; dr: доверенные хранилища содержат общедоступные доверенные корневые (CA) сертификаты, тогда как хранилища идентификаторов / ключей содержат частные сертификаты идентификации; однако по файлам они такие же.   -  person Andrew    schedule 25.08.2017
comment
нет никакой технической разницы, только некоторая логика и удобство для отделения доверенных сертификатов от сертификатов сервера / клиента.   -  person Saboteur    schedule 25.03.2021


Ответы (6)


Терминология действительно немного сбивает с толку, но и 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):

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

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

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

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

person Bruno    schedule 14.06.2011
comment
спасибо за ответ, это немного проясняет ситуацию. Я все еще в замешательстве, хотя, когда дело доходит до использования, я могу использовать ключ pk12 pri / pub (xxx.p12) в качестве хранилища ключей (через -D) и создавать SSL-соединение (доверенное) без какого-либо упоминания хранилища доверенных сертификатов через - Д ... ну ладно. - person Toby; 15.06.2011
comment
Вам не нужно указывать хранилище доверенных сертификатов, потому что для него есть значение по умолчанию (оно связано с JRE), обычно в $JAVA_HOME/lib/security/cacerts (см. 2-ю ссылку на руководство JSSE, которую я отправил). Как и браузеры, он содержит набор доверенных сертификатов ЦС по умолчанию. В общем, клиент всегда будет использовать хранилище доверенных сертификатов для проверки сертификата сервера, но хранилище ключей будет использоваться только в том случае, если сервер запрашивает сертификат клиента, и сервер всегда будет использовать хранилище ключей для своего собственного ключа + сертификата, но хранилище доверенных сертификатов будет только используется, если клиент отправляет сертификат клиента. - person Bruno; 15.06.2011
comment
Спасибо за полезную информацию. В Weblogic есть хранилище ключей идентификации, в котором хранится сертификат SSL сервера, а затем есть хранилище ключей доверия, в котором хранятся сертификаты SSL, которым доверяет сервер, поэтому я прав, если скажу, что хранилище ключей идентификации - это не что иное, как хранилище ключей и хранилище доверенных ключей - это не что иное, как хранилище доверенных сертификатов? - person hagrawal; 13.02.2017
comment
@Bruno также следует отметить, что когда есть jssecacerts, cacerts игнорируется? - person kommradHomer; 04.07.2019

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

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

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

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

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

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

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

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

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

person Balaji Boggaram Ramanarayan    schedule 16.02.2018
comment
отлично, это легче понять на примере. Спасибо! - person frank; 18.01.2021

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

person musiKk    schedule 14.06.2011
comment
Вы можете использовать различные типы хранилищ ключей (например, PKCS12), задав системные свойства javax.net.ssl.keyStoreType и javax.net.ssl.trustStoreType. - person Donal Fellows; 14.06.2011
comment
@Donal: Хорошее дополнение. Вы случайно не знаете, есть ли список всех поддерживаемых контейнеров? Я знаю только PKCS12 и JKS (первые были результатом проб и ошибок ...). - person musiKk; 14.06.2011
comment
форматы хранилища ключей различаются в зависимости от доступных поставщиков (см. это list для тех, которые по умолчанию включены в Oracle JRE). Также было обсуждение в этом вопросе. Другие провайдеры (например, BouncyCastle) могут использоваться для других форматов. - person Bruno; 14.06.2011

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

person Akash5288    schedule 22.12.2016
comment
Привет, у меня есть один сценарий, в котором у меня есть два разных приложения в одном контейнере (tomcat). Из обоих приложений я должен вызвать остальные конечные точки с обеих сторон для каждого приложения. Например, от A к B и от B к A (A и B - два приложения). Нужно ли в этом сценарии использовать доверенный магазин? Поскольку я использую собственный клиент для отдыха, который использует хранилище ключей. Пожалуйста, предложите. - person Deepak; 13.06.2019

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

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

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
person Ganesh Sha    schedule 24.10.2019

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

person Team END_TECH    schedule 19.12.2017
comment
В доверенном магазине хранятся надежные сертификаты. - person user207421; 06.12.2018