Перетворення сховища Java у формат PEM


132

Я намагаюся перетворити з файлу зберігання ключів Java у файл PEM за допомогою keytool та appssl applications. Але я не зміг знайти хорошого способу здійснення конверсії. Будь-які ідеї?

Замість перетворення магазину ключів безпосередньо в PEM я спробував спершу створити файл PKCS12, а потім перетворити у відповідний PEM-файл та Keystore. Але я не зміг встановити зв’язок, використовуючи їх. (Зверніть увагу, що мені потрібні лише файл PEM і файл Keystore для здійснення захищеного з'єднання. Не існує обмеження, наприклад, "Почати з файлу зберігання файлів Java". :) Отже, починаючи з інших форматів прийнятно в моєму випадку)

Але бажаний спосіб прямого перетворення з jks в pem.

Відповіді:


214

Це досить просто, використовуючи jdk6 принаймні ...

bash $ keytool -keystore foo.jks -genkeypair -alias foo \
        -назви 'CN = foo.example.com, L = Мельбурн, ST = Вікторія, C = AU'
Введіть пароль магазину:  
Повторно введіть новий пароль: 
Введіть ключовий пароль для 
        (ПОВЕРНУЙТЕ, якщо такий самий, як пароль зберігання ключів):  
bash $ keytool -keystore foo.jks -exportcert -alias foo | \
       openssl x509 -inform der -text
Введіть пароль зберігання ключів: asdasd
Сертифікат:
    Дані:
        Версія: 3 (0x2)
        Серійний номер: 1237334757 (0x49c03ae5)
        Алгоритм підпису: dsaWithSHA1
        Емітент: C = AU, ST = Вікторія, L = Мельбурн, CN = foo.example.com
        Дійсність
            Не раніше: 18 березня 00:05:57 2009 GMT
            Не після: 16 червня 00:05:57 2009 GMT
        Тема: C = AU, ST = Вікторія, L = Мельбурн, CN = foo.example.com
        Інформація про публічний ключ:
            Алгоритм відкритого ключа: dsaEncryption
            Відкритий ключ DSA:
                паб: 
                    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
                    7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7:
 

bash $ keytool -importkeystore -srckeystore foo.jks \
       -destkeystore foo.p12 \
       -srcstoretype jks \
       -deststoretype pkcs12
Введіть пароль зберігання ключів:  
Повторно введіть новий пароль: 
Введіть пароль зберігання джерела:  
Запис для псевдоніму foo успішно імпортований.
Команда імпорту виконана: 1 імпорт успішно імпортовано, 0 записів не вдалося або скасовано

bash $ openssl pkcs12 -in foo.p12 -out foo.pem
Введіть пароль імпорту:
MAC підтверджено
Введіть пропускну фразу PEM:
Підтвердження - введіть пропускну фразу PEM:

bash $ openssl x509 -text -in foo.pem
Сертифікат:
    Дані:
        Версія: 3 (0x2)
        Серійний номер: 1237334757 (0x49c03ae5)
        Алгоритм підпису: dsaWithSHA1
        Емітент: C = AU, ST = Вікторія, L = Мельбурн, CN = foo.example.com
        Дійсність
            Не раніше: 18 березня 00:05:57 2009 GMT
            Не після: 16 червня 00:05:57 2009 GMT
        Тема: C = AU, ST = Вікторія, L = Мельбурн, CN = foo.example.com
        Інформація про публічний ключ:
            Алгоритм відкритого ключа: dsaEncryption
            Відкритий ключ DSA:
                паб: 
                    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
                    7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7:
 

bash $ openssl dsa -text -in foo.pem
прочитати ключ DSA
Введіть пропускну фразу PEM:
Закритий ключ (1024 біт)
приват:
    00: 8f: b1: af: 55: 63: 92: 7c: d2: 0f: e6: f3: a2: f5: ff:
    1а: 7а: фе: 8с: 39: дд
паб: 
    00: e2: 66: 5c: e0: 2e: da: e0: 6b: a6: aa: 97: 64: 59: 14:
    7e: a6: 2e: 5a: 45: f9: 2f: b5: 2d: f4: 34: 27: e6: 53: c7:



Ви закінчуєте:

  • foo.jks - магазин брелоків у форматі java.
  • foo.p12 - зберігання клавіш у форматі PKCS # 12.
  • foo.pem - всі клавіші та символи від зберігання клавіш, у форматі PEM.

(Цей останній файл, якщо вам подобається, можна розділити на ключі та сертифікати.)


Підсумок команд - для створення сховища ключів JKS:

keytool -keystore foo.jks -genkeypair -alias foo \
    -dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU'

Підсумок команд - перетворити сховище ключів JKS у сховище PKCS # 12, а потім у файл PEM:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

якщо у вашій сховищі ключів JKS є більше одного сертифіката, і ви хочете експортувати лише сертифікат і ключ, пов’язаний з одним із псевдонімів, ви можете використовувати таку варіацію:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcalias foo \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

Підсумок команд - для порівняння зберігання ключів JKS з файлом PEM:

keytool -keystore foo.jks -exportcert -alias foo | \
   openssl x509 -inform der -text

openssl x509 -text -in foo.pem

openssl dsa -text -in foo.pem

12
Довірені сертифікати не підтримуються у цьому методі: це, на жаль, обмеження формату PKS12, я вважаю: java.sun.com/javase/6/docs/technotes/guides/security/jsse/… (розділ про java.security.KeyStoreException : TrustedCertEntry не підтримується)
andygavin

2
У мене старіший файл JKS. Не вдалося експортувати, використовуючи описаний вище метод. Нарешті я зміг це зробити, встановивши keytool arg '-destkeypass' на манекенне значення. 'keytool' навіть викликає попередження про те, що він ігнорує значення destkeypass? Жодна інша техніка не працювала б. Використання підказок не вийшло, працює лише з аргументу командного рядка. Повинна бути помилка в експорті PKCS12, хтось може прокоментувати?
cmcginty

4
"openssl pkcs12 -in foo.p12 -out foo.pem" видає таку помилку Введіть пароль імпорту: MAC перевірено ОК Помилка виведення ключів та сертифікатів 139848775526048: помилка: 06065064: цифрові процедури конвертів: EVP_DecryptFinal_ex: неправильне розшифрування: evp_enc.c: 539 : 139848775526048: помилка: 23077074: PKCS12 процедура: PKCS12_pbe_crypt: PKCS12 cipherfinal помилка: p12_decr.c: 104: 139848775526048: помилка: 2306A075: PKCS12 підпрограми: PKCS12_item_decrypt_d2i: PKCS12 РОР крипта помилка: p12_decr.c: 130. Яке рішення для цього?
Udara SS Liyanage

1
попередження для інших людей, команда keytool чомусь потребує виконання, мені довелося почекати 30 секунд, поки буде здійснено експорт
Nicolas Mommaerts

1
@ UdaraS.SLiyanage: подивіться на відповідь Кейсі на рішення
Ніколя Маммаертс

29

Я постійно отримував помилки під opensslчас використання команди StoBor:

MAC verified OK
Error outputting keys and certificates
139940235364168:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:535:
139940235364168:error:23077074:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 cipherfinal error:p12_decr.c:97:
139940235364168:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error:p12_decr.c:123:

Чомусь тільки мій стиль командування буде працювати для мого файлу JKS

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -srcalias mykey \
   -deststoretype pkcs12 \
   -destkeypass DUMMY123

Ключ був налаштуванням destkeypass, значення аргументу не мало значення.


6
Міркування можна знайти тут: herongyang.com/PKI/… Destkeypass НЕ має значення btw
Nicolas Mommaerts

Я підтримав цей коментар, але він заслуговує на те, щоб це було власне повідомлення. Тут було важко знайти.
Річі Річ

15

keytoolКоманда не дозволить експортувати закритий ключ зі сховища ключів. Для цього вам потрібно написати якийсь код Java. Відкрийте сховище ключів, дістаньте потрібний вам ключ і збережіть його у файлі у форматі PKCS # 8. Збережіть і пов’язаний сертифікат.

KeyStore ks = KeyStore.getInstance("jks");
/* Load the key store. */
...
char[] password = ...;
/* Save the private key. */
FileOutputStream kos = new FileOutputStream("tmpkey.der");
Key pvt = ks.getKey("your_alias", password);
kos.write(pvt.getEncoded());
kos.flush();
kos.close();
/* Save the certificate. */
FileOutputStream cos = new FileOutputStream("tmpcert.der");
Certificate pub = ks.getCertificate("your_alias");
cos.write(pub.getEncoded());
cos.flush();
cos.close();

Використовуйте утиліти OpenSSL для перетворення цих файлів (які є у двійковому форматі) у формат PEM.

openssl pkcs8 -inform der -nocrypt < tmpkey.der > tmpkey.pem
openssl x509 -inform der < tmpcert.der > tmpcert.pem

Спасибі erickson .. Висновок: "Ми не можемо виконати пряме перетворення з JKS в PEM, просто використовуючи утиліти keytool і openssl". Я прав?
Чатуранга Чандрасекара

4
Вам потрібно лише написати код до Java 1.4 - з Java 5 далі, keytool та openssl можна комбінувати для здійснення двоступеневого перетворення з JKS -> PKCS # 12 -> PEM. Однак написання власного інструменту для ключів - це єдиний спосіб виконати Пряму конверсію від JKS -> PEM.
Стобор

Я думаю, що це від JDK 6 далі. Але так, зараз імпорт PKCS №12 підтримується.
erickson

13

Пряме перетворення з jks в pem-файл за допомогою keytool

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem

10
Так, сертифікат експортує. Однак основна інформація не експортується ...
Stobor

Це точна проста відповідь на те, що я шукав на десятках сторінок keytoolі jbossdoc без успіху. Дякую!
kratenko

15
ЦЕ НЕ ЕКСПОРТИВАЄ ПРИЄДНА КЛЮЧОВА ІНФОРМАЦІЯ
Джеймс

1
Це експортує сертифікат відкритого ключа
asami

Я спробував виконати цю команду. Він вимагає пароля, Введіть пароль магазину клавіш: помилка keytool: java.io.IOException: Підручник з помилками був підроблений, або пароль був неправильним. Я використовував пароль як (пароль), але він кидав ту саму помилку
Мохіт Сінгх

9

Спрощені інструкції для перетворення файлу JKS у формат PEM та KEY (.crt & .key):

keytool -importkeystore -srckeystore <Source-Java-Key-Store-File> -destkeystore <Destination-Pkcs12-File> -srcstoretype jks -deststoretype pkcs12 -destkeypass <Destination-Key-Password>

openssl pkcs12 -in <Destination-Pkcs12-File> -out <Destination-Pem-File>

openssl x509 -outform der -in <Destination-Pem-File> -out <Destination-Crt-File>

openssl rsa -in <Destination-Pem-File> -out <Destination-Key-File>


2

Перетворення JKS KeyStore в один файл PEM легко здійснити за допомогою наступної команди:

keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"

Пояснення:

  1. keytool -list -rfc -keystore "myKeystore.jks"перелічує все у KeyStore 'myKeyStore.jks' у форматі PEM. Однак він також друкує додаткову інформацію.
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d"фільтрує все, що нам не потрібно. У нас залишилися лише ПЕМ-адреси всього в KeyStore.
  3. >> "myKeystore.pem" запишіть PEM у файл 'myKeyStore.pem'.

3
bash
:!

1
@ user3217883 Ви можете спробувати щось на зразок sed "s/^\-*BEGIN [A-Z]*\-*$//g;s/^\-*END [A-Z]*\-*$//g"(з гну sed), але я не впевнений, що цього достатньо, якщо у вашій крамниці є більше одного керта
Idriss Neumann

якщо ви отримуєте bash: !d": event not found: для удару знак оклику - це коротка клавіша для використання команди. Щоб скористатися цією відповіддю, вам потрібно використати апострофи замість лапок для параметра, який використовується як -e для sedkeytool -list -rfc -keystore "myKeystore.jks" | sed -e '/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d' >> "myKeystore.pem"
B.Adler

На жаль, це тільки експортує сертифікат, а не закриті ключ
Maddin

2

Спочатку скиньте сховище ключів від JKS до PKCS12

1. keytool -importkeystore -srckeystore ~ ​​/ .android / debug.keystore -destkeystore intermediate.p12 -srcstoretype JKS -deststoretype PKCS12

Скиньте новий pkcs12 файл у pem

  1. openssl pkcs12 -in intermediate.p12 -nodes -out intermediate.rsa.pem

Ви повинні мати як cert, так і приватний ключ у форматі pem. Розділіть їх. Помістіть частину між "BEGIN CERTIFICATE" та "END CERTIFICATE" в cert.x509.pem Поставте частину між "BEGIN RSA PRIVATE KEY" та "END RSA PRIVATE KEY" у private.rsa.pem Перетворіть приватний ключ у формат pk8 як очікується сигнапком

3. openssl pkcs8 -topk8 -formform DER -в private.rsa.pem -inform PEM -out private.pk8 -nocrypt



1

Якщо у вас не встановлено openssl, і ви шукаєте швидке рішення, є програмне забезпечення під назвою portcle, яке дуже корисне і мало для завантаження.

Недоліком є ​​те, що наскільки я знаю, немає командного рядка. Але з графічного інтерфейсу досить просто експортувати приватний ключ PEM:

  1. Відкрийте вам магазин ключів JKS
  2. Клацніть правою кнопкою миші на введенні вашого приватного ключа та виберіть експорт
  3. Виберіть приватний ключ та сертифікати та формат PEM

    Експорт приватного ключа PEM з JKS за допомогою Portcle


0

Спробуйте Keystore Explorer http://keystore-explorer.org/

Провідник KeyStore - це заміна графічного інтерфейсу з відкритим кодом для утиліти командного рядка Java keytool та jarsigner. Це також openssl / pkcs12.


0

спочатку створіть файл зберігання ключів як

C: \ Файли програм \ Android \ Android Studio \ jre \ bin> keytool -keystore androidkey.jks -genkeypair -alias androidkey

Введіть пароль для зберігання клавіш:
Введіть новий пароль:
яке ваше ім’я та прізвище? Невідомо: FirstName LastName
Як називається ваш організаційний підрозділ? Невідомо: Мобільний розвиток
Як називається ваша організація? Невідомо: назва вашої компанії
Як називається ваше місто чи населений пункт? Як називається ваша держава чи провінція?
Який двобуквенний код країни для цієї одиниці? Невідомо: IN // натисніть Enter

Тепер він попросить підтвердити

Чи CN = FirstName LastName, OU = Mobile Development, O = назва вашої компанії, L = CityName, ST = StateName, C = IN правильно? [немає]: так

Введіть ключ ключа для (ПОВЕРНУТИСЯ, якщо такий самий, як пароль зберігання ключів): натисніть клавішу Enter, якщо ви хочете той самий пароль

ключ був згенерований, тепер ви можете просто отримати файл pem за допомогою наступної команди

C: \ Файли програми \ Android \ Android Studio \ jre \ bin> keytool -export -rfc -alias androidkey -file android_certificate.pem -keystore androidkey.jks
Введіть пароль зберігання клавіш :
Сертифікат зберігається у файлі


0

Перетворення сховища Java у формат PEM

Найточніша відповідь з усіх повинна бути в тому, що це НЕ можливо.

Клавіатура Java - це лише сховище криптографічних ключів та сертифікатів, тоді як PEM - це формат файлу лише для сертифікатів X.509.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.