Преобразование Java Keystore в формат PEM
Я пытаюсь преобразовать из файла хранилища ключей Java в файл PEM с помощью приложений keytool и openssl. Но я не мог найти хороший способ сделать конверсию. Есть идеи?
Вместо преобразования хранилища ключей непосредственно в PEM я попытался сначала создать файл PKCS12, а затем преобразовать в соответствующий файл PEM и Keystore. Но я не мог установить соединение, используя их. (Обратите внимание, что мне просто нужен файл PEM и файл Keystore для реализации защищенного соединения. Никаких ограничений, таких как "Начать с файла хранилища java", не существует.:) Итак, начало из других форматов приемлемо для моего случая)
Однако предпочтительным является метод прямого преобразования от jks до pem.
Ответы
Ответ 1
Это довольно просто, используя jdk6 по крайней мере...
bash$ keytool -keystore foo.jks -genkeypair -alias foo \
-dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU'
Enter keystore password:
Re-enter new password:
Enter key password for
(RETURN if same as keystore password):
bash$ keytool -keystore foo.jks -exportcert -alias foo | \
openssl x509 -inform der -text
Enter keystore password: asdasd
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1237334757 (0x49c03ae5)
Signature Algorithm: dsaWithSHA1
Issuer: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com
Validity
Not Before: Mar 18 00:05:57 2009 GMT
Not After : Jun 16 00:05:57 2009 GMT
Subject: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com
Subject Public Key Info:
Public Key Algorithm: dsaEncryption
DSA Public Key:
pub:
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
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
Entry for alias foo successfully imported.
Import command completed: 1 entries successfully imported, 0 entries failed or cancelled
bash$ openssl pkcs12 -in foo.p12 -out foo.pem
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
bash$ openssl x509 -text -in foo.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1237334757 (0x49c03ae5)
Signature Algorithm: dsaWithSHA1
Issuer: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com
Validity
Not Before: Mar 18 00:05:57 2009 GMT
Not After : Jun 16 00:05:57 2009 GMT
Subject: C=AU, ST=Victoria, L=Melbourne, CN=foo.example.com
Subject Public Key Info:
Public Key Algorithm: dsaEncryption
DSA Public Key:
pub:
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
read DSA key
Enter PEM pass phrase:
Private-Key: (1024 bit)
priv:
00:8f:b1:af:55:63:92:7c:d2:0f:e6:f3:a2:f5:ff:
1a:7a:fe:8c:39:dd
pub:
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 - keystore в формате java.
- foo.p12 - keystore в формате 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
Ответ 2
Я продолжал получать ошибки от 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
, значение аргумента не имело значения.
Ответ 3
Команда 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
Ответ 4
Прямое преобразование из jks в файл pem с помощью keytool
keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
Ответ 5
Упрощенные инструкции для преобразования файла 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
Я нашел очень интересное решение:
http://www.swview.org/node/191
Затем я разделил открытый/закрытый ключ пары на два файла private.key publi.pem, и он работает!
Ответ 7
Ну, 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
Возможно, более подробная информация о том, что такое ошибка/сбой?
Ответ 8
Преобразование JKS KeyStore в один файл PEM можно легко выполнить с помощью следующей команды:
keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"
Пояснение:
-
keytool -list -rfc -keystore "myKeystore.jks"
перечисляет все в ключевом хранилище myKeyStore.jks в формате PEM. Однако он также печатает дополнительную информацию.
-
| sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d"
отфильтровывает все, что нам не нужно. У нас остались только PEM всего в KeyStore.
-
>> "myKeystore.pem"
напишите PEM в файл myKeyStore.pem.
Ответ 9
Если у вас нет установленного openssl и вы ищете быстрое решение, есть программное обеспечение под названием portcle, которое очень полезно и небольшой для загрузки.
Недостатком является то, что нет никакой командной строки, насколько я знаю.
Но из графического интерфейса довольно просто экспортировать закрытый ключ PEM:
Ответ 10
Попробуйте проводник Keystore Explorer http://keystore-explorer.org/
KeyStore Explorer - это замена графического интерфейса с открытым исходным кодом для инструментов командной строки командной строки Java и jarsigner. Он также открывает/pkcs12.
Ответ 11
сначала создайте файл хранилища ключей как
C:\Program Files\Android\Android Studio\jre\bin > keytool -keystore androidkey.jks -genkeypair -alias androidkey
Введите пароль хранилища ключей:
Повторно введите новый пароль:
Ваше имя и фамилия? Неизвестно: FirstName LastName
Как называется ваше подразделение? Неизвестно: Мобильная разработка
Как называется ваша организация? Неизвестно: название вашей компании
Как называется ваш город или местность?
Как называется ваше государство или провинция?
Что такое двухбуквенный код страны для данного устройства? Неизвестно: IN//нажмите enter
Теперь он попросит подтвердить
Является ли CN = FirstName LastName, OU = Мобильная разработка, O = название вашей компании, L = CityName, ST = StateName, C = IN правильно? [no]: yes
Введите пароль ключа для (RETURN, если это так же, как пароль хранилища ключей): нажмите enter, если вы хотите использовать тот же пароль
был создан, теперь вы можете просто получить pem файл, используя следующую команду
C:\Program Files\Android\Android Studio\jre\bin > keytool -export -rfc -alias androidkey -file android_certificate.pem -keystore androidkey.jks
Введите пароль хранилища ключей:
Сертификат, хранящийся в файле