Konwersja Klucza Java do formatu PEM

Próbuję przekonwertować z pliku keystore Java do pliku PEM za pomocą aplikacji keytool i openssl. Ale nie mogłem znaleźć dobrego sposobu na nawrócenie. Jakieś pomysły?

Zamiast konwertować keystore bezpośrednio do PEM próbowałem najpierw utworzyć plik PKCS12, a następnie przekształcić go w odpowiedni plik PEM i Keystore. Ale nie mogłem nawiązać połączenia za ich pomocą. (Zauważ, że potrzebuję tylko pliku PEM i Pliku Keystore, aby zaimplementować bezpieczne połączenie. Tam nie ma ograniczeń jak "Start from a Java keystore file". :) Więc startowanie z innych formatów jest dopuszczalne w moim przypadku)

Ale preferowana jest metoda bezpośredniej konwersji z jks na pem.

Author: Randall, 2009-03-17

13 answers

To całkiem proste, przynajmniej używając 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:



Kończy się na:

  • foo.jks-keystore w formacie java.
  • foo.p12-keystore w formacie PKCS#12.
  • foo.pem - wszystkie klucze i certy z keystore, w formacie PEM.

(ten ostatni plik można podzielić na klucze i certyfikaty, jeśli chcesz.)


Podsumowanie poleceń-do utworzenia JKS keystore:

keytool -keystore foo.jks -genkeypair -alias foo \
    -dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU'

Podsumowanie poleceń-do konwersji JKS keystore do PKCS#12 keystore, a następnie do pliku PEM:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

Jeśli masz więcej niż jeden certyfikat w magazynie kluczy JKS i chcesz wyeksportować tylko certyfikat i klucz skojarzony z jednym z aliasów, możesz użyć następującej odmiany:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcalias foo \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

Podsumowanie polecenia-porównanie JKS keystore do pliku 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
 222
Author: Stobor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-04 00:33:30

Ciągle otrzymywałem błędy z {[2] } przy użyciu polecenia Stobora:

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:

Z jakiegoś powodu, tylko ten styl polecenia będzie działał dla mojego pliku JKS

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -srcalias mykey \
   -deststoretype pkcs12 \
   -destkeypass DUMMY123

Klucz był ustawiany destkeypass, wartość argumentu nie miała znaczenia.

 29
Author: cmcginty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-19 08:00:47

Polecenie keytool nie pozwoli na eksport klucza prywatnego z magazynu kluczy. Aby to zrobić, musisz napisać jakiś kod Javy. Otwórz magazyn kluczy, Pobierz potrzebny klucz i zapisz go do pliku w formacie PKCS # 8. Zapisz również powiązany certyfikat.

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();

Użyj narzędzi OpenSSL do konwersji tych plików (które są w formacie binarnym) do formatu PEM.

openssl pkcs8 -inform der -nocrypt < tmpkey.der > tmpkey.pem
openssl x509 -inform der < tmpcert.der > tmpcert.pem
 15
Author: erickson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-17 05:38:19

Bezpośrednia konwersja z jks do pliku pem za pomocą keytool

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
 15
Author: sanghaviss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-02 10:49:39

Uproszczona Instrukcja konwersji pliku JKS do formatu PEM i klucza (.crt & .klucz):

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>
 9
Author: asami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-12 13:07:17

Znalazłem bardzo ciekawe rozwiązanie:

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

Następnie podzieliłem parę klucz publiczny / prywatny na dwa pliki prywatne.key publi.pem i działa!

 2
Author: Marco Luly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-08 21:41:26

Konwersja JKS KeyStore do pojedynczego pliku PEM może być łatwo wykonana za pomocą następującego polecenia:

keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"

Wyjaśnienie:

  1. keytool -list -rfc -keystore "myKeystore.jks" wymienia wszystko w ' myKeyStore.KeyStore jks w formacie PEM. Jednak drukuje również dodatkowe informacje.
  2. Filtruje wszystko, czego nie potrzebujemy. Pozostało nam tylko PEMs wszystkiego w KeyStore.
  3. >> "myKeystore.pem" Zapisz PEMs do pliku ' myKeyStore.pem".
 2
Author: Mark Lagendijk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 16:02:12

Najpierw zrzuć keystore z JKS do PKCS12

1. keytool-importkeystore-srckeystore~/.android / debug.keystore-destkeystore intermediate.p12-srcstoretype JKS-deststoretype PKCS12

Wrzuć nowy plik pkcs12 do pem

  1. openssl pkcs12 - w intermediate.p12-nodes-out intermediate.rsa.pem

Powinieneś mieć zarówno cert, jak i klucz prywatny w formacie pem. Rozdziel ich. Umieść część pomiędzy "BEGIN CERTIFICATE" i " END Certyfikat " do cert.x509.pem Umieść część pomiędzy" BEGIN RSA PRIVATE KEY "I" END RSA PRIVATE KEY " w private.rsa.pem Konwertuj klucz prywatny do formatu pk8 zgodnie z oczekiwaniami signapk

3. OpenSSL pkcs8-topk8-outform DER-in private.rsa.pem-inform pem-out private. pk8-nocrypt

 2
Author: nkalra0123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 10:25:12

Cóż, OpenSSL powinien zrobić to ręcznie z pliku #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

Może więcej szczegółów na temat tego, co to jest błąd/awaria?

 1
Author: Charlie Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-17 03:46:56

Jeśli nie masz zainstalowanego openssl i szukasz szybkiego rozwiązania, istnieje oprogramowanie o nazwie portcle , które jest bardzo przydatne i małe do pobrania.

Wadą jest to, że nie ma linii poleceń, o ile wiem. Ale z GUI, eksport klucza prywatnego PEM jest dość prosty:

  1. otwórz Sklep z kluczami JKS
  2. Kliknij prawym przyciskiem myszy na wpis klucza prywatnego i wybierz Eksportuj
  3. Wybierz klucz prywatny i certyfikaty oraz Format PEM

    Eksport klucza prywatnego PEM z JKS za pomocą Portcle

 1
Author: Marcio Jasinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-27 13:41:54

Spróbuj Keystore Explorer http://keystore-explorer.org/

Keystore Explorer jest otwartym interfejsem graficznym dla programów wiersza poleceń Javy keytool i jarsigner. Obsługuje również openssl / pkcs12.

 0
Author: Johnnyboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-10 20:07:08

Najpierw Utwórz plik keystore jako

C:\Program Files \ Android \ Android Studio \ jre \ bin>keytool-keystore androidkey.jks-genkeypair-alias androidkey

Wpisz hasło keystore:
Wprowadź ponownie nowe hasło:
Jak masz na imię i nazwisko? Unknown: FirstName LastName
Jak nazywa się Twoja jednostka organizacyjna? Unknown: Mobile Development
Jak nazywa się Twoja organizacja? Unknown: Twoja firma nazwa
Jak nazywa się Twoje miasto lub miejscowość? Jak nazywa się twój stan lub Prowincja?
jaki jest dwuliterowy kod kraju dla tej jednostki? Unknown: in / / press enter

Teraz poprosi o potwierdzenie

Czy CN = FirstName LastName, OU=Mobile Development, O = your company name, L=CityName, ST=StateName, C = in jest poprawne? [nie]: tak

Wprowadź hasło klucza dla (Zwróć, jeśli tak samo jak hasło keystore): naciśnij enter, jeśli want same password

Klucz został wygenerowany, teraz możesz po prostu pobrać plik pem używając następującego polecenia

C:\Program Files \ Android \ Android Studio \ jre \ bin>keytool-export-rfc-alias androidkey-file android_certificate.pem - keystore androidkey.jks
Wpisz hasło keystore:
Certyfikat przechowywany w pliku

 0
Author: Ankit Dubey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-10 07:09:47

Konwersja Klucza Java do formatu PEM

Najbardziej precyzyjna odpowiedź musi być taka, że nie jest to możliwe.

Klucz Java jest jedynie magazynem kluczy kryptograficznychi , podczas gdy PEM jest formatem plików tylko dla certyfikatów X. 509.

 0
Author: whaefelinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-31 09:44:22