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

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

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

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

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

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

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

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

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

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

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

Во время установления связи SSL,

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

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

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

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

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

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

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

keytool -genkey -keystore server.keystore -alias mycert-20161109 -keyalg RSA -keysize 2048 -validity 3950

  1. Самостоятельно удостоверяйте сертификат:

keytool -selfcert -alias mycert-20161109 -keystore server.keystore -validity 3950

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

keytool -export -alias mycert-20161109 -keystore server.keystore -rfc -file mycert-20161109.cer

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

keytool -importcert -alias mycert-20161109 -файл C: \ certs \ mycert-20161109 -keystore .truststore

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

  • Использование SSL и SslStream для одноранговой аутентификации?
  • Почему SSLSocket Java отправляет приветствие клиента версии 2?
  • Каков правильный способ безопасного отключения сокета SSL asio?
  • «Основное соединение было закрыто: при отправке произошла непредвиденная ошибка». С SSL-сертификатом
  • Заставить браузер загружать «https» версию веб-сайта, а не «http»?
  • Java SSL: как отключить проверку имени хоста
  • Пользовательская обработка SSL перестала работать на Android 2.2 FroYo
  • С HTTPS, являются ли URL и заголовки запросов защищенными как тело запроса?
  • pip всегда терпит неудачу ssl проверка
  • Amazon S3 - HTTPS / SSL - Возможно ли это?
  • Как найти версию SSL / TLS в Java
  • Давайте будем гением компьютера.