it-swarm-eu.dev

Wie kann ich meinen privaten Schlüssel aus einem Java Keytool-Keystore) exportieren?

Ich möchte meinen privaten Schlüssel aus einem Java Keytool-Keystore exportieren, damit ich ihn mit openssl verwenden kann. Wie kann ich das tun?

117
Jonas

Verwenden Sie Java keytool, um von JKS nach P12 zu konvertieren ...

Export aus dem proprietären Format von keytool ("JKS" genannt) in das standardisierte Format PKCS # 12 :

keytool -importkeystore \
    -srckeystore keystore.jks \
    -destkeystore keystore.p12 \
    -deststoretype PKCS12 \
    -srcalias <jkskeyalias> \
    -deststorepass <password> \
    -destkeypass <password>

... dann mit openssl von P12 nach PEM exportieren

Zertifikat mit openssl exportieren:

openssl pkcs12 -in keystore.p12  -nokeys -out cert.pem

Unverschlüsselten privaten Schlüssel exportieren:

openssl pkcs12 -in keystore.p12  -nodes -nocerts -out key.pem
135
Jaime Hablutzel

Seit Java 6) können Sie private Schlüssel in PKCS # 12 (.p12) Dateien mit keytool, mit der Option -importkeystore (in früheren Versionen nicht verfügbar).

Zum Beispiel:

keytool -importkeystore -srckeystore existing-store.jks -destkeystore new-store.p12 -deststoretype PKCS12

Das PKCS12 Der Keystore-Typ wird auch als Standard-Keystore-Typ im Standard-Oracle/Sun-Sicherheitsanbieter unterstützt.

62
Bruno

Versuchen Sie "Keystore Explorer"

Ich stimme Bruno zu. Keytool ist das ultimative Tool für den Umgang mit Java Keystore, aber es gibt ein ausgefallenes und recht leistungsfähiges kostenloses Tool: Keystore Explorer

Ich benutze es oft und brauchte nie etwas anderes.

23
Tiho

Wenn hier jemand versucht, einen privaten Schlüssel aus einem Schlüsselspeicher vom Typ JCEKS herauszuholen, habe ich festgestellt, dass die in anderen Antworten beschriebenen Anweisungen für Keytool und openssl nicht funktionieren. Ich musste die folgende Java Klasse verwenden, um den Schlüssel herauszuholen.

import Sun.misc.BASE64Encoder;

import Java.io.File;
import Java.io.FileInputStream;
import Java.io.FileWriter;
import Java.security.*;

public class ExportPrivateKey
{
    private File keystoreFile;
    private String keyStoreType;
    private char[] keyStorePassword;
    private char[] keyPassword;
    private String alias;
    private File exportedFile;

    public void export() throws Exception {
        KeyStore keystore = KeyStore.getInstance(keyStoreType);
        BASE64Encoder encoder = new BASE64Encoder();
        keystore.load(new FileInputStream(keystoreFile), keyStorePassword);
        Key key = keystore.getKey(alias, keyPassword);
        String encoded = encoder.encode(key.getEncoded());
        FileWriter fw = new FileWriter(exportedFile);
        fw.write("---BEGIN PRIVATE KEY---\n");
        fw.write(encoded);
        fw.write("\n");
        fw.write("---END PRIVATE KEY---");
        fw.close();
    }

    public static void main(String args[]) throws Exception {
        ExportPrivateKey export = new ExportPrivateKey();
        export.keystoreFile = new File(args[0]);
        export.keyStoreType = args[1];
        export.keyStorePassword = args[2].toCharArray();
        export.alias = args[3];
        export.keyPassword = args[4].toCharArray();
        export.exportedFile = new File(args[5]);
        export.export();
    }
}

Verwendungszweck:

javac ExportPrivateKey.Java
java ExportPrivateKey <path_to_keystore> JCEKS <keystore_password> “<key_alias>” <key_password> <output_file_name>
6
cjbooms

Es gibt ein Format, das das Verschieben privater Schlüssel ermöglicht, PKCS # 12. Dieses Format kam später in der Entwicklung von PKI-Zertifikaten und verwandten Schlüsselspeichern, als sich der Bedarf entwickelte. Wenn Sie die Kette von Vertrauensproblemen berücksichtigen, die durch den Zugriff auf und den Transport des privaten Schlüssels entstehen, können Sie erkennen, warum dieser nicht in den ursprünglichen Funktionen enthalten war, sondern auf Druck aufgrund betrieblicher Anforderungen kam. Dies ist der Hauptgrund für die Herausforderung.

Java-Keystores waren einer der ersten Benutzer des PKCS # 12-Formats, jedoch als Importeure keine Exporteure. Es scheint, dass das Sicherheitsdesign von Java Keystores das Exportieren privater Schlüssel als Standardfunktion immer noch nicht unterstützt. Auch hier gibt es gute Sicherheitsgründe. Allerdings wurden private Routinen wie hier beschrieben geschrieben: http://www.startux.de/index.php/Java/44-dealing-with-Java-keystoresyvComment44

Wenn möglich, würde ich in Betracht ziehen, einen neuen Schlüsselspeicher in OpenSSL und neue Schlüssel zu erstellen, anstatt zu versuchen, den privaten Schlüssel aus dem Schlüsselspeicher Java herauszuholen. Durch Öffnen des Schlüsselspeichers Java und Extrahieren des privaten Schlüssels werden die entworfenen Sicherheitsfunktionen überschritten. Die Export-PKCS # 12-Funktion ist seit vielen Jahren erwünscht, wird jedoch in Java immer noch nicht unterstützt. Ich denke, das ist aus sehr guten kryptologischen Gründen, daher würde ich diesen Schritt nur schwer tun, wenn es absolut notwendig wäre.

2
zedman9991