我试图使用Java将PKCS12证书解析为一个x509和一个私钥:
final KeyStore keystore = KeyStore.getInstance("PKCS12", "SunJSSE");
keystore.load(pkcs12Certificate, password.toCharArray());
final Enumeration<String> aliases = keystore.aliases();
final String alias = aliases.nextElement();
final PrivateKey key = (PrivateKey) keystore.getKey(alias,
password.toCharArray());
final X509Certificate publicCertificate = (X509Certificate) keystore
.getCertificate(alias);
return create(clientId, key, publicCertificate);`这对于由windows-server-2012构建的证书工作得很好。我们已经将VM更新为windows-server-2016,这导致以下错误破坏了此代码:
Exception in thread "main" java.io.IOException: Integrity check failed:
java.security.UnrecoverableKeyException: Failed PKCS12 integrity checking
at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2146)
at java.base/java.security.KeyStore.load(KeyStore.java:1479)
at com.company.AsymmetricKeyCredential.create(AsymmetricKeyCredential.java:164)
at com.company.Main.main(Main.java:29)
Caused by: java.security.UnrecoverableKeyException: Failed PKCS12 integrity checking
at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:2142)
... 3 more`经过一番探索,2016年windows似乎已经改变了它们格式化PKCS12和PFX证书的方式。具体地说:
前RS1,PKCS7 EncryptedData用于CertBag;在RS1中,则切换到PKCS7数据。AUthSafe内容在CertBag中有多个选项:
AuthenticatedSafe ::= SEQUENCE OF ContentInfo
-- Data if unencrypted
-- EncryptedData if password-encrypted
-- EnvelopedData if public key-encrypted看起来这个开关可能会导致失败,但我不知道如何修复它。我可以用打开的ssl解析证书,所以我知道证书本身没有问题。我们必须支持来自WS2016的证书,所以这里的任何洞察力都是非常感谢的。
发布于 2020-08-11 18:48:08
这是JDK 8中的一个bug,它已经解决了。https://bugs.openjdk.java.net/browse/JDK-8202299
https://stackoverflow.com/questions/49949084
复制相似问题