Import łańcucha certyfikatów PEM i klucza do Java Keystore

29

Istnieje wiele zasobów na ten temat, ale nie znalazłem żadnego, który dotyczyłby tego nieco szczególnego przypadku.

Mam 4 pliki;

  • privatekey.pem
  • certyfikat.pem
  • intermed_rapidssl.pem
  • ca_geotrust_global.pem

I chcę je zaimportować do świeżego magazynu kluczy.

Niektóre witryny sugerują użycie formatu DER i importowanie ich jeden po drugim, ale nie powiodło się, ponieważ klucz nie został rozpoznany.

Inna strona zasugerowała specjalną klasę „ImportKey” do uruchomienia w celu importowania i działało to do momentu, gdy zobaczyłem, że łańcuch jest zepsuty. Czyli długość łańcucha na certyfikacie wynosi 1, ignorując półprodukt i ok.

Niektóre strony sugerują PKCS7, ale nie mogę nawet uzyskać z tego łańcucha. Inne sugerują format PKCS12, ale jeśli chodzi o moje testy, to również nie udało się uzyskać całego łańcucha.

Wszelkie porady i wskazówki są mile widziane.

Trollbane
źródło

Odpowiedzi:

26

To może nie być idealne, ale miałem kilka uwag na temat mojego wykorzystania keytool, które zmodyfikowałem dla twojego scenariusza.

  1. Zaimportuj główny lub pośredni certyfikat CA do istniejącego magazynu kluczy Java:

    keytool -import -trustcacerts -alias root -file ca_geotrust_global.pem -keystore yourkeystore.jks
    keytool -import -trustcacerts -alias root -file intermediate_rapidssl.pem -keystore yourkeystore.jks 
    
  2. Przed zaimportowaniem połącz certyfikat i klucz prywatny w jeden plik.

    cat certificate.pem privatekey.pem > combined.pem
    

    Powinno to spowodować, że plik będzie przypominał poniższy format.

    ROZPOCZNIJ CERTYFIKAT
    ...
    ZAKOŃCZ CERTYFIKAT
    ZACZYNAJ KLUCZ PRYWATNY RSA
    ...
    KONIEC RSA KLUCZ PRYWATNY

  3. Zaimportuj podpisany certyfikat główny i klucz do istniejącego magazynu kluczy Java:

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    
Aaron Copley
źródło
2
Jaka wersja keytool pozwala ci na tworzenie takich łańcuchów? Ta składnia daje „błąd keytool: java.lang.Exception: Certyfikat nie został zaimportowany, alias <root> już istnieje” dla opcji -import i -importcert
ctpenrose
Trudno powiedzieć dokładnie. Ale biorąc pod uwagę rok / miesiąc, prawdopodobnie był to Java 6? (Nie mam pojęcia, że ​​jest to niewielkie wydanie). Z jakiej wersji korzystasz? Błąd brzmi, jakby problem mógł dotyczyć samego magazynu kluczy. ( alias <root> already exists) Czy możesz wypróbować nowy, pusty magazyn kluczy?
Aaron Copley,
1
Keytool nie pozwoli mi zaimportować certyfikatu przy użyciu już istniejącego aliasu „root”. Ale myślę, że to była literówka. Warto zauważyć, że keytool tworzy łańcuch dla samego certyfikatu, gdy znajdzie certyfikaty osób podpisujących w magazynie kluczy (pod dowolnym aliasem). Narzędzie Java „Portecle” jest przydatne do zarządzania magazynem kluczy Java.
Houtman,
Keytool nie działa w ten sposób i nie pozwala importować aliasu więcej niż jeden raz, jak opisano. (I tak, próbowałem). Zobacz odpowiedź senajqerib poniżej na coś, co działa poprawnie.
Steve Sether
1
To trzyletnia odpowiedź. Jest całkiem możliwe, że wszystko się zmieniło, ale zapewniam, że działało (lub było bliskie działania, ponieważ wskazałem, że może nie być idealne) od lutego 2013 r. Prosimy o przesłanie edycji lub oflagowanie go do uwagi moderatora.
Aaron Copley
42

Połącz wszystkie pliki * .pem w jeden plik pem, taki jak all.pem Następnie utwórz magazyn kluczy w formacie p12 za pomocą klucza prywatnego + all.pem

openssl pkcs12 -export -inkey private.key -in all.pem -name test -out test.p12

Następnie wyeksportuj p12 do jks

keytool -importkeystore -srckeystore test.p12 -srcstoretype pkcs12 -destkeystore test.jks
senanqerib
źródło
Dziękuję Ci. To jedyna kompletna i poprawna odpowiedź. Jak zasugerowałeś, o wiele łatwiej jest po prostu połączyć certyfikaty w jeden plik.
Steve Sether
To działało dla mnie jak gratka !! Skorzystałem z tych instrukcji, aby przekonwertować łańcuch kluczy używanych w repozytorium przykładowych certyfikatów nodejs z podpisem własnym, aby rozmawiać z serwerem TLS opartym na Javie. Stukrotne dzięki!
Galder Zamarreño,
To jest poprawna odpowiedź.
sfThomas
8

keytool nie zapewnia sposobu importowania certyfikatu + klucza prywatnego z jednego (połączonego) pliku, jak zaproponowano powyżej. Działa dobrze, ale importowany jest tylko certyfikat, a klucz prywatny jest ignorowany. Możesz to sprawdzić przez keytool -list -v -keystore yourkeystore.jks- typ wpisu twojej domeny to TrustedCertEntry, a nie PrivateKeyEntry.

Aby rozwiązać początkowy problem, należy najpierw utworzyć plik kluczy PKCS # 12 za pomocą openssl (lub podobnego narzędzia), a następnie zaimportować plik kluczy keytool -importkeystore.

Ixmal
źródło