Вопрос

Я пытаюсь преобразовать файл хранилища ключей 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"

Объяснение:

  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.

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

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

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

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

  • Попробуйте использовать 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.

    1. 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.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top