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

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

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

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

вопрос задан 17.03.2009
Chathuranga Chandrasekara
12211 репутация

13 ответов


  • 190 рейтинг

    Это довольно просто, по крайней мере, с использованием 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:
    
    
    
    

    Вы в конечном итоге:

    • фу. jks - хранилище ключей в формате java.
    • фу. p12 - хранилище ключей в формате PKCS # 12.
    • фу. 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
    
    ответ дан Stobor, с репутацией 32025, 18.03.2009
  • 25 рейтинг

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

    ответ дан cmcginty, с репутацией 54783, 17.11.2012
  • 13 рейтинг

    Команда 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
    
    ответ дан erickson, с репутацией 216101, 17.03.2009
  • 11 рейтинг

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

    keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
    
    ответ дан sanghaviss, с репутацией 135, 20.05.2011
  • 5 рейтинг

    Упрощенные инструкции для преобразования файла JKS в формат PEM и KEY (. эл. , ключ):

    keytool -importkeystore -srckeystore  -destkeystore  -srcstoretype jks -deststoretype pkcs12 -destkeypass 
    
    openssl pkcs12 -in  -out 
    
    openssl x509 -outform der -in  -out 
    
    openssl rsa -in  -out 
    
    ответ дан asami, с репутацией 598, 12.01.2016
  • 2 рейтинг

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

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

    Затем я разделил пару открытый / закрытый ключ на два файла приватных. ключевой публичный. Pem и это работает!

    ответ дан Marco Luly, с репутацией 101, 4.10.2011
  • 1 рейтинг

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

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

    ответ дан Charlie Martin, с репутацией 89158, 17.03.2009
  • 1 рейтинг

    Преобразование хранилища ключей 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 'KeyStore в формате PEM. Тем не менее, он также печатает дополнительную информацию.
    2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" отфильтровывает все, что нам не нужно. У нас остались только PEMs всего в KeyStore.
    3. >> "myKeystore.pem" записать PEM в файл 'myKeyStore. PEM.
    ответ дан Mark Lagendijk, с репутацией 4588, 18.02.2016
  • 1 рейтинг

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

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

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

      Export PEM private key from JKS with Portcle

    ответ дан Marcio Jasinski, с репутацией 849, 27.04.2016
  • 0 рейтинг

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

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

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

    ответ дан whaefelinger, с репутацией 608, 31.08.2018
  • 0 рейтинг

    Первый дамп хранилища ключей из JKS в PKCS12

    1. keytool -importkeystore -srckeystore ~ ​​/. андроид / отладки. хранилище ключей - промежуточное хранилище ключей. p12 -srcstoretype JKS -deststoretype PKCS12

    Дамп нового файла pkcs12 в pem

    1. openssl pkcs12 -в промежуточном. p12 -узлы -из промежуточных. RSA. pem

    У вас должен быть как сертификат, так и закрытый ключ в формате pem. Разделите их. Поместите деталь между «НАЧАТЬ СЕРТИФИКАТ» и «КОНЕЦ СЕРТИФИКАТ» в сертификат. x509. PEM Поместите часть между «BEGIN RSA PRIVATE KEY» и «END RSA PRIVATE KEY» в частном порядке. RSA. PEM Преобразуйте закрытый ключ в формат pk8, как и ожидалось, signapk

    3. openssl pkcs8 -topk8 -outform DER -в частной. RSA. pem -inform PEM -out private. pk8 -nocrypt

    ответ дан nkalra0123, с репутацией 95, 5.06.2018
  • 0 рейтинг

    сначала создать файл хранилища ключей как

    C: \ Program Files \ Android \ Android Studio \ jre \ bin & gt; keytool -kystore androidkey. jks -genkeypair -alias androidkey

    Введите пароль хранилища ключей:
    Введите новый пароль еще раз:
    Ваше имя и фамилия? Неизвестно: Имя Фамилия
    Как называется ваша организационная единица? Неизвестный: Mobile Development
    Как называется ваша организация? Неизвестно: название вашей компании
    Как называется ваш город или населенный пункт? Как называется ваш штат или провинция?
    Что такое двухбуквенный код страны для данного устройства? Неизвестный: IN // нажмите ввод

    Теперь он попросит подтвердить

    Является ли CN = FirstName LastName, OU = Mobile Development, O = название вашей компании, L = CityName, ST = StateName, C = IN, верно? [нет]: да

    Введите ключевой пароль для (ВОЗВРАТ, если совпадает с паролем хранилища ключей): нажмите Enter, если вы хотите использовать тот же пароль

    Сгенерирован ключ

    , теперь вы можете просто получить файл pem, используя следующую команду

    C: \ Program Files \ Android \ Android Studio \ jre \ bin & gt; keytool -export -rfc -alias androidkey -file android_certificate. pem -keystore androidkey. JKS
    Введите пароль хранилища ключей:
    Сертификат хранится в файле

    ответ дан ankitdubey021, с репутацией 21, 10.03.2018
  • 0 рейтинг

    Попробуйте Keystore Explorer http: // keystore-explorer. org /

    KeyStore Explorer - это замена графического интерфейса с открытым исходным кодом для утилит командной строки Java keytool и jarsigner. Это также делает openssl / pkcs12.

    ответ дан Johnnyboy, с репутацией 9, 10.03.2017