首页 > 解决方案 > keyStore.getKey(alias, password) 返回 NULL

问题描述

我需要签署一些字符串消息,但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”对象。我做错了什么?你能帮助我吗?

标签: javaspring-bootencryptionjks

解决方案


我导入了证书:
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.pub。其中哪些我也需要导入?

通常 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应用程序来管理/导入密钥和证书。


推荐阅读