Что такое JKS (Java KeyStore) и как с ним работать?

«Что такое JKS (Java KeyStore) и как с ним работать?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

JKS (Java KeyStore) — это проприетарный формат хранилища, используемый JVM для хранения криптографических ключей и сертификатов. Он защищен паролем.

Основное содержимое:

  • PrivateKeyEntry: Приватный ключ и цепочка сертификатов.
  • TrustedCertificateEntry: Доверенный сертификат (обычно CA или самоподписанный).

Базовые операции с JKS:

// 1. Загрузка KeyStore из файла
KeyStore keyStore = KeyStore.getInstance("JKS"); // Укажите "JKS" явно в Java 9+
FileInputStream fis = new FileInputStream("keystore.jks");
keyStore.load(fis, "storePassword".toCharArray());

// 2. Получение приватного ключа (требуется пароль для ключа)
Key key = keyStore.getKey("myAlias", "keyPassword".toCharArray());
if (key instanceof PrivateKey) {
    PrivateKey privateKey = (PrivateKey) key;
    Certificate[] chain = keyStore.getCertificateChain("myAlias");
}

// 3. Получение доверенного сертификата
Certificate cert = keyStore.getCertificate("trustedAlias");

// 4. Создание нового хранилища и сохранение
KeyStore newKeyStore = KeyStore.getInstance("JKS");
newKeyStore.load(null, null); // Инициализация пустого хранилища
newKeyStore.setKeyEntry("alias", privateKey, "keyPass".toCharArray(), chain);
try (FileOutputStream fos = new FileOutputStream("new.jks")) {
    newKeyStore.store(fos, "newStorePass".toCharArray());
}

Важные нюансы:

  • Устаревание: Начиная с Java 9, JKS считается устаревшим. Oracle рекомендует использовать стандартный формат PKCS12 (.p12 или .pfx). Для этого укажите KeyStore.getInstance("PKCS12").
  • Пароли: Пароль хранилища (storePassword) и пароль для доступа к приватному ключу (keyPassword) могут быть разными.
  • Использование: Применяется для настройки SSL/TLS контекстов (SSLContext), цифровой подписи, шифрования и клиентской аутентификации.