keyStore.getKey(别名,密码)返回NULL

时间:2019-08-16 12:36:49

标签: java spring-boot encryption jks

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

1 个答案:

答案 0 :(得分:2)

  

我导入了证书:   
  keytool -importcert-文件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 应用程序来管理/导入密钥和证书。