如何从 Java Keytool 密钥库中导出我的私钥?

信息安全 应用安全 密码学 密钥管理 证书 爪哇
2021-08-30 00:24:27

我想从 Java Keytool 密钥库中导出我的私钥,这样我就可以将它与 openssl 一起使用。我怎样才能做到这一点?

4个回答

使用 Java keytool 将 JKS 转换为 P12...

keytool从的专有格式(称为“JKS”)导出为标准化格式PKCS #12

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

...然后使用 openssl 从 P12 导出到 PEM

使用以下方式导出证书openssl

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

导出未加密的私钥:

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

从 Java 6 开始,您可以使用, 选项将私钥导入/导出到 PKCS#12 ( .p12) 文件中(在以前的版本中不可用)。keytool-importkeystore

例如:

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

在默认的 Oracle/Sun 安全提供程序中,还支持将PKCS12密钥库类型作为标准密钥库类型。

尝试“密钥库资源管理器”

我同意布鲁诺的观点。Keytool 是处理 Java 密钥库的终极工具,但有一个花哨且功能强大的免费工具: Keystore explorer

我经常使用它,从来不需要其他东西。

如果有人发现自己在这里试图从 JCEKS 类型的密钥库中获取私钥,我发现其他答案中描述的 keytool 和 openssl 指令不起作用。我不得不使用下面的 Java 类来获取密钥。

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

用法:

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