我想从Java Keytool密钥库中导出我的私钥,因此可以将它与openssl一起使用。我该怎么办?

评论

很好的参考书8gwifi.org/docs/jks.jsp

#1 楼

使用Java密钥工具将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


评论


-nodes是什么意思?

–获胜
2015年6月10日在3:19



“ No DES”,即不加密将保存到key.pem的私钥。

–Jaime Hablutzel
2015年6月10日17:14

我按照此答案中的说明进行操作,但是以某种方式导出的私钥只是一个空文件?是什么赋予了?

– Stijn de Witt
15年6月28日在18:32

只需看一下keystore.p12中openssl pkcs12的输出,该输出中有什么?

–Jaime Hablutzel
15年6月28日在23:32

key.pem以Bag Attributes ...开始,我的设备不喜欢它。我必须在末尾添加一个额外的命令:openssl rsa -in -key.pem -out key2.pem,以便该密钥采用设备所需的PEM格式。

– Moshe
19/12/24在1:30

#2 楼

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

例如:

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


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

评论


这有点像旧的正则表达式,现在您遇到两个问题。您如何使用此PCKS12密钥库做什么?我希望使用以下答案,因为它解释了如何导出到PCKS12以及如何实际从中获取私钥。

–斯科特
17年9月18日在21:19

在其他地方尚未完全明确:将Java密钥库转换为较新的PKS12格式,而不是较旧的格式。然后,您可以更强大地处理私钥的移动。之后,keytool可以与PKS12格式的密钥库配合使用。使用上面给出的-importkeystore调用,然后将输出文件与原始jks文件一起使用的任何地方使用输出文件。或者只是将其复制到旧的(以前备份以防万一).jks文件上。

–罗宾·戴维斯(Robin Davies)
20 Mar 19 '20 at 12:30

#3 楼

试试“ Keystore Explorer”
我同意Bruno。 Keytool是处理Java密钥库时的终极工具,但是有一个漂亮而功能强大的免费工具:
Keystore Explorer
我经常使用它,不需要其他东西。

评论


Hmm,一个Sourceforge网站-他们不是因为将恶意软件注入下载而闻名吗?不知道我会在钥匙上使用Sourceforge的工具。

– GUB
16年1月9日在15:37

至少在Mac上,此工具充满了空指针错误。

–布鲁诺·布鲁诺斯基(Bruno Bronosky)
16-2-16在18:24

KeyStore Explorer不久前已移至GitHub。新网站是keystore-explorer.org

–欧姆龙
16年2月24日在1:32

希望它有一个CLI(cmd行接口)。作者嘲笑了这个主意,但bu决定反对。遗憾的是,它确实解决了许多“ keytool”的缺点,例如另外不支持对称(“秘密”)键的访问/导出。这些不能转换为PKCS12(格式不支持符号键)。正如@cjbooms所指出的,有一个JDK“ KeyStore” API。哎呀,写你自己的“ keytool”(这就是他们所做的)...

–galaxis
19年6月10日在21:02

#4 楼

如果有人在这里试图从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>


评论


为了使任何keytool命令使用JKS以外的格式,必须指定它;为-importkeystore添加-srcstoretype jceks。

–dave_thompson_085
16-09-30在7:14

那正是我想要的。谢谢。我创建了密钥:keytool -v -keystore output.p12 -genseckey -storetype PKCS12 -keyalg AES -alias new_aes_key -keysize 256,然后我能够提取密钥:java ExportPrivateKey output.p12 pkcs12密码new_aes_key密码new.pem

–user1683793
17年5月2日在23:52

#5 楼

有一种允许移动私钥的格式称为PKCS#12。随着需求的发展,这种格式后来出现在PKI证书和相关密钥库的演变中。如果考虑通过访问和传输私钥而产生的信任链问题,您会明白为什么它不包含在初始功能中,而是在操作需求的压力下出现的。这是挑战的核心原因。

Java密钥库是PKCS#12格式的最初用户之一,但作为导入者而不是导出者。看来Java密钥库的安全性设计仍然不支持将私钥导出为标准功能。同样,出于这个事实,有很好的安全原因。就是说,私有例程已按以下参考文献进行编写:http://www.startux.de/index.php/java/44-dealing-with-java-keystoresyvComment44

如果可能的话,我会考虑在OpenSSL和新密钥中创建新的密钥库,而不是尝试从Java密钥库中撬出私钥。通过打开Java密钥库并提取私钥,人们已经超越了设计的安全功能。多年来一直需要导出PKCS#12功能,但Java仍不支持该功能。我的想法是出于非常好的密码学原因,因此除非绝对必要,否则我将采取这一步骤。

评论


您能否阐明为什么建议不要重用Java密钥?

–nealmcb
2011年5月13日20:15

好的,我将进行编辑以解释我与公开私钥有关。

–zedman9991
2011年5月13日在20:32

自Java 6发行以来,keytool已支持导出到PKCS#12(通过PKCS12密钥库类型)。

–布鲁诺
11年5月13日在21:21

我不确定有关导出私钥(或转换其容器)的担忧是否真的成立。例如,如果它与已由CA签名的证书相匹配,则重用同一私钥是非常有意义的(否则,该证书也必须重新颁发),这可能会在更改CA的实现时发生服务器(例如,基于Apache的HTTP服务器或反向代理的基于Java的服务器)。从一种格式转换为另一种格式并不意味着您不必大意。

–布鲁诺
2011年5月13日在21:45

这个答案是错误的:正如其他答案所解释的那样,Java的keytool确实允许导出私钥。

–sleske
16年2月9日在13:19