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:
(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
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.
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
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
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>
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!
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?
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:
keytool -list -rfc -keystore "myKeystore.jks"
listet alles im KeyStore 'myKeyStore.jks' im PEM-Format auf. Es werden jedoch auch zusätzliche Informationen gedruckt.| 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.>> "myKeystore.pem"
schreibt die PEMs in die Datei 'myKeyStore.pem'.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:
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.
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
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
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
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.