← Назад к вопросам

Что такое Java KeyStore (JKS) и для чего он используется?

1.7 Middle🔥 91 комментариев
#Безопасность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Java KeyStore (JKS): Полный разбор

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

Основное назначение

1. Хранение приватных ключей

Для подписи документов, шифрования, SSL/TLS соединений:

import java.security.KeyStore;
import java.security.PrivateKey;
import javax.net.ssl.KeyManagerFactory;

KeyStore keyStore = KeyStore.getInstance("JKS");
try (FileInputStream fis = new FileInputStream("/path/to/keystore.jks")) {
    keyStore.load(fis, "password123".toCharArray());
}

// Получение приватного ключа
PrivateKey privateKey = (PrivateKey) keyStore.getKey("alias", "key-password".toCharArray());

2. Хранение публичных сертификатов

Для проверки подписей, установления доверия:

import java.security.cert.Certificate;

Certificate cert = keyStore.getCertificate("alias");
PublicKey publicKey = cert.getPublicKey();

Практические примеры

Пример 1: SSL/TLS конфигурация

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;

public class SSLConfig {
    public static SSLContext createSSLContext() throws Exception {
        KeyStore keyStore = KeyStore.getInstance("JKS");
        
        try (FileInputStream fis = new FileInputStream("server-keystore.jks")) {
            keyStore.load(fis, "keystore-password".toCharArray());
        }
        
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(keyStore, "key-password".toCharArray());
        
        SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
        sslContext.init(kmf.getKeyManagers(), null, null);
        
        return sslContext;
    }
}

Пример 2: Работа с сертификатами

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.cert.X509Certificate;
import java.util.Enumeration;

public class KeyStoreManager {
    public static void listCertificates(String keystorePath, String password) throws Exception {
        KeyStore keyStore = KeyStore.getInstance("JKS");
        
        try (FileInputStream fis = new FileInputStream(keystorePath)) {
            keyStore.load(fis, password.toCharArray());
        }
        
        Enumeration<String> aliases = keyStore.aliases();
        
        while (aliases.hasMoreElements()) {
            String alias = aliases.nextElement();
            
            if (keyStore.isCertificateEntry(alias)) {
                X509Certificate cert = (X509Certificate) keyStore.getCertificate(alias);
                System.out.println("Сертификат: " + alias);
                System.out.println("Субъект: " + cert.getSubjectDN());
                System.out.println("Издатель: " + cert.getIssuerDN());
                System.out.println("Срок действия: " + cert.getNotBefore() + " - " + cert.getNotAfter());
            }
        }
    }
}

Пример 3: Цифровая подпись с KeyStore

import java.security.Signature;
import java.security.PrivateKey;

public class DigitalSignature {
    public static byte[] signData(byte[] data, String keystorePath, String alias, String password) throws Exception {
        KeyStore keyStore = KeyStore.getInstance("JKS");
        try (FileInputStream fis = new FileInputStream(keystorePath)) {
            keyStore.load(fis, password.toCharArray());
        }
        
        PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());
        
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(data);
        
        return signature.sign();
    }
}

Команды командной строки

# Создание нового KeyStore
keytool -genkey -alias myalias -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 365

# Просмотр содержимого
keytool -list -v -keystore keystore.jks

# Импорт сертификата
keytool -import -alias ca-cert -file ca-cert.cer -keystore keystore.jks

# Экспорт сертификата
keytool -export -alias myalias -keystore keystore.jks -file certificate.cer

# Удаление записи
keytool -delete -alias myalias -keystore keystore.jks

TrustStore vs KeyStore

  • KeyStore: Содержит приватные ключи (секретные)
  • TrustStore: Содержит публичные сертификаты для проверки (можно поделиться)
// TrustStore используется для доверия к сертификатам
System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "password");

Современные альтернативы

  • PKCS12 — стандарт, поддерживаемый всеми системами
  • Spring Cloud Config — управление секретами в облаке
  • HashiCorp Vault — специализированное хранилище секретов

Важные моменты

  1. Безопасность: Никогда не коммитьте пароли от KeyStore
  2. Резервные копии: Сохраняйте KeyStore в безопасном месте
  3. Срок действия: Мониторьте дату истечения сертификатов
  4. Перелоцирование: При смене пароля обновляйте конфигурацию приложения
Что такое Java KeyStore (JKS) и для чего он используется? | PrepBro