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
С хранилищем доверенных сертификатов все наоборот: в то время как хранилище ключей обычно хранит сертификаты, которые идентифицируют нас, хранилище доверенных сертификатов хранит сертификаты, которые идентифицируют других.
В 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
Здесь мы видим, что хранилище доверенных сертификатов содержит 92 записи доверенных сертификатов, и одна из записей — это запись verisignclass2gca
.
Это означает, что JVM автоматически будет доверять сертификатам, подписанным verisignclass2g2ca
.
Здесь мы можем переопределить расположение хранилища доверенных сертификатов по умолчанию с помощью свойства javax.net.ssl.trustStore
. Точно так же мы можем установить javax.net.ssl.trustStorePassword
и javax.net.ssl.trustStoreType
, чтобы указать пароль и тип хранилища доверенных сертификатов.
5. Вывод
В этом руководстве мы обсудили основные различия между хранилищем ключей Java и хранилищем доверенных сертификатов Java, а также их назначение.
Кроме того, мы показали, как можно переопределить значения по умолчанию с помощью системных свойств.
Затем мы могли бы взглянуть на следующее руководство по SSL или Справочное руководство по JSSE , чтобы узнать больше о зашифрованной связи в Java.