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

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

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

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

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

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

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

5 ответов


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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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


Keystore используется сервером для хранения закрытых ключей, а truststore используется сторонним клиентом для хранения открытых ключей, предоставляемых сервером для доступа. Я сделал это в моем приложении. Ниже приведены шаги для генерации сертификатов java для связи SSL:

  1. создайте сертификат с помощью команды keygen в windows:

keytool-genkey-сервер хранилища ключей.хранилище ключей-псевдоним mycert-20161109-keyalg RSA-keysize 2048-действительность 3950

  1. собственная личность аттестует сертификат:

keytool-selfcert-псевдоним mycert-20161109-сервер хранилища ключей.keystore-действительность 3950

  1. экспорт сертификата в папку:

keytool-экспорт-псевдоним mycert-20161109-сервер хранилища ключей.keystore-rfc-файл mycert-20161109.cer

  1. импорт сертификата в клиент Truststore:

keytool-importcert-псевдоним mycert-20161109-файл C:\certs\mycert-20161109 -хранилище .truststore


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