Я понимаю, что хранилище ключей обычно содержит закрытые / открытые ключи, а хранилище доверенных сертификатов - только открытые ключи (и представляет список доверенных сторон, с которыми вы собираетесь общаться). Ну, это мое первое предположение, так что если это не правильно, я, вероятно, не очень хорошо начал ...
Мне было интересно понять, как / когда вы различаете магазины при использовании 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 и т. Д.?
Ответы:
Терминология действительно немного сбивает с толку, но и то
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
для данной цели.)Разница между
KeyManager
иTrustManager
(и, следовательно, междуjavax.net.ssl.keyStore
иjavax.net.ssl.trustStore
) заключается в следующем (цитируется в справочном руководстве JSSE ):(Другие параметры доступны, и их значения по умолчанию описаны в справочном руководстве JSSE . Обратите внимание, что хотя есть значение по умолчанию для хранилища доверия, его нет для хранилища ключей.)
По сути, хранилище ключей
javax.net.ssl.keyStore
должно содержать ваши личные ключи и сертификаты, а хранилищеjavax.net.ssl.trustStore
сертификатов, которым вы готовы доверять, когда удаленная сторона представляет свой сертификат. В некоторых случаях они могут быть одним и тем же хранилищем, хотя зачастую лучше использовать разные хранилища (особенно когда они основаны на файлах).источник
$JAVA_HOME/lib/security/cacerts
(см. 2-ю ссылку на руководство по JSSE, которую я отправил). Как и браузеры, он содержит набор доверенных сертификатов по умолчанию. Как правило, клиент всегда будет использовать хранилище доверенных сертификатов для проверки сертификата сервера, но хранилище ключей будет использоваться только в том случае, если сервер запрашивает сертификат клиента, а сервер всегда будет использовать хранилище ключей для своего собственного ключа + сертификат, но хранилище доверенных сертификатов будет только используется, если клиент отправляет сертификат клиента.Чтобы объяснить в общем случае использования / цели или обычного человека:
Во время рукопожатия SSL,
Клиент пытается получить доступ к https: //
И, таким образом, Сервер отвечает, предоставляя сертификат SSL (который хранится в его хранилище ключей)
Теперь клиент получает сертификат SSL и проверяет его через trustStore (то есть клиентское trustStore уже имеет заранее определенный набор сертификатов, которым он доверяет.). Это как: могу ли я доверять этому серверу? Это тот же сервер, с которым я пытаюсь поговорить? Нет атак среднего человека?
После того, как клиент проверит, что он общается с сервером, которому доверяет, связь SSL может происходить через общий секретный ключ.
Примечание: я не говорю здесь об аутентификации клиента на стороне сервера. Если сервер также хочет выполнить аутентификацию клиента, он также поддерживает хранилище trustStore для проверки клиента.
источник
Нет разницы между файлами хранилища ключей и доверенных сертификатов. Оба являются файлами в собственном формате файлов JKS. Различие заключается в использовании: насколько мне известно, Java будет использовать только хранилище, на которое ссылается
-Djavax.net.ssl.trustStore
системное свойство, для поиска сертификатов, которым можно доверять, при создании соединений SSL. То же самое для ключей и-Djavax.net.ssl.keyStore
. Но в теории можно использовать один и тот же файл для хранилищ доверия и ключей.источник
javax.net.ssl.keyStoreType
иjavax.net.ssl.trustStoreType
свойств системы.Хранилище ключей используется сервером для хранения личных ключей, а хранилище доверенных сертификатов - сторонним клиентом для хранения открытых ключей, предоставленных сервером для доступа. Я сделал это в моем производственном приложении. Ниже приведены шаги для генерации Java-сертификатов для связи SSL:
keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950
keytool -selfcert -alias mycert -keystore server.keystore -validity 3950
keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer
keytool -importcert -alias mycert -file mycert.cer -keystore truststore
источник
Это шаги для создания 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 для добавления сертификатов и создания хранилища доверенных сертификатов.
9) Предоставьте команду keytool для всех сертификатов и добавьте их в хранилище доверенных сертификатов.
источник
хранилище ключей просто хранит закрытые ключи, тогда как хранилище доверенных сертификатов хранит открытые ключи. Вы хотите создать сертификат Java для связи SSL. Вы можете использовать команду keygen в Windows, это, вероятно, будет самым простым решением.
источник
Проще говоря:
Хранилище ключей используется для хранения ваших учетных данных (сервер или клиент), а хранилище доверенных сертификатов - для хранения других учетных данных (сертификаты от CA).
Хранилище ключей необходимо, когда вы настраиваете серверную сторону по SSL, оно используется для хранения сертификата идентификации сервера, который сервер будет предоставлять клиенту при подключении, в то время как настройка доверительного хранилища на стороне клиента должна содержать, чтобы соединение работало. Если вы подключаетесь к какому-либо веб-сайту через SSL, он проверяет сертификат, представленный сервером, на наличие доверенного хранилища.
источник