Подтвердить что ты не робот

Что такое Keystore?

Я получаю:

sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find
valid certification path to requested target
.
.
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.
ValidatorException: PKIX path building failed: sun.security.provider.
certpath.SunCertPathBuilderException: unable to find valid certification 
path to requested target

Поиск того, как разрешить это исключение, я столкнулся с термином Keystore, который я не понимаю. Что такое Keystore в простых терминах? Как это связано с SSL?

4b9b3361

Ответ 1

Keystore в Java может ссылаться на три вещи, в зависимости от контекста. (Они все тесно связаны, но тонко отличаются.)

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

  • KeyStore также является классом, который является частью стандартного API. Это по существу способ загрузки, сохранения и, как правило, взаимодействия с одним из "физических" хранилищ ключей, как описано выше. A KeyStore также может быть чисто в памяти, если вам просто нужна абстракция API для вашего приложения.

    Как загрузить и обработать такой экземпляр KeyStore, зависит от формата файла хранилища ключей (или другой системы хранения), который его поддерживает. Доступны несколько форматов. Наиболее распространенными являются JKS и PKCS # 12 (.p12).

  • "keystore" также может использоваться как копия "truststore". Здесь он может запутаться, так как "хранилище ключей" и "truststore" являются хранилищами ключей, они просто используются для разных целей. Вы можете найти более подробную информацию в этом ответе. Хранилище ключей используется для инициализации диспетчера ключей, тогда как доверительный магазин используется для инициализации доверительного менеджера. Из справочника JSSE:

    • A TrustManager определяет, будет ли удаленная аутентификация учетные данные (и, следовательно, соединение) должны быть доверены.

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

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

    В JRE имеется стандартная сеть доверия (/lib/security/cacerts). Не существует ключевого хранилища по умолчанию, поскольку он обычно является более явным шагом для пользователя.

В контексте SSL/TLS хранилище ключей (хранилище ключей, используемое как хранилище ключей) будет находиться там, где сервер хранит свой сертификат и закрытый ключ (или, когда используется аутентификация клиентского сертификата, где клиент хранит свой сертификат и частный ключ). Трастовый магазин (хранилище ключей, используемое как доверенное хранилище) будет находиться там, где клиент хранит сертификаты ЦС CA, которым он доверяет, чтобы иметь возможность проверять сертификат сервера при подключении к серверу SSL/TLS (аналогично, на стороне сервера, это также где хранятся сертификаты ЦС, используемые для проверки клиентских сертификатов).

Как правило, ошибка, которую вы получаете ( "ValidatorException: PKIX path building failed" ), происходит, когда сертификат подключаемого сервера не может быть проверен с использованием какого-либо сертификата в используемом вами магазине доверия. Обычно вам необходимо иметь в своем доверенном сервере либо сертификат сервера непосредственно в вашем доверенном хранилище (который можно управлять только в малом масштабе), либо сертификат ЦС ЦС, используемый для выдачи этого сертификата сервера (или одного из сертификатов в цепочке представляет, когда есть цепочка).

Ответ 2

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

Подумайте о хранилище ключей как набора папок или базы данных/репозитория, в котором содержатся сертификаты. Физически это файл в JRE (/lib/security/cacerts)

Этот репозиторий можно изменить с помощью команды keytool, которая поставляется с JRE. См. эту ссылку для некоторых общих команд. Другой способ - использовать Диалоговое окно "Сертификат" панели управления Java (это также установлено с JRE):

Certificate Dialog