【问题标题】:Java casting error when retrieving private key from keystore从密钥库中检索私钥时出现 Java 转换错误
【发布时间】:2017-06-21 14:40:19
【问题描述】:

我目前正在尝试对 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

对于这个问题的任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 其实keytool可以导入一个PEM证书就好了;您的问题是pkcs12 (import) 的输出包含私钥和证书(通常不止一个)。 openssl x509 具有将仅一个证书从组合输入中复制到新文件的副作用,无论您使用什么-outform。但正如回答的那样,仅使用证书是错误的;签名需要私钥证书。
  • 感谢@dave_thompson_085,这是有道理的。

标签: java certificate digital-signature keystore


【解决方案1】:

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

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

【讨论】:

  • 感谢@pedrofb 提供的信息 - 因此我能够解决问题 - 我用来解决问题的步骤如下所示
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多