Konwersja magazynu kluczy Java do formatu PEM

133

Próbuję przekonwertować plik kluczy Java do pliku PEM za pomocą narzędzia keytool i aplikacji openssl. Ale nie mogłem znaleźć dobrego sposobu na dokonanie konwersji. Jakieś pomysły?

Zamiast konwertować plik kluczy bezpośrednio do PEM, próbowałem najpierw utworzyć plik PKCS12, a następnie przekonwertować go na odpowiedni plik PEM i magazyn kluczy. 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. Nie ma ograniczeń, takich jak „Rozpocznij od pliku kluczy java”. :) W moim przypadku można więc zacząć od innych formatów)

Preferowana jest jednak metoda bezpośredniej konwersji z jks do pem.

Chathuranga Chandrasekara
źródło

Odpowiedzi:

217

Jest to dość proste, używając przynajmniej jdk6 ...

bash $ keytool -keystore foo.jks -genkeypair -alias foo \
        -dname 'CN = foo.example.com, L = Melbourne, ST = Victoria, C = AU'
Wprowadź hasło do magazynu kluczy:  
Wprowadź ponownie nowe hasło: 
Wprowadź hasło klucza dla 
        (ZWRÓĆ, jeśli jest takie samo jak hasło do magazynu kluczy):  
bash $ keytool -keystore foo.jks -exportcert -alias foo | \
       openssl x509 -inform der -text
Wprowadź hasło magazynu kluczy: asdasd
Certyfikat:
    Dane:
        Wersja: 3 (0x2)
        Numer seryjny: 1237334757 (0x49c03ae5)
        Algorytm podpisu: dsaWithSHA1
        Wystawca: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Ważność
            Nie wcześniej: 18 marca 00:05:57 2009 GMT
            Nie po: 16 czerwca 00:05:57 2009 GMT
        Temat: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Informacje o kluczu publicznym podmiotu:
            Algorytm klucza publicznego: dsaEncryption
            Klucz publiczny DSA:
                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
Wprowadź hasło do docelowego magazynu kluczy:  
Wprowadź ponownie nowe hasło: 
Wprowadź hasło źródłowego magazynu kluczy:  
Wpis dla aliasu foo został pomyślnie zaimportowany.
Polecenie importu zakończone: 1 wpisy pomyślnie zaimportowane, 0 wpisów nie powiodło się lub anulowano

bash $ openssl pkcs12 -in foo.p12 -out foo.pem
Wprowadź hasło importu:
MAC zweryfikowany OK
Wpisz hasło PEM:
Weryfikacja - wprowadź frazę hasła PEM:

bash $ openssl x509 -text -in foo.pem
Certyfikat:
    Dane:
        Wersja: 3 (0x2)
        Numer seryjny: 1237334757 (0x49c03ae5)
        Algorytm podpisu: dsaWithSHA1
        Wystawca: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Ważność
            Nie wcześniej: 18 marca 00:05:57 2009 GMT
            Nie po: 16 czerwca 00:05:57 2009 GMT
        Temat: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com
        Informacje o kluczu publicznym podmiotu:
            Algorytm klucza publicznego: dsaEncryption
            Klucz publiczny DSA:
                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
przeczytaj klucz DSA
Wpisz hasło PEM:
Klucz prywatny: (1024-bitowy)
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ńczysz z:

  • foo.jks - magazyn kluczy w formacie java.
  • foo.p12 - magazyn kluczy w formacie PKCS # 12.
  • foo.pem - wszystkie klucze i certyfikaty z magazynu kluczy, w formacie PEM.

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


Podsumowanie poleceń - aby utworzyć magazyn kluczy JKS:

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

Podsumowanie polecenia - aby przekonwertować magazyn kluczy JKS do magazynu kluczy PKCS # 12, 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 swoim magazynie kluczy JKS i chcesz wyeksportować tylko certyfikat i klucz powiązany 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 - aby porównać magazyn kluczy JKS z plikiem 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
źródło
12
Zaufane certyfikaty nie są obsługiwane w tej metodzie: jest to ograniczenie formatu PKS12, jak sądzę, zobacz: java.sun.com/javase/6/docs/technotes/guides/security/jsse/ ... (sekcja dotycząca java.security.KeyStoreException : TrustedCertEntry nie jest obsługiwane)
andygavin
2
Mam starszy plik JKS. Nie udało mi się wyeksportować przy użyciu powyższej metody. W końcu udało mi się to zrobić, ustawiając argument keytool „-destkeypass” na wartość fikcyjną. „keytool” wyświetla nawet ostrzeżenie, że ignoruje wartość destkeypass? Żadna inna technika nie zadziała. Korzystanie z podpowiedzi nie działa, działa tylko z argumentem wiersza poleceń. To musi być błąd w eksporcie PKCS12, czy ktoś może komentować?
cmcginty
4
„openssl pkcs12 -in foo.p12 -out foo.pem” generuje następujący błąd Wprowadź hasło importu: MAC zweryfikowany OK Błąd podczas wyprowadzania kluczy i certyfikatów 139848775526048: błąd: 06065064: procedury cyfrowej koperty: EVP_DecryptFinal_ex: złe odszyfrowanie: evp_enc.c: 539 : 139848775526048: błąd: 23077074: procedury PKCS12: PKCS12_pbe_crypt: pkcs12 cipherfinal błąd: p12_decr.c: 104: 139848775526048: błąd: 2306A075: procedury PKCS12: PKCS12_item_decrypt_d2i: p12be: crypt. Jakie jest na to rozwiązanie?
Udara SS Liyanage
1
ostrzeżenie dla innych osób, wykonanie polecenia keytool zajmuje trochę czasu z jakiegoś powodu, musiałem czekać 30 sekund, aż eksport się zakończy
Nicolas Mommaerts
1
@ UdaraS.SLiyanage: spójrz na odpowiedź Caseya na rozwiązanie
Nicolas Mommaerts
29

Ciągle otrzymywałem błędy opensslpodczas używania polecenia 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:

Z jakiegoś powodu tylko ten styl poleceń 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ł ustawiony destkeypass, wartość argumentu nie miała znaczenia.

cmcginty
źródło
6
Uzasadnienie można znaleźć tutaj: herongyang.com/PKI/… Destkeypass MA znaczenie btw
Nicolas Mommaerts
Głosowałem za tym komentarzem, ale zasługuje na swój własny post. Trudno było tu znaleźć.
Richie Rich
15

keytoolKomenda nie będzie można wyeksportować klucza prywatnego z magazynu kluczy. Aby to zrobić, musisz napisać jakiś kod Java. Otwórz magazyn kluczy, weź potrzebny klucz i zapisz go w 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, aby przekonwertować te pliki (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
erickson
źródło
Dzięki erickson .. Wniosek jest taki: „Nie możemy wykonać bezpośredniej konwersji z JKS do PEM używając tylko narzędzi keytool i openssl”. Mam rację?
Chathuranga Chandrasekara
4
Tylko trzeba do zapisu kodu aż do wersji 1.4 - z Java 5 r keytool i OpenSSL można łączyć aby przeprowadzić konwersję dwustopniowy z JKS -> PKCS # 12 -> PEM. Jednak napisanie własnego narzędzia klucza jest jedynym sposobem na wykonanie BEZPOŚREDNIEJ KONWERSJI z JKS -> PEM.
Stobor
Myślę, że to od JDK 6 dalej. Ale tak, import PKCS # 12 jest teraz obsługiwany.
erickson
15

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

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
sanghaviss
źródło
10
Tak, to eksportuje certyfikat. Jednak nie eksportuje kluczowych informacji ...
Stobor
To jest dokładnie prosta odpowiedź na to, co szukałem na dziesiątki keytooli jbossstron doc bez powodzenia. Dzięki!
kratenko
15
TO NIE EKSPORTUJE KLUCZOWYCH INFORMACJI PRYWATNYCH
James
1
To eksportuje certyfikat klucza publicznego
asami
Próbowałem uruchomić to polecenie. Wymaga hasła, wprowadź hasło magazynu kluczy: błąd narzędzia keytool: java.io.IO Wyjątek: manipulacja magazynu kluczy lub hasło jest nieprawidłowe. Użyłem hasła jako (hasło), ale wyrzucał ten sam błąd
Mohit Singh
9

Uproszczone instrukcje konwersji pliku JKS do formatu PEM i KEY (.crt i .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>
asami
źródło
2

Znalazłem bardzo ciekawe rozwiązanie:

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

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

Marco Luly
źródło
2

Konwersję JKS KeyStore do pojedynczego pliku PEM można łatwo wykonać 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"wyświetla wszystko w magazynie kluczy „myKeyStore.jks” w formacie PEM. Jednak drukuje również dodatkowe informacje.
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d"odfiltrowuje wszystko, czego nie potrzebujemy. Zostały nam tylko PEMy wszystkiego w KeyStore.
  3. >> "myKeystore.pem" zapisz PEM do pliku „myKeyStore.pem”.
Mark Lagendijk
źródło
3
bash
:!
1
@ user3217883 Zamiast tego możesz spróbować czegoś takiego jak sed "s/^\-*BEGIN [A-Z]*\-*$//g;s/^\-*END [A-Z]*\-*$//g"(z gnu sed), ale nie jestem pewien, czy to wystarczy, jeśli w twoim magazynie kluczy jest więcej niż jeden certyfikat
Idriss Neumann
jeśli otrzymujesz bash: !d": event not found: w przypadku bash wykrzyknik jest krótkim klawiszem do użycia polecenia. Aby użyć tej odpowiedzi, musisz użyć apostrofów zamiast cudzysłowów dla opcji używanej jako -e dla sedkeytool -list -rfc -keystore "myKeystore.jks" | sed -e '/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d' >> "myKeystore.pem"
B.Adler
Niestety, powoduje to tylko eksport certyfikatu, a nie klucza prywatnego
Maddin
2

Najpierw zrzuć magazyn kluczy z JKS do PKCS12

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

Zrzuć nowy plik pkcs12 do pem

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

Powinieneś mieć zarówno certyfikat, jak i klucz prywatny w formacie pem. Podziel je. Umieść część między „BEGIN CERTIFICATE” i „END CERTIFICATE” w cert.x509.pem Umieść część między „BEGIN RSA PRIVATE KEY” a „END RSA PRIVATE KEY” na private.rsa.pem Przekonwertuj klucz prywatny do formatu pk8 jako oczekiwany przez signapk

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

nkalra0123
źródło
1

Cóż, OpenSSL powinien zrobić to z łatwością 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, na czym polega błąd / awaria?

Charlie Martin
źródło
1

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 o ile wiem, nie ma wiersza poleceń. Ale z graficznego interfejsu użytkownika wyeksportowanie klucza prywatnego PEM jest całkiem proste:

  1. Otwórz magazyn kluczy JKS
  2. Kliknij prawym przyciskiem myszy wpis klucza prywatnego i wybierz eksport
  3. Wybierz Klucz prywatny i certyfikaty oraz format PEM

    Eksportuj klucz prywatny PEM z JKS za pomocą Portcle

Marcio Jasinski
źródło
0

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

KeyStore Explorer to interfejs GUI typu open source, zastępujący narzędzia wiersza poleceń języka Java, keytool i jarsigner. Robi również openssl / pkcs12.

Johnny Boy
źródło
0

najpierw utwórz plik kluczy jako

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

Wprowadź hasło do magazynu kluczy: Wprowadź
ponownie nowe hasło:
Jakie jest Twoje imię i nazwisko? Unknown: FirstName LastName
Jaka jest nazwa Twojej jednostki organizacyjnej? Nieznane: programowanie mobilne
Jaka jest nazwa Twojej organizacji? Nieznane: nazwa Twojej firmy
Jaka jest nazwa Twojego miasta lub miejscowości? Jaka jest nazwa twojego stanu lub prowincji?
Jaki jest dwuliterowy kod kraju dla tej jednostki? Nieznane: IN // naciśnij enter

Teraz poprosi o potwierdzenie

Czy CN = FirstName LastName, OU = Mobile Development, O = nazwa Twojej firmy, L = CityName, ST = StateName, C = IN jest poprawne? [nie]: tak

Wprowadź hasło klucza dla (POWRÓT, jeśli jest takie samo jak hasło magazynu kluczy): naciśnij enter, jeśli chcesz to samo hasło

klucz został wygenerowany, teraz możesz po prostu pobrać plik pem za pomocą następującego polecenia

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

Ankit Dubey
źródło
0

Konwersja magazynu kluczy Java do formatu PEM

Najdokładniejsza odpowiedź brzmi: NIE jest to możliwe.

Magazyn kluczy Java to jedynie miejsce przechowywania kluczy kryptograficznych i certyfikatów, podczas gdy PEM to format pliku tylko dla certyfikatów X.509.

Whaefelinger
źródło