Ответ 1
Keystore в Java может ссылаться на три вещи, в зависимости от контекста. (Они все тесно связаны, но тонко отличаются.)
-
Хранилище ключей может быть хранилищем, в котором могут храниться секретные ключи, сертификаты и симметричные ключи. Обычно это файл, но хранилище также можно обрабатывать по-разному (например, криптографический токен или использовать собственный механизм ОС.)
-
KeyStore
также является классом, который является частью стандартного API. Это по существу способ загрузки, сохранения и, как правило, взаимодействия с одним из "физических" хранилищ ключей, как описано выше. AKeyStore
также может быть чисто в памяти, если вам просто нужна абстракция 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
" ), происходит, когда сертификат подключаемого сервера не может быть проверен с использованием какого-либо сертификата в используемом вами магазине доверия. Обычно вам необходимо иметь в своем доверенном сервере либо сертификат сервера непосредственно в вашем доверенном хранилище (который можно управлять только в малом масштабе), либо сертификат ЦС ЦС, используемый для выдачи этого сертификата сервера (или одного из сертификатов в цепочке представляет, когда есть цепочка).