Преобразование хранилища ключей Java в формат PEM - PullRequest
119 голосов
/ 17 марта 2009

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

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

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

Ответы [ 13 ]

201 голосов
/ 18 марта 2009

Это довольно просто, хотя бы с использованием 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
29 голосов
/ 17 ноября 2012

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

13 голосов
/ 17 марта 2009

Команда 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
12 голосов
/ 20 мая 2011

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

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
7 голосов
/ 12 января 2016

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

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

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

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

1 голос
/ 27 апреля 2016

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

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

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

    Export PEM private key from JKS with Portcle

1 голос
/ 18 февраля 2016

Преобразование хранилища ключей 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" отфильтровывает все, что нам не нужно. У нас остались только PEM из всего в KeyStore.
  3. >> "myKeystore.pem" записать PEM в файл myKeyStore.pem.
1 голос
/ 17 марта 2009

Ну, 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

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

0 голосов
/ 31 августа 2018

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

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

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

...