【问题标题】:keyStore.getKey(alias, password) returns NULLkeyStore.getKey(alias, password) 返回 NULL
【发布时间】:2019-08-19 15:53:05
【问题描述】:

我需要签署一些字符串消息,但 keyStore.getKey() 返回 null。
我做了什么:
我导入了证书:

keytool -importcert -file cert.cer -keystore cert.jks -alias "cert"

我的java代码:

KeyStore keyStore = KeyStore.getInstance(this.keystoretype);
File keyStoreFile = ResourceUtils.getFile("classpath:kkb/"+keystoreFileName);
FileInputStream keyStoreFileInputStream = new FileInputStream(keyStoreFile.getPath());
keyStore.load(keyStoreFileInputStream, storePassArray);
Signature signature = Signature.getInstance(this.signalgorythm);
PrivateKey privateKey = (PrivateKey)keyStore.getKey(alias, keypassArray);

getKey()返回null,因为JavaKeyStore类中的这一行代码,engineGetKey方法:

public Key engineGetKey(String alias, char[] password)
        throws NoSuchAlgorithmException, UnrecoverableKeyException
{
    Object entry = entries.get(convertAlias(alias));
    if (entry == null || !(entry instanceof KeyEntry)) {
        return null;
}

条件“instanceof”返回 false,因为“JavaKeyStore$TrustedCertEntry”类的“entry”对象。 我做错了什么?你能帮帮我吗?

【问题讨论】:

    标签: java spring-boot encryption jks


    【解决方案1】:

    我导入了证书:
    keytool -importcert -file cert.cer -keystore cert.jks -alias "cert"

    确实,您已导入包含公钥的证书

    条件“instanceof”返回 false,因为“JavaKeyStore$TrustedCertEntry”类的“entry”对象。
    我做错了什么?

    现在你打电话:

    PrivateKey privateKey = (PrivateKey)keyStore.getKey(alias, keypassArray);
    

    没有私钥,只有一个证书(通常是 X509Certificate),其中包含一个公钥。

    你能帮帮我吗?

    这取决于你想要/需要什么。

    如果您需要私钥(或密钥对),例如对于签名,您需要导入整个密钥对(例如,来自不同的密钥库)。

    如果证书或公钥足够(例如用于签名验证),您可以获得证书或其公钥

    keystore.getCertificate(alias).getPublicKey()
    

    编辑:

    我有这些文件:ca.cer、cert.cer、cert.der、cert.jks、cert.p12、cert.pfx、cert.pk8、cert.prv、cert.pub、kkbca_test.der、kkbca_test。酒吧。其中哪些我也需要导入?

    通常 PFX 或 P12 文件包含私钥(都是 pkcs12 密钥库)。

    要从 pkcs12 密钥库导入私钥,只需搜索 internetm 示例:https://jackstromberg.com/2013/05/importing-a-ssl-certificate-into-a-java-keystore-via-a-pkcs12-file/

    keytool -v -importkeystore -srckeystore whateverthefileis.p12 -srcstoretype PKCS12 -destkeystore mykeystore -destalias aliasname -deststoretype JKS
    

    如果您更熟悉 UI 工具,可以使用 keystore-explorer 应用程序来管理/导入密钥和证书。

    【讨论】:

    • 我有这些文件:ca.cer、cert.cer、cert.der、cert.jks、cert.p12、cert.pfx、cert.pk8、cert.prv、cert.pub、kkbca_test .der,kkbca_test.pub。其中哪些我也需要导入?
    • @Bekarys 更新了导入密钥对的答案
    • 感谢您的关注,我通过其他人更改 jks 文件解决了这个问题。它不需要导入,只需签署一些字符串。
    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2017-11-02
    相关资源
    最近更新 更多