it-swarm-id.com

Bagaimana saya bisa mengekspor kunci pribadi saya dari Java Keytool keystore?

Saya ingin mengekspor kunci pribadi saya dari Java Keytool keystore, jadi saya bisa menggunakannya dengan openssl. Bagaimana saya bisa melakukan itu?

117
Jonas

Gunakan Java keytool untuk mengonversi dari JKS ke P12 ...

Ekspor dari keytool format hak milik (disebut "JKS") ke format standar PKCS # 12 :

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

... kemudian gunakan openssl untuk mengekspor dari P12 ke PEM

Ekspor sertifikat menggunakan openssl:

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

Ekspor kunci pribadi yang tidak dienkripsi:

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

Sejak Java 6, Anda dapat mengimpor/mengekspor kunci pribadi ke PKCS # 12 (.p12) file menggunakan keytool, dengan opsi -importkeystore (tidak tersedia di versi sebelumnya).

Sebagai contoh:

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

PKCS12 jenis keystore juga didukung sebagai tipe keystore standar dalam penyedia keamanan standar Oracle/Sun.

62
Bruno

Coba "Keystore Explorer"

Saya setuju dengan Bruno. Keytool adalah alat pamungkas ketika berhadapan dengan Java keystore, tetapi ada satu alat gratis yang mewah dan cukup kuat: Keystore Explorer

Saya sering menggunakannya dan tidak pernah membutuhkan sesuatu yang lain.

23
Tiho

Jika ada yang menemukan diri mereka di sini mencoba untuk mendapatkan kunci pribadi dari keystore tipe JCEKS, saya menemukan bahwa keytool dan openssl petunjuk yang dijelaskan dalam jawaban lain tidak berfungsi. Saya harus menggunakan di bawah ini Java kelas untuk mendapatkan kunci keluar.

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

Pemakaian:

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

Ada format yang memungkinkan pemindahan kunci privat disebut PKCS # 12. Format ini muncul kemudian dalam evolusi sertifikat PKI dan keystores terkait ketika kebutuhan berevolusi. Jika Anda mempertimbangkan rantai masalah kepercayaan yang dibuat dengan mengakses dan mengangkut kunci privat Anda dapat melihat mengapa itu tidak termasuk dalam fitur awal tetapi lebih muncul setelah tekanan oleh kebutuhan operasional. Inilah alasan utama dari tantangan ini.

Java keystores adalah salah satu pengguna awal format PKCS # 12 tetapi sebagai importir bukan eksportir. Tampaknya desain keamanan Java keystores masih tidak mendukung ekspor kunci pribadi sebagai fitur standar. Sekali lagi, ada alasan keamanan yang bagus untuk fakta ini. Yang mengatakan, rutinitas pribadi telah ditulis sebagaimana dirujuk di sini: http://www.startux.de/index.php/Java/44-dealing-with-Java-keystoresyvComment44

Jika mungkin saya akan mempertimbangkan membuat keystore baru di OpenSSL dan kunci baru daripada mencoba untuk mencabut kunci privat dari keystore Java. Dengan membuka keystore Java dan mengekstraksi kunci privat bergerak di luar fitur keamanan yang dirancang. Fitur ekspor PKCS # 12 telah diinginkan selama bertahun-tahun tetapi masih belum didukung di Jawa. Pemikiran saya adalah karena alasan kriptologis yang sangat baik sehingga saya akan berani mengambil langkah itu kecuali jika benar-benar diperlukan.

2
zedman9991