Trust Store vs Key Store – создание с помощью keytool
Я понимаю, что хранилище ключей обычно содержит закрытые / открытые ключи, а хранилище доверия – только открытые ключи (и представляет список доверенных сторон, с которыми вы собираетесь общаться). Ну, это мое первое предположение, поэтому, если это не так, я, вероятно, не очень хорошо начал …
Мне было интересно, понимая, как / когда вы выделяете магазины при использовании keytool.
Итак, я создал хранилище ключей,
- Поддерживает ли Android Volley SSL?
- Как использовать ssh / scp между непубличными машинами
- ssl.SSLError: версия протокола предупреждения tlsv1
- прием HTTPS-соединений с самозаверяющими сертификатами
- GMail и SSL Encryption - сколько зашифровано
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 и т. Д.?
- Не удалось установить доверительные отношения для безопасного канала SSL / TLS - SOAP
- Доверяйте всем сертификатам, используя HttpClient over HTTPS
- как получить закрытый ключ из файла PEM?
- ASP.NET MVC RequireHttps только в производстве
- Зашифрованы ли URL HTTPS?
- Как я могу использовать разные сертификаты для определенных соединений?
- Использование HTTPS с REST в Java
- Программно настроить SSL для встроенного Jetty 9
Терминология немного запутанна, но как 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,
-
Клиент пытается получить доступ к https: //
-
Таким образом, сервер отвечает, предоставляя сертификат SSL (который хранится в его ключевом хранилище)
-
Теперь клиент получает сертификат SSL и проверяет его через trustStore (т. Е. В trustStore клиента уже есть предопределенный набор сертификатов, которым он доверяет.). Это похоже: могу ли я доверять этому серверу? Это тот же сервер, с которым я пытаюсь поговорить? Никакой средний человек не атакует?
-
Как только клиент проверяет, что он разговаривает с сервером, которому он доверяет, тогда связь SSL может происходить через общий секретный ключ.
Примечание. Я ничего не говорю о проверке подлинности клиента на стороне сервера. Если сервер также хочет выполнить проверку подлинности клиента, тогда сервер также поддерживает trustStore для проверки клиента.
Keystore используется сервером для хранения секретных ключей, а truststore используется сторонним клиентом для хранения открытых ключей, предоставляемых сервером для доступа. Я сделал это в своем производственном приложении. Ниже приведены шаги для создания Java-сертификатов для связи по SSL:
- Сгенерировать сертификат с помощью команды keygen в windowsх:
keytool -genkey -keystore server.keystore -alias mycert-20161109 -keyalg RSA -keysize 2048 -validity 3950
- Самостоятельно удостоверяйте сертификат:
keytool -selfcert -alias mycert-20161109 -keystore server.keystore -validity 3950
- Экспорт сертификата в папку:
keytool -export -alias mycert-20161109 -keystore server.keystore -rfc -file mycert-20161109.cer
- Импорт сертификата в клиентскую сеть Truststore:
keytool -importcert -alias mycert-20161109 -файл C: \ certs \ mycert-20161109 -keystore .truststore
keystore просто хранит секретные ключи, а магазины доверия хранят открытые ключи. Вы захотите создать сертификат java для связи SSL. Вы можете использовать команду keygen в Windows, это, вероятно, будет самым простым решением.