java - 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”对象。我做错了什么?你能帮助我吗?
解决方案
我导入了证书:
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应用程序来管理/导入密钥和证书。
推荐阅读
- php - WordPress 中的 PHP DOM - 在输出缓冲区 HTML 中添加属性
- clojure - clojure 的“doc”命令打印出来是什么?
- javascript - 按下提交按钮后,寻找我的 Javascript 加载程序以激活
- swift - 填充 CirleProgressView 并将结果保存到 UserDefaults
- python - 发表评论后如何重定向我的用户
- android - Android studio - 在服务上发送关键事件
- r - 生成要复合的值索引,但以可扩展的方式忽略初始值
- python - 具有 pt_BR 语言环境的 Alpine 上的 Python 仍以英语输出
- git - Git:分支分歧后用特定更改更新 PR
- python - 附加到实例变量也附加到分配给实例变量的 init 参数?