Преобразование 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:

  • Откройте хранилище ключей JKS
  • Щелкните правой кнопкой мыши по своей личной записи и выберите экспорт
  • Выберите закрытый ключ и сертификаты и формат PEM

    Экспорт личного ключа PEM из JKS с помощью Portcle

Ответ 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
Введите пароль хранилища ключей:
Сертификат, хранящийся в файле