【发布时间】: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