Вопрос-ответ

How to import an existing X.509 certificate and private key in Java keystore to use in SSL?

Как импортировать существующий сертификат X.509 и закрытый ключ в хранилище ключей Java для использования в SSL?

У меня есть пара сертификатов X.509 и ключевой файл.

Как мне импортировать эти два в одно хранилище ключей? Все примеры, которые я смог найти в Google, всегда генерируют ключ самостоятельно, но у меня уже есть ключ.

Я пробовал:

keytool -import  -keystore ./broker.ks -file mycert.crt

Однако при этом импортируется только сертификат, а не файл ключа. Я попытался объединить сертификат и ключ, но получил тот же результат.

Как мне импортировать ключ?

Переведено автоматически
Ответ 1

Я использовал следующие два шага, которые я нашел в комментариях / сообщениях, связанных в других ответах:

Шаг первый: Преобразуйте сертификат x.509 и ключ в файл pkcs12

openssl pkcs12 -export -in server.crt -inkey server.key \
-out server.p12 -name [some-alias] \
-CAfile ca.crt -caname root

Примечание: Убедитесь, что вы ввели пароль для файла pkcs12 - в противном случае вы получите исключение с нулевым указателем при попытке его импорта. (На случай, если у кого-то еще была такая головная боль). (Шутливое спасибо!)

Примечание 2: Возможно, вы захотите добавить -chain опцию для сохранения всей цепочки сертификатов. (Спасибо Mafuba)

Шаг второй: Преобразуйте файл pkcs12 в хранилище ключей Java

keytool -importkeystore \
-deststorepass [changeit] -destkeypass [changeit] -destkeystore server.keystore \
-srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass some-password \
-alias [some-alias]

ЗАКОНЧЕННЫЕ

НЕОБЯЗАТЕЛЬНЫЙ нулевой шаг: Создайте самозаверяющий сертификат

openssl genrsa -out server.key 2048
openssl req -new -out server.csr -key server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Вопросы и ответы: Я получаю сообщение об ошибке IOException: keystore password was incorrect

Если вы используете OpenSSL 3.0 и JDK новее, чем Java8u302, и получаете следующую ошибку:

keytool error: java.io.IOException: keystore password was incorrect

Возможно, вы столкнулись с изменением шифра по умолчанию в openssl. Этот ответ Stack Overflow содержит ответ. Возможно, поблагодарите Томаса за поддержку.

Ответ 2

Keytool в Java 6 есть такая возможность: Импорт закрытых ключей в хранилище ключей Java с помощью keytool

Вот основные сведения из этого поста.


  1. Преобразуйте существующий сертификат в PKCS12 с помощью OpenSSL. При запросе требуется ввести пароль, иначе на 2-м шаге будет подана жалоба.


    openssl pkcs12 -export -in [my_certificate.crt] -inkey [my_key.key] \
    -out [keystore.p12] -name [new_alias] -CAfile [my_ca_bundle.crt] \
    -caname root


  2. Преобразуйте PKCS12 в файл хранилища ключей Java.


    keytool -importkeystore -deststorepass [new_keystore_pass] \
    -destkeypass [new_key_pass] -destkeystore [keystore.jks] \
    -srckeystore [keystore.p12] -srcstoretype PKCS12 \
    -srcstorepass [pass_used_in_p12_keystore] \
    -alias [alias_used_in_p12_keystore]


Ответ 3

Хотите верьте, хотите нет, keytool не предоставляет такой базовой функциональности, как импорт закрытого ключа в хранилище ключей. Вы можете попробовать этот обходной путь, объединив файл PKSC12 с закрытым ключом в хранилище ключей:

keytool -importkeystore \
-deststorepass storepassword \
-destkeypass keypassword \
-destkeystore my-keystore.jks \
-srckeystore cert-and-key.p12 \
-srcstoretype PKCS12 \
-srcstorepass p12password \
-alias 1

Или просто используйте более удобный KeyMan от IBM для обработки хранилища ключей вместо keytool.

Ответ 4

Использование сертификатов Let's Encrypt

Предполагая, что вы создали свои сертификаты и закрытые ключи с помощью Let's Encrypt в /etc/letsencrypt/live/you.com:

1. Создайте файл PKCS #12

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out pkcs.p12 \
-name letsencrypt

Это объединяет ваш SSL-сертификат fullchain.pem и ваш закрытый ключ privkey.pem в один файл, pkcs.p12.

Вам будет предложено ввести пароль для pkcs.p12.

export Параметр указывает, что файл PKCS # 12 будет создан, а не проанализирован (согласно руководству).

2. Создайте хранилище ключей Java

keytool -importkeystore -destkeystore keystore.jks -srckeystore pkcs.p12 \
-srcstoretype PKCS12 -alias letsencrypt

Если keystore.jks не существует, он будет создан, содержащий pkcs.12 из предыдущего шага. В противном случае вы импортируете pkcs.12 в существующее хранилище ключей.


Эти инструкции взяты из сообщения в блоге "Создайте хранилище ключей Java (.JKS) из сертификатов Let's Encrypt" Максимилиана Бема.

Вот больше о различных типах файлов в /etc/letsencrypt/live/you.com/.

java