Import der PEM-Zertifikatskette und des Schlüssels in Java Keystore

29

Es gibt eine Menge Ressourcen zu diesem Thema, aber keine, die ich gefunden habe und die diesen etwas besonderen Fall abdeckt.

Ich habe 4 Dateien;

  • privatekey.pem
  • certificate.pem
  • intermediate_rapidssl.pem
  • ca_geotrust_global.pem

Und ich möchte sie in einen neuen Keystore importieren.

Einige Websites schlagen vor, das DER-Format zu verwenden und einzeln zu importieren. Dies ist jedoch fehlgeschlagen, da der Schlüssel nicht erkannt wird.

Eine andere Site schlug eine spezielle "ImportKey" -Klasse vor, die für den Import ausgeführt werden sollte. Dies funktionierte, bis ich sah, dass die Kette unterbrochen war. Dh die Kettenlänge auf dem Zertifikat ist 1, ohne Berücksichtigung der Zwischen- und Ca.

Einige Sites schlagen PKCS7 vor, aber ich kann nicht einmal eine Kette daraus ziehen. Andere schlagen das PKCS12-Format vor, aber was meine Tests angeht, ist dies auch fehlgeschlagen, um die gesamte Kette zu erhalten.

Alle Ratschläge oder Hinweise sind sehr willkommen.

Trollbann
quelle

Antworten:

26

Dies mag nicht perfekt sein, aber ich hatte einige Hinweise zu meiner Verwendung keytool, die ich für Ihr Szenario geändert habe.

  1. Importieren Sie ein Root- oder Zwischen-CA-Zertifikat in einen vorhandenen Java-Keystore:

    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. Kombinieren Sie das Zertifikat und den privaten Schlüssel vor dem Importieren in einer Datei.

    cat certificate.pem privatekey.pem > combined.pem
    

    Dies sollte zu einer Datei führen, die dem folgenden Format ähnelt.

    BEGIN CERTIFICATE
    ...
    END CERTIFICATE
    BEGIN RSA PRIVATE KEY
    ...
    ENDE RSA PRIVATE KEY

  3. Importieren Sie ein signiertes Primärzertifikat und einen signierten Primärschlüssel in einen vorhandenen Java-Keystore:

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    
Aaron Copley
quelle
2
Mit welcher Version von keytool können Sie so verketten? Diese Syntax gibt "keytool error: java.lang.Exception: Zertifikat nicht importiert, Alias ​​<root> existiert bereits" mit -import und -importcert
ctpenrose
Schwer zu sagen, genau. Aber angesichts des Jahres / Monats war es wahrscheinlich Java 6? (Keine Ahnung, welche Nebenversion Sie verwenden). Der Fehler lautet wie das Problem mit dem Keystore selbst sein könnte. ( alias <root> already exists) Kannst du es mit einem neuen, leeren Keystore versuchen?
Aaron Copley
1
Mit Keytool kann ich kein Zertifikat mit einem bereits vorhandenen Alias ​​"root" importieren. Aber ich denke, es war ein Tippfehler. Interessanterweise erstellt keytool eine Kette für Ihr Zertifikat selbst, wenn es die Zertifikate der Unterzeichner im Keystore findet (unter einem beliebigen Alias). Das Java-Tool "Portecle" ist praktisch für die Verwaltung des Java-Keystores.
Houtman
Keytool funktioniert nicht so und es ist nicht möglich, einen Alias ​​mehr als einmal wie beschrieben zu importieren. (Und ja, ich habe es versucht). In der Antwort von Senajqerib finden Sie Informationen zu Funktionen, die ordnungsgemäß funktionieren.
Steve Sether
1
Es ist eine drei Jahre alte Antwort. Es ist durchaus möglich, dass sich die Dinge geändert haben, aber ich versichere Ihnen, dass es ab Februar 2013 funktioniert hat (oder kurz davor stand, als ich anzeigte, dass es möglicherweise nicht perfekt ist).
Aaron Copley
42

Verketten Sie alle * .pem-Dateien wie all.pem zu einer pem-Datei. Erstellen Sie anschließend einen Keystore im p12-Format mit dem privaten Schlüssel + all.pem

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

Dann exportiere p12 in jks

keytool -importkeystore -srckeystore test.p12 -srcstoretype pkcs12 -destkeystore test.jks
Senanqerib
quelle
Vielen Dank. Dies ist die einzige vollständige und korrekte Antwort. Wie Sie vorgeschlagen haben, ist es viel einfacher, die Zertifikate zu einer Datei zusammenzufassen.
Steve Sether
Das war ein Vergnügen für mich !! Mit diesen Anweisungen habe ich eine Schlüsselkette konvertiert, die in nodejs-self-signed-certificate-example-repository verwendet wird, um mit einem Java-basierten TLS-Server zu kommunizieren. Tausend Dank!
Galder Zamarreño
Das ist die richtige Antwort.
sfThomas
8

keytool bietet keine Möglichkeit zum Importieren von Zertifikat + privatem Schlüssel aus einer einzelnen (kombinierten) Datei, wie oben vorgeschlagen. Es läuft einwandfrei, aber nur das Zertifikat wird importiert, während der private Schlüssel ignoriert wird. Sie können dies überprüfen, indem keytool -list -v -keystore yourkeystore.jksSie als Eintragstyp für Ihre Domain TrustedCertEntry und nicht PrivateKeyEntry angeben.

Um das anfängliche Problem zu lösen, sollte man zuerst einen PKCS # 12-Keystore mit openssl (oder einem ähnlichen Tool) erstellen und dann den Keystore mit importieren keytool -importkeystore.

Ixmal
quelle