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

时间:2017-06-21 14:40:19

标签: java certificate digital-signature keystore

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

Programming With the Java XML Digital Signature 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转换为.der文件,原因是.pem格式没有导入密钥库。我使用以下命令将.pem转换为.der:

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

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

keytool -import -alias mykey -keystore "C:\Program Files\Java\jdk1.8.0_131\jre\lib\security\cacerts" -file myfile.der

对此问题的任何帮助都将非常感激。感谢。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

根据@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"