从密钥库检索私钥时出现 Java 强制转换错误



我目前正在尝试对 SOAP 消息进行数字签名,我正在以下链接中遵循 Oracle 的指南:

使用 Java XML 数字签名 API 进行编程

当我最初运行代码时,出现以下错误:

java.lang.UnsupportedOperationException: trusted certificate entries are not password-protected

然后,我将以下行修改为:

KeyStore.PrivateKeyEntry keyEntry =
(KeyStore.PrivateKeyEntry) ks.getEntry
("mykey", new KeyStore.PasswordProtection("changeit".toCharArray()));

自:

KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("mykey", null);

但是,我现在收到以下错误消息:

java.lang.ClassCastException: java.security.KeyStore$TrustedCertificateEntry cannot be cast to java.security.KeyStore$PrivateKeyEntry

我将假设上述指南中解释的代码是正确的,因此我认为我的密钥库证书可能有问题?

将证书导入密钥库时,我执行以下操作:

1) 使用以下命令从 .pfx 文件创建 .pem:

openssl pkcs12 -in myfile.pfx -out myfile.pem -clcerts

2) 然后,由于 .pem 格式未导入密钥库,我将 .pem 转换为 .der 文件。我使用以下命令从 .pem 转换为 .der:

openssl x509 -outform der -in myfile.pem -out myfile.der

3)最后,我通过运行以下命令导入了我的.der文件:

keytool -import -alias mykey -keystore "C:Program FilesJavajdk1.8.0_131jrelibsecuritycacerts" -file myfile.der

对此问题的任何帮助将不胜感激。谢谢。

您需要将证书的私有密钥导入密钥库,而不仅仅是公钥。不建议更新 JVM 的标准证书。使用新文件

但是你的三个步骤并不是真正需要的。只需直接使用 pfx 文件作为密钥库PKCS12而不是JKS

根据上述来自@pedrofb的反馈,我使用以下命令直接将 .pfx 文件转换为 jks 文件:

keytool -importkeystore -srckeystore "myfile.pfx" -srcstoretype pkcs12 -destkeystore "newkeystore.jks" -deststoretype JKS

然后,我运行以下命令从添加到代码中的新密钥库中获取别名,从而允许我对 XML 进行数字签名:

keytool -list -v -keystore "newkeystore.jks" | findstr "Alias Creation"

最新更新