Импорт цепочки сертификатов 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

Спасибо. Это единственный полный и правильный ответ. Как вы и предлагали, гораздо проще просто объединить сертификаты в один файл.
Стив Сетер

Это работало как удовольствие для меня! Я использовал эти инструкции, чтобы преобразовать цепочку ключей, используемых в репозитории nodejs-self-подписанного сертификата-примера, для взаимодействия с сервером TLS на основе Java. Бесконечно благодарен!
Гальдер Замарреньо

Это правильный ответ.
sfThomas

8

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.