我需要签署一些字符串消息,但是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”对象。 我做错了什么?你能帮我吗?
答案 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 应用程序来管理/导入密钥和证书。