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.

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

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.


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

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

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>


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

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


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?


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



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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.