← Назад к вопросам
Что такое 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 — специализированное хранилище секретов
Важные моменты
- Безопасность: Никогда не коммитьте пароли от KeyStore
- Резервные копии: Сохраняйте KeyStore в безопасном месте
- Срок действия: Мониторьте дату истечения сертификатов
- Перелоцирование: При смене пароля обновляйте конфигурацию приложения