56просмотров
26 февраля 2026 г.
Score: 62
Привет! 👋 Сегодня поговорим о том как извлечь сертификат, приватный ключ, цепочку CA из .jks Иногда нужно из keystore.jks извлечь
🔵 приватный ключ
🔵 сертификат (leaf)
🔵 всю цепочку Зачем 〰️ вопрос риторический.
Миграция на nginx, перенос в Kubernetes secret, отладка mTLS, перенос на другой сервер 〰️ сценариев масса. 😎 ❗️ Но есть нюанс ➡️ keytool не умеет напрямую вытаскивать приватный ключ.
Поэтому делаем это через промежуточный формат PKCS12. ✅ Вначале нужно узанть alias записи с ключом в keystore keytool -list -v -keystore keystore.jks
Терминал попросит ввести пароль. Вводим если знаем 😄 Ищем глазками
Alias name: имя_алиаса
Entry type: PrivateKeyEntry ❓ Зачем вообще нужен alias В одном .jks может храниться
🔵 несколько сертификатов
🔵 несколько ключей
🔵 разные записи trustedCertEntry/PrivateKeyEntry Alias 〰️ это имя конкретной записи внутри. Когда мы конвертируем или экспортируем данные, нужно точно указать,
какую именно запись с ключом мы хотим извлечь. Без указания alias
🔵 можно экспортировать не ту запись
🔵 можно получить ошибку
🔵 можно случайно взять только trustedCertEntry без ключа ✅ Конвертируем JKS ➡️ PKCS12 keytool -importkeystore \ -srckeystore keystore.jks -srcstoretype JKS \ -destkeystore temp.p12 -deststoretype PKCS12 \ -srcalias имя_алиаса Терминал попросит
🔵 Пароль источника keystore.jks
🔵 Пароль для нового temp.p12
🔵 Подтверждение нового пароля
🔵 Если у ключа был отдельный keypass, может запросить и его. Теперь у нас есть temp.p12 〰️ с ним уже удобно работать через openssl. ✅ Извлекаем только leaf-сертификат openssl pkcs12 -in temp.p12 -clcerts -nokeys -out cert.crt
Терминал попросит ввести пароль уже от temp.p12 ✅ Извлекаем всю цепочку openssl pkcs12 -in temp.p12 -nokeys -out fullchain.pem ✅ Извлекаем приватный ключ openssl pkcs12 -in temp.p12 -nocerts -nodes -out private.key
🔵 Если хотим ключ без пароля 〰️ -nodes обязателен
🔵 Если нужен зашифрованный ключ 〰️ убираем -nodes ✅ Проверяем, что ключ и сертификат совпадают openssl x509 -noout -modulus -in cert.crt | openssl md5
openssl rsa -noout -modulus -in private.key | openssl md5
Хэши должны совпасть. ⚠️ Можно передать пароль прямо в команды, но с этим стоит быть осторожным 〰️ пароль попадёт в history 😏 ✅ В итоге получаем 🔵 cert.crt 〰️ твой сертификат
🔵 fullchain.pem 〰️ сертификат + CA
🔵 private.key 〰️ приватный ключ Из truststore - цепочка CA (intermediate + root) извлекается проще, чем из keystore. ❓Почему
Потому что в truststore нет приватных ключей, там только trustedCertEntry. ✅ Посмотрим, что лежит в truststore keytool -list -v -keystore truststore.jks ➡️ Увидим что-то вроде
Alias name: intermediate
Entry type: trustedCertEntry Alias name: root
Entry type: trustedCertEntry ✅ Извлекаем конкретный CA сертификат intermediate
keytool -exportcert \ -keystore truststore.jks \ -alias intermediate \ -rfc \ -file intermediate.pem ✅ Извлекаем Root CA keytool -exportcert \ -keystore truststore.jks \ -alias root \ -rfc \ -file root.pem Флаг -rfc делает PEM-формат (-----BEGIN CERTIFICATE-----). ✅ Извлечь все CA сразу Если alias’ов несколько
for alias in $(keytool -list -keystore truststore.jks | grep trustedCertEntry | awk '{print $1}'); do keytool -exportcert -rfc \ -keystore truststore.jks \ -alias "$alias" \ -file "$alias.pem"
done ✅ И помни 😉 Keystore 〰️ твоя личность.
Truststore 〰️ твой круг доверия.
mTLS 〰️ когда доверие взаимное 💞 #ssl #tls #keystore #truststore #jks #java #linux #devops