1. Введение
Java KeyStore — это контейнер сертификатов безопасности, которые мы можем использовать при написании кода Java. Хранилища ключей Java содержат один или несколько сертификатов с соответствующими закрытыми ключами и создаются с помощью keytool
, который поставляется с JDK.
В этом руководстве мы преобразуем хранилище ключей Java в формат PEM (Privacy-Enhanced Mail), используя комбинацию keytool
и openssl.
Шаги будут включать использование keytool
для преобразования JKS в хранилище ключей PKCS#12, а затем openssl
для преобразования хранилища ключей PKCS#12 в файл PEM.
keytool
доступен с JDK, и мы можем загрузить openssl
с веб-сайта OpenSSL.
2. Форматы файлов
Хранилища ключей Java хранятся в формате файла JKS. Это собственный формат, специально предназначенный для использования в программах Java. Хранилища ключей PKCS#12 не являются проприетарными и становятся все более популярными — начиная с Java 9 PKCS#12 используется в качестве формата хранилища ключей по умолчанию вместо JKS.
Файлы PEM также являются контейнерами сертификатов — они кодируют двоичные данные с использованием Base64, что позволяет легче передавать содержимое через разные системы. Файл PEM может содержать несколько экземпляров, каждый из которых соответствует двум правилам:
- Однострочный заголовок
-----BEGIN <label>-----
- Нижний колонтитул в одну строку
-----END <label>-----
<label>
указывает тип закодированного сообщения, общие значения CERTIFICATE
и PRIVATE KEY
.
3. Преобразование всего JKS в формат PEM
Давайте теперь выполним шаги по преобразованию всех сертификатов и закрытых ключей из JKS в формат PEM.
3.1. Создание хранилища ключей Java
Мы начнем с создания JKS с одной парой ключей RSA:
keytool -genkey -keyalg RSA -v -keystore keystore.jks -alias first-key-pair
Мы введем пароль KeyStore в приглашении и введем информацию о паре ключей.
Для этого примера мы также создадим вторую пару ключей:
keytool -genkey -keyalg RSA -v -keystore keystore.jks -alias second-key-pair
3.2. JKS в PKCS#12
Первым шагом в процессе преобразования является преобразование JKS в PKCS#12 с помощью keytool
:
keytool -importkeystore -srckeystore keystore.jks \
-destkeystore keystore.p12 \
-srcstoretype jks \
-deststoretype pkcs12
Опять же, мы ответим на запросы пароля — один запросит пароль исходного JKS, а другой попросит нас создать пароль для результирующего хранилища ключей PKCS#12.
Давайте проверим результат выполнения этой команды:
Entry for alias first-key-pair successfully imported.
Entry for alias second-key-pair successfully imported.
Import command completed: 2 entries successfully imported, 0 entries failed or cancelled
Результатом является keystore.p12
KeyStore, хранящийся в формате PKCS#12.
3.3. PKCS#12 в PEM
Отсюда мы будем использовать openssl
для кодирования keystore.p12
в файл PEM:
openssl pkcs12 -in keystore.p12 -out keystore.pem
Инструмент запросит у нас пароль хранилища ключей PKCS#12 и парольную фразу PEM для каждого псевдонима. Парольная фраза PEM используется для шифрования полученного закрытого ключа.
Если мы не хотим шифровать полученный закрытый ключ, вместо этого мы должны использовать:
openssl pkcs12 -nodes -in keystore.p12 -out keystore.pem
keystore.pem
будет содержать все ключи и сертификаты из KeyStore. В этом примере он содержит закрытый ключ и сертификат как для псевдонимов первой пары ключей,
так и для второй пары ключей
.
4. Преобразование одного сертификата из JKS в PEM
Мы можем экспортировать один сертификат открытого ключа из JKS в формат PEM, используя только keytool
:
keytool -exportcert -alias first-key-pair -keystore keystore.jks -rfc -file first-key-pair-cert.pem
После ввода пароля JKS в командной строке мы увидим вывод этой команды:
Certificate stored in file <first-key-pair-cert.pem>
5. Вывод
Мы успешно преобразовали весь JKS в формат PEM, используя keytool
, openssl
и промежуточный этап формата PKCS#12. Мы также рассмотрели преобразование одного сертификата открытого ключа только с помощью keytool
.