我想从 Java Keytool 密钥库中导出我的私钥,这样我就可以将它与 openssl 一起使用。我怎样才能做到这一点?
如何从 Java Keytool 密钥库中导出我的私钥?
信息安全
应用安全
密码学
密钥管理
证书
爪哇
2021-08-30 00:24:27
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>
其它你可能感兴趣的问题