Java 从密钥库中检索私钥时出现转换错误
Java casting error when retrieving private key from keystore
我目前正在尝试对 SOAP 消息进行数字签名,我正在按照下面的 Oracle 指南进行操作 link:
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
如果您能就此问题提供任何帮助,我们将不胜感激。谢谢。
您需要将证书的 私钥 导入密钥库,而不仅仅是 public 密钥。不建议更新 JVM 的标准 cacerts。使用新文件
不过你的这三个步骤并不是真的需要。直接使用 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"
我目前正在尝试对 SOAP 消息进行数字签名,我正在按照下面的 Oracle 指南进行操作 link:
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
如果您能就此问题提供任何帮助,我们将不胜感激。谢谢。
您需要将证书的 私钥 导入密钥库,而不仅仅是 public 密钥。不建议更新 JVM 的标准 cacerts。使用新文件
不过你的这三个步骤并不是真的需要。直接使用 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"