it-swarm.com.de

Konvertieren eines Java-Keystores in das PEM-Format

Ich versuche, eine Java-Keystore-Datei mithilfe von keytool und openssl-Anwendungen in eine PEM-Datei zu konvertieren. Ich konnte jedoch keinen guten Weg finden, die Konvertierung durchzuführen. Irgendwelche Ideen? 

Anstatt den Keystore direkt in PEM zu konvertieren, habe ich zuerst versucht, eine PKCS12-Datei zu erstellen und dann in die relevante PEM-Datei und den Keystore zu konvertieren. Ich konnte jedoch keine Verbindung herstellen. (Beachten Sie, dass ich nur eine PEM-Datei und eine Keystore-Datei benötige, um eine gesicherte Verbindung zu implementieren. Es gibt keine Einschränkungen wie "Starten von einer Java-Keystore-Datei". :) Das Starten von anderen Formaten ist in meinem Fall akzeptabel.

Eine direkte Konvertierungsmethode von Jks zu Pem ist jedoch vorzuziehen.

Es ist ziemlich einfach, zumindest mit jdk6 zu arbeiten ... 

 bash $ keytool -keystore foo.jks -genkeypair -alias foo\
 -dname 'CN = foo.example.com, L = Melbourne, ST = Victoria, C = AU' 
 Geben Sie das Keystore-Kennwort ein: 
 Geben Sie das neue Kennwort erneut ein: 
 Geben Sie das Schlüsselpasswort für .__ ein. (RETURN, falls mit Keystore-Kennwort identisch): 
 Bash $ keytool -keystore foo.jks -exportcert -alias foo |\
 openssl x509 -inform der -text 
 Geben Sie das Keystore-Kennwort ein: asdasd 
 Zertifikat: 
 Daten:
 Version: 3 (0x2) 
 Seriennummer: 1237334757 (0x49c03ae5) 
 Signaturalgorithmus: dsaWithSHA1 
 Aussteller: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com 
 Gültigkeit
 Nicht vor: 18.03. 00:05:57 2009 GMT 
 Nicht nach: 16.06. 00:05:57 2009 GMT 
 Betreff: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com 
 Informationen zum Betreff des öffentlichen Schlüssels: 
 Public-Key-Algorithmus: dsaEncryption 
 Öffentlicher DSA-Schlüssel: 
 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\
 -srcstoretyp jks\
 -deststoretype pkcs12 
 Geben Sie das Zielschlüsselspeicherkennwort ein: 
 Geben Sie das neue Kennwort erneut ein: 
 Geben Sie das Quellschlüsselspeicherkennwort ein: 
 Eintrag für Alias ​​foo erfolgreich importiert .
 Importbefehl abgeschlossen: 1 Einträge erfolgreich importiert, 0 Einträge fehlgeschlagen oder abgebrochen 

 Bash $ openssl pkcs12 -in foo.p12 -out foo.pem 
 Geben Sie das Import-Kennwort ein: 
 MAC verifiziert - Geben Sie die PEM-Passphrase ein: 

 Bash $ openssl x509 -text -in foo.pem 
 Zertifikat: 
 Daten:
 Version: 3 (0x2) 
 Seriennummer: 1237334757 (0x49c03ae5) 
 Signaturalgorithmus: dsaWithSHA1 
 Aussteller: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com 
 Gültigkeit
 Nicht vor: 18.03. 00:05:57 2009 GMT 
 Nicht nach: 16.06. 00:05:57 2009 GMT 
 Betreff: C = AU, ST = Victoria, L = Melbourne, CN = foo.example.com 
 Informationen zum Betreff des öffentlichen Schlüssels: 
 Public-Key-Algorithmus: dsaEncryption 
 Öffentlicher DSA-Schlüssel: 
 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-Schlüssel 
 PEM-Passphrase eingeben: 
 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: 
__
__.

Sie enden mit:

  • foo.jks - Keystore im Java-Format.
  • foo.p12 - Keystore im PKCS # 12-Format.
  • foo.pem - alle Schlüssel und Zertifikate aus dem Keystore im PEM-Format.

(Diese letzte Datei kann in Schlüssel und Zertifikate unterteilt werden, wenn Sie möchten.)


Befehlszusammenfassung - zum Erstellen eines JKS-Keystores:

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

Befehlszusammenfassung - zum Konvertieren des JKS-Keystores in den PKCS # 12-Keystore und dann in die PEM-Datei:

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

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

wenn sich in Ihrem JKS-Schlüsselspeicher mehr als ein Zertifikat befindet und Sie nur das Zertifikat und den Schlüssel exportieren möchten, die einem der Aliasnamen zugeordnet sind, können Sie die folgende Variante verwenden:

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

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

Befehlszusammenfassung - zum Vergleichen des JKS-Keystores mit der PEM-Datei:

keytool -keystore foo.jks -exportcert -alias foo | \
   openssl x509 -inform der -text

openssl x509 -text -in foo.pem

openssl dsa -text -in foo.pem
194
Stobor

Ich habe immer wieder Fehler von openssl erhalten, wenn ich den Befehl von StoBor verwende:

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:

Aus irgendeinem Grund würde nur dieser Befehlsstil für meine JKS-Datei funktionieren

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

Der Schlüssel war destkeypass, der Wert des Arguments spielte keine Rolle.

29
cmcginty

Mit dem Befehl keytool können Sie den privaten Schlüssel nicht aus einem Schlüsselspeicher exportieren. Sie müssen dazu Java-Code schreiben. Öffnen Sie den Schlüsselspeicher, holen Sie sich den benötigten Schlüssel und speichern Sie ihn in einer Datei im PKCS # 8-Format. Speichern Sie auch das zugehörige Zertifikat.

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

Verwenden Sie OpenSSL-Dienstprogramme, um diese Dateien (die im Binärformat vorliegen) in das PEM-Format zu konvertieren.

openssl pkcs8 -inform der -nocrypt < tmpkey.der > tmpkey.pem
openssl x509 -inform der < tmpcert.der > tmpcert.pem
13
erickson

Direkte Konvertierung von JKS in PEM-Datei mit dem Keytool

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem
12
sanghaviss

Vereinfachte Anweisungen zum Konvertieren einer JKS-Datei in das PEM- und KEY-Format (.crt & .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>
6
asami

Ich habe eine sehr interessante Lösung gefunden:

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

Dann habe ich das Paar public/private key in zwei Dateien private.key publi.pem aufgeteilt und es funktioniert!

2
Marco Luly

Nun, OpenSSL sollte es einfach machen aus einer # 12-Datei:

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

Vielleicht mehr Details darüber, was der Fehler ist? 

1
Charlie Martin

Das Konvertieren eines JKS-KeyStores in eine einzelne PEM-Datei kann einfach mit dem folgenden Befehl ausgeführt werden: 

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

Erläuterung:

  1. keytool -list -rfc -keystore "myKeystore.jks" listet alles im KeyStore 'myKeyStore.jks' im PEM-Format auf. Es werden jedoch auch zusätzliche Informationen gedruckt.
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" filtert alles heraus, was wir nicht brauchen. Wir haben nur noch die PEMs von allem im KeyStore.
  3. >> "myKeystore.pem" schreibt die PEMs in die Datei 'myKeyStore.pem'.
1
Mark Lagendijk

Falls Sie openssl nicht installiert haben und nach einer schnellen Lösung suchen, gibt es eine Software namens portcle , die sehr nützlich und klein zum Herunterladen ist.

Der Nachteil ist, dass es meines Wissens nach keine Befehlszeile gibt .. Aber von der GUI aus ist es ziemlich einfach, einen privaten PEM-Schlüssel zu exportieren:

  1. Öffnen Sie den JKS-Schlüsselspeicher
  2. Klicken Sie mit der rechten Maustaste auf Ihren privaten Schlüssel und wählen Sie "Exportieren"
  3. Wählen Sie Private Key und Zertifikate und PEM-Format

     Export PEM private key from JKS with Portcle

1
Marcio Jasinski

Konvertieren eines Java-Keystores in das PEM-Format

Die genaueste Antwort muss sein, dass dies NICHT möglich ist. 

Ein Java-Keystore ist lediglich eine Speichereinrichtung für kryptographische Schlüssel und -Zertifikate, während PEM nur für X.509-Zertifikate ein Dateiformat ist.

0
whaefelinger

Legen Sie zuerst den Keystore von JKS auf PKCS12 ab

1 . keytool -importkeystore -srckeystore ~ ​​/ .Android/debug.keystore -destkeystore intermedi.p12 -srcstoretype JKS -deststoretype PKCS12

Legen Sie die neue pkcs12-Datei in pem ab

  1. openssl pkcs12 -in intermedi.p12 -knoten -out intermedi.rsa.pem

Sie sollten sowohl den cert- als auch den privaten Schlüssel im Pem-Format haben. Teilen Sie sie auf . Legen Sie den Teil zwischen "BEGIN CERTIFICATE" und "END CERTIFICATE" in cert.x509.pem Legen Sie den Teil zwischen "BEGIN RSA PRIVATE KEY" und "END RSA PRIVATE KEY" in private.rsa .pem Konvertieren Sie den privaten Schlüssel in das pk8-Format, wie von signapk erwartet

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

0
nkalra0123

erstellen Sie zuerst eine Keystore-Datei als

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

Geben Sie das Keystore-Passwort ein:
Neues Passwort erneut eingeben:
Wie lautet Ihr Vor- und Nachname? Unbekannte: Vorname Nachname
Wie heißt Ihre Organisationseinheit? Unbekannte: Mobile Entwicklung
Wie heißt Ihre Organisation? Unbekannte: ihr Firmenname
Wie lautet der Name Ihrer Stadt oder Ihres Ortes? Wie lautet der Name Ihres Staates oder Ihrer Provinz?
Wie lautet der aus zwei Buchstaben bestehende Ländercode für diese Einheit? Unbekannt: IN // drücken Sie die Eingabetaste 

Nun werden Sie zur Bestätigung aufgefordert

Ist CN = Vorname Nachname, OU = Mobile Entwicklung, O = Ihr Firmenname, L = Stadtname, ST = Zustandsname, C = IN korrekt? [Nein]: ja 

Geben Sie das Schlüsselpasswort für .__ ein. (RETURN, falls mit Keystore-Passwort identisch): Drücken Sie die Eingabetaste, wenn Sie dasselbe Passwort benötigen

schlüssel erzeugt wurde, können Sie die Pem-Datei jetzt einfach mit folgendem Befehl abrufen

C:\Programme\Android\Android Studio\jre\bin>keytool -export -rfc -alias androidkey-datei Android_certificate.pem -keystore androidkey.jks
Geben Sie das Keystore-Passwort ein:
Zertifikat in Datei gespeichert 

0
ankitdubey021

Testen Sie den Keystore Explorer http://keystore-Explorer.org/

KeyStore Explorer ist ein Open-Source-GUI-Ersatz für die Java-Befehlszeilendienstprogramme keytool und jarsigner. Es macht auch openssl/pkcs12.

0
Johnnyboy