Рубрики
Без рубрики

Разница между хранилищем ключей Java и хранилищем доверия

Узнайте о разнице между хранилищем ключей Java и хранилищем доверия.

Автор оригинала: Denis Szczukocki.

1. Обзор

В этой краткой статье мы рассмотрим различия между хранилищем ключей Java и хранилищем доверия Java.

2. Концепции

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

Обычно это защищенные паролем файлы, которые находятся в той же файловой системе, что и наше запущенное приложение. По умолчанию для этих файлов используется формат JKS до Java 8 .

Однако, начиная с Java 9, формат хранилища ключей по умолчанию-PKCS12 . Самое большое различие между JKS и PKCS12 заключается в том, что JKS-это формат, специфичный для Java, в то время как PKCS12-это стандартизированный и нейтральный к языку способ хранения зашифрованных закрытых ключей и сертификатов.

3. Хранилище ключей Java

Хранилище ключей Java хранит записи закрытых ключей, сертификаты с открытыми ключами или просто секретные ключи , которые мы можем использовать для различных криптографических целей. Он хранит каждый по псевдониму для удобства поиска.

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

Обычно мы будем использовать хранилище ключей, когда мы являемся сервером и хотим использовать HTTPS . Во время SSL-квитирования сервер ищет закрытый ключ из хранилища ключей и представляет клиенту соответствующий открытый ключ и сертификат.

Соответственно, если клиенту также необходимо аутентифицировать себя – ситуация, называемая взаимной аутентификацией, – то у клиента также есть хранилище ключей, а также он представляет свой открытый ключ и сертификат.

Хранилища ключей по умолчанию нет, поэтому, если мы хотим использовать зашифрованный канал, нам придется установить javax.net.ssl.keyStore и javax.net.ssl.keyStorePassword. Если ваш формат хранилища ключей отличается от формата по умолчанию, мы можем использовать javax.net.ssl.keyStoreType для его настройки.

Конечно, мы можем использовать эти ключи и для обслуживания других потребностей. Закрытые ключи могут подписывать или расшифровывать данные, а открытые ключи могут проверять или шифровать данные. Секретные ключи также могут выполнять эти функции. Хранилище ключей-это место, где мы можем хранить эти ключи.

Мы также можем взаимодействовать с хранилищем ключей программно .

4. Java TrustStore

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

В Java мы используем его, чтобы доверять третьей стороне, с которой мы собираемся общаться.

Возьмем наш предыдущий пример. Если клиент общается с сервером на базе Java по протоколу HTTPS, сервер будет искать соответствующий ключ в своем хранилище ключей и представит клиенту открытый ключ и сертификат.

Затем мы, клиент, ищем соответствующий сертификат в нашем хранилище доверия. Если сертификат или центры сертификации, представленные внешним сервером, не находятся в нашем хранилище доверия, мы получим исключение SSLHandshakeException и соединение не будет успешно настроено.

Java связала хранилище доверия с именем cacerts , и оно находится в каталоге $JAVA_HOME/jre/lib/security .

Он содержит доверенные Центры сертификации по умолчанию:

$ keytool -list -keystore cacerts
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 92 entries

verisignclass2g2ca [jdk], 2018-06-13, trustedCertEntry,
Certificate fingerprint (SHA1): B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D

Здесь мы видим, что truststore содержит 92 записи доверенных сертификатов, и одна из записей-это запись verisignclass2gca //. Это означает, что JVM будет автоматически доверять сертификатам, подписанным verisign class 2 g 2 ca .

Здесь мы можем переопределить местоположение truststore по умолчанию с помощью свойства javax.net.ssl.trustStore . Аналогично, мы можем задать javax.net.ssl.trustStorePassword и javax.net.ssl.trustStoreType для указания пароля и типа truststore.

5. Заключение

В этом уроке мы обсудили основные различия между хранилищем ключей Java и хранилищем доверия Java и его назначение.

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

Затем мы могли бы взглянуть на следующее руководство SSL или Справочное руководство JSSE , чтобы узнать более подробную информацию о зашифрованной связи в Java.