Преобразование хранилища ключей Java в формат PEM
-
19-08-2019 - |
Вопрос
Я пытаюсь преобразовать файл хранилища ключей Java в файл PEM с помощью приложений keytool и openssl.Но я не смог найти хороший способ выполнить преобразование.Есть идеи?
Вместо преобразования хранилища ключей непосредственно в PEM я попытался сначала создать файл PKCS12, а затем преобразовать его в соответствующий файл PEM и хранилище ключей.Но мне не удалось установить соединение с их помощью.(Обратите внимание, что для реализации защищенного соединения мне нужны только файл PEM и файл хранилища ключей.Нет никаких ограничений, таких как «Начать с файла хранилища ключей Java».:) Так что начинать с других форматов в моем случае приемлемо)
Но предпочтителен метод прямого преобразования из jks в pem.
Решение
Это довольно просто, по крайней мере, используя 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 — хранилище ключей в формате 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
Другие советы
Я продолжал получать ошибки от 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
, значение аргумента не имело значения.
Команда 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
Прямое преобразование из файла jks в файл pem с помощью инструмента keytool
keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
Упрощенные инструкции для преобразования файла JKS в формат PEM и KEY (.crt & amp; .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>
Я нашел очень интересное решение:
http://www.swview.org/node/191
Затем я разделил пару открытый / закрытый ключ на два файла: private.key publi.pem, и это работает!
Ну, 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
Может быть, подробнее о том, что такое ошибка / сбой? Р>
Преобразование хранилища ключей JKS в один файл 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.
Если у вас не установлен openssl и вы ищете быстрое решение, есть программное обеспечение, называемое portcle который очень полезен и мал для загрузки.
Недостаток в том, что, насколько я знаю, нет командной строки. Но из графического интерфейса довольно просто экспортировать закрытый ключ PEM:
<Ол>Выберите закрытый ключ и сертификаты, а также формат PEM
Попробуйте использовать Keystore Explorer http://keystore-explorer.org/
KeyStore Explorer - это замена графического интерфейса с открытым исходным кодом для утилит командной строки Java keytool и jarsigner. Это также делает openssl / pkcs12.
сначала создайте файл хранилища ключей как
C: \ Program Files \ 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: \ Program Files \ Android \ Android Studio \ jre \ bin > keytool -export -rfc -alias androidkey -файл android_certificate.pem -keystore androidkey.jks
Введите пароль хранилища ключей:
Сертификат хранится в файле
Сначала сбросьте хранилище ключей из JKS в PKCS12.
1. keytool -importkeystore -srckeystore ~/.android/debug.keystore -destkeystore промежуточный.p12 -srcstoretype JKS -deststoretype PKCS12
Скопируйте новый файл pkcs12 в pem.
- openssl pkcs12 -in промежуточный.p12 -nodes -out промежуточный.rsa.pem
У вас должен быть сертификат и закрытый ключ в формате pem.Разделите их.Поместите деталь между «Сертификатом BEGIN» и «Конечным сертификатом» в CERT.X509.PEM. Поместите деталь между «Begin RSA Private Key» и «Cond RSA Private» в private.rsa.pem Преобразуйте закрытый ключ в формат PK8 как Ожидается TINGAPK
3. openssl pkcs8 -topk8 -outform DER -in Private.rsa.pem -inform PEM -out Private.pk8 -nocrypt
Преобразование хранилища ключей Java в формат PEM
Самый точный ответ из всех должен состоять в том, что это НЕ возможно. Р>
Хранилище ключей Java - это просто хранилище криптографических ключей и сертификатов, тогда как PEM - это формат файлов только для сертификатов X.509.