Импорт цепочки сертификатов PEM и ключ к Java Keystore

29

Существует множество ресурсов по этой теме, но я не нашел ни одного, который бы охватывал этот немного особый случай.

У меня 4 файла;

  • privatekey.pem
  • certificate.pem
  • intermediate_rapidssl.pem
  • ca_geotrust_global.pem

И я хочу импортировать их в свежий склад ключей.

Некоторые сайты предлагают использовать DER-формат и импортировать их один за другим, но это не удалось, потому что ключ не распознан.

Другой сайт предложил специальный класс «ImportKey» для запуска для импорта, и это работало, пока я не увидел, что цепочка разорвана. Т.е. длина цепочки в сертификате равна 1, без учета промежуточного и ок.

Некоторые сайты предлагают PKCS7, но я даже не могу получить цепочку от этого. Другие предлагают формат PKCS12, но, насколько мне известно, мои тесты не сработали для получения всей цепочки.

Любые советы или советы приветствуются.

Троллеба
источник

Ответы:

26

Это может быть не идеально, но у меня есть некоторые заметки по использованию, keytoolкоторые я изменил для вашего сценария.

  1. Импортируйте корневой или промежуточный сертификат CA в существующее хранилище ключей Java:

    keytool -import -trustcacerts -alias root -file ca_geotrust_global.pem -keystore yourkeystore.jks
    keytool -import -trustcacerts -alias root -file intermediate_rapidssl.pem -keystore yourkeystore.jks 
    
  2. Перед импортом объедините сертификат и закрытый ключ в один файл.

    cat certificate.pem privatekey.pem > combined.pem
    

    Это должно привести к файлу, напоминающему приведенный ниже формат.

    НАЧАТЬ СЕРТИФИКАТ
    ...
    КОНЕЦ СЕРТИФИКАТ
    НАЧАТЬ RSA ЧАСТНЫЙ КЛЮЧ
    ...
    КОНЕЦ RSA ЧАСТНЫЙ КЛЮЧ

  3. Импортируйте подписанный первичный сертификат и ключ в существующее хранилище ключей Java:

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    
Аарон Копли
источник
2
Какая версия keytool позволяет вам так цепляться? Этот синтаксис выдает «ошибка keytool: java.lang.Exception: сертификат не импортирован, псевдоним <root> уже существует» с обоими -import и -importcert
ctpenrose
Трудно сказать, точно. Но учитывая год / месяц, вероятно, это будет Java 6? (Понятия не имею, минорный релиз.) Какую версию вы используете? Ошибка выглядит так, как будто проблема может быть связана с самим хранилищем ключей. ( alias <root> already exists) Можете ли вы попробовать с новым, пустым хранилищем ключей?
Аарон Копли
1
Keytool не позволит мне импортировать сертификат, используя уже существующий псевдоним «root». Но я думаю, что это была опечатка. Интересно отметить, что keytool создает цепочку для вашего сертификата, когда находит сертификаты подписчиков в хранилище ключей (под любым псевдонимом). Java-инструмент "Portecle" удобен для управления хранилищем ключей Java.
Houtman
Keytool не работает так и не позволяет вам импортировать псевдоним более одного раза, как описано. (И да, я пробовал). Смотрите ответ senajqerib ниже для чего-то, что работает должным образом.
Стив Сетер
1
Это трехлетний ответ. Вполне возможно, что все изменилось, но я уверяю вас, что это сработало (или было близко к работе, поскольку я указывал, что оно может быть не идеальным) по состоянию на февраль 2013 года. Пожалуйста, не стесняйтесь вносить изменения или пометить их для внимания модератора.
Аарон Копли
42

Объединить все файлы * .pem в один файл pem, например all.pem. Затем создать хранилище ключей в формате p12 с закрытым ключом + all.pem.

openssl pkcs12 -export -inkey private.key -in all.pem -name test -out test.p12

Затем экспортируйте p12 в jks

keytool -importkeystore -srckeystore test.p12 -srcstoretype pkcs12 -destkeystore test.jks
senanqerib
источник
Спасибо. Это единственный полный и правильный ответ. Как вы и предлагали, гораздо проще просто объединить сертификаты в один файл.
Стив Сетер
Это работало как удовольствие для меня! Я использовал эти инструкции, чтобы преобразовать цепочку ключей, используемых в репозитории nodejs-self-подписанного сертификата-примера, для взаимодействия с сервером TLS на основе Java. Бесконечно благодарен!
Гальдер Замарреньо
Это правильный ответ.
sfThomas
8

keytool не предоставляет способ импортировать сертификат + закрытый ключ из одного (объединенного) файла, как предложено выше. Он работает нормально, но импортируется только сертификат, а закрытый ключ игнорируется. Вы можете проверить это следующим образом: keytool -list -v -keystore yourkeystore.jksтип записи вашего домена - TrustedCertEntry, а не PrivateKeyEntry.

Таким образом, чтобы решить начальную проблему, нужно сначала создать хранилище ключей PKCS # 12 с использованием openssl (или аналогичного инструмента), а затем импортировать хранилище ключей с помощью keytool -importkeystore.

Ixmal
источник