Імпорт ланцюга сертифікатів PEM і ключ до Java Keystore


29

На цю тему є багато ресурсів, але я не знайшов жодного, який би висвітлював цей трохи особливий випадок.

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

  • privatekey.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
    

    У результаті має вийти файл, що нагадує формат нижче.

    ПОЧАТИ СЕРТИФІКАТ
    ...
    КІНЦЕ СЕРТИФІКАТ
    ПОЧАТИ РСА ПРИВАТНИЙ КЛЮЧ
    ...
    ЗАКОНЧИЙ КРЮЧ

  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.
Хаутман

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-signature-certifier, щоб спілкуватися з сервером 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.