it-swarm.com.ru

Преобразование хранилища ключей Java в формат PEM

Я пытаюсь преобразовать из файла хранилища ключей Java в файл PEM с помощью приложений keytool и openssl. Но я не мог найти хороший способ сделать преобразование. Есть идеи? 

Вместо преобразования хранилища ключей непосредственно в PEM я попытался сначала создать файл PKCS12, а затем преобразовать в соответствующий файл PEM и хранилище ключей. Но я не мог установить соединение, используя их. (Обратите внимание, что мне просто нужен PEM-файл и файл Keystore для реализации защищенного соединения. Нет ограничений, таких как «Запуск из файла хранилища ключей Java». :) Поэтому в моем случае приемлемо использование других форматов)

Но метод прямого преобразования из jks в pem предпочтительнее.

116
Chathuranga Chandrasekara

Это довольно просто, используя jdk6 по крайней мере ... 

 bash $ keytool -keystore foo.jks -genkeypair -alias foo\
 -dname '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 по Гринвичу 
 Не после: 16 июня 00:05:57 2009 по Гринвичу 
 Тема: C = AU, ST = Виктория, L = Мельбурн, CN = foo.example.com 
 Информация об открытом ключе субъекта: 
 Алгоритм открытого ключа: dsaEncryption 
 Открытый ключ DSA: 
 паб: 
 00: е2: 66: 5с: е0: 2e: да: е0: 6b: а6: аа: 97: 64: 59: 14: 
 7e: а6: 2e: 5а: 45: f9: 2f: В5: 2d: f4: 34: 27: е6: 53: с7: 
 

 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 проверено OK 
 Введите пароль 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 по Гринвичу 
 Не после: 16 июня 00:05:57 2009 по Гринвичу 
 Тема: C = AU, ST = Виктория, L = Мельбурн, CN = foo.example.com 
 Информация об открытом ключе субъекта: 
 Алгоритм открытого ключа: dsaEncryption 
 Открытый ключ DSA: 
 паб: 
 00: е2: 66: 5с: е0: 2e: да: е0: 6b: а6: аа: 97: 64: 59: 14: 
 7e: а6: 2e: 5а: 45: f9: 2f: В5: 2d: f4: 34: 27: е6: 53: с7: 
 

 bash $ openssl dsa -text -in foo.pem
read DSA key 
 Введите пароль PEM: 
 Private-Key: (1024 бит) 
 priv: 
 00: 8f: b1: аф: 55: 63: 92: 7в: d2: 0f: е6: f3: а2: f5: ФФ: 
 1a: 7a: fe: 8c: 39: дд 
 Паб: 
 00: е2: 66: 5с: е0: 2e: да: е0: 6b: а6: аа: 97: 64: 59: 14: 
 7e: а6: 2e: 5а: 45: f9: 2f: В5: 2d: f4: 34: 27: е6: 53: с7: 



Вы заканчиваете с:

  • 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
194
Stobor

Я продолжал получать ошибки от 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, значение аргумента не имело значения.

29
cmcginty

Команда 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
13
erickson

Прямое преобразование из jks в pem файл с помощью keytool

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

Упрощенные инструкции для преобразования файла 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>
6
asami

Я нашел очень интересное решение:

http://www.swview.org/node/191

Затем я разделил пару открытый/закрытый ключ на два файла: private.key publi.pem, и это работает!

2
Marco Luly

Ну, OpenSSL должен сделать это легко из файла # 12:

openssl pkcs12 -in pkcs-12-certificate-file -out pem-certificate-file
openssl pkcs12 -in pkcs-12-certificate-and-key-file -out pem-certificate-and-key-file

Может быть, более подробно о том, что ошибка/сбой? 

1
Charlie Martin

Преобразование хранилища ключей JKS в один файл 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" перечисляет все в хранилище ключей myKeyStore.jks в формате PEM. Тем не менее, он также печатает дополнительную информацию.
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" отфильтровывает все, что нам не нужно. У нас остались только PEMs всего в KeyStore.
  3. >> "myKeystore.pem" записать PEM в файл myKeyStore.pem.
1
Mark Lagendijk

Если у вас не установлен openssl и вы ищете быстрое решение, есть программное обеспечение под названием portcle , которое очень полезно и мало для скачивания.

Недостатком является то, что, насколько я знаю, командной строки нет. Но из графического интерфейса довольно просто экспортировать закрытый ключ PEM:

  1. Откройте свой магазин ключей JKS
  2. Щелкните правой кнопкой мыши на секретном ключе и выберите экспорт
  3. Выберите закрытый ключ и сертификаты и формат PEM

     Export PEM private key from JKS with Portcle

1
Marcio Jasinski

Преобразование хранилища ключей Java в формат PEM

Самый точный ответ из всех должен состоять в том, что это НЕ возможно. 

Хранилище ключей Java - это просто хранилище криптографических ключей и сертификатов, в то время как PEM - это формат файлов только для сертификатов X.509.

0
whaefelinger

Сначала сбросьте хранилище ключей из JKS в PKCS12

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

Дамп нового файла pkcs12 в pem

  1. openssl pkcs12 - в промежуточном.p12 -узлах - в промежуточном.rsa.pem

Вы должны иметь как сертификат, так и закрытый ключ в формате pem. Разделите их . Поместите часть между «НАЧАТЬ СЕРТИФИКАТ» и «КОНЕЦ СЕРТИФИКАТ» в cert.x509.pem Поместите часть между «НАЧАТЬ ЧАСТНЫЙ КЛЮЧ RSA» и «КОНЕЦ ЧАСТНЫЙ КЛЮЧ RSA» в private.rsa .pem Конвертировать закрытый ключ в формат pk8, как и ожидалось от signapk

3 . openssl pkcs8 -topk8 -outform DER -in private.rsa.pem -информ PEM -out private.pk8 -nocrypt

0
nkalra0123

сначала создайте файл хранилища ключей как

C:\Program Files\Android\Android Studio\jre\bin>keytool -keystore androidkey.jks -genkeypair -alias androidkey 

Введите пароль хранилища ключей:
Повторно введите новый пароль:
Ваше имя и фамилия? Неизвестный: Имя Фамилия
Как называется ваша организационная единица? Неизвестный: Мобильная разработка
Как называется ваша организация? Неизвестный: название вашей компании
Как называется ваш город или населенный пункт? Как называется ваш штат или провинция?
Что такое двухбуквенный код страны для данного устройства? Неизвестно: IN // нажмите ввод 

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

Является ли CN = FirstName LastName, OU = Mobile Development, O = название вашей компании, L = CityName, ST = StateName, C = IN, верно? [Нет]: да 

Введите пароль для ключа (ВОЗВРАТ, если такой же, как пароль хранилища ключей): нажмите ввод, если вы хотите использовать тот же пароль

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

C:\Program Files\Android\Android Studio\jre\bin>keytool -export -rfc -alias androidkey -file Android_certificate.pem -keystore androidkey.jks
Введите пароль хранилища ключей:
Сертификат хранится в файле 

0
ankitdubey021

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

KeyStore Explorer - это замена графического интерфейса с открытым исходным кодом для утилит командной строки Java keytool и jarsigner. Это также делает openssl/pkcs12.

0
Johnnyboy