尝试使用 Java 密钥库解析 WS2016 生成的 PKCS12:PKCS12 完整性检查失败
Trying to parse PKCS12 generated by WS2016 using Java Keystore: Failed PKCS12 integrity checking
我正在尝试使用 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`
经过一番挖掘,windows-server-2016 似乎改变了他们格式化 PKCS12 和 PFX 证书的方式。具体来说:
Pre-RS1,PKCS7 EncryptedData 用于 CertBag;在 RS1 中,已切换到 PKCS7 数据。 CertBag中AUthSafe内容有多种选择:
AuthenticatedSafe ::= SEQUENCE OF ContentInfo
-- Data if unencrypted
-- EncryptedData if password-encrypted
-- EnvelopedData if public key-encrypted
似乎这个开关可能导致 Java 密钥库失败,但我不确定如何修复它。我可以使用开放式 ssl 解析证书,所以我知道这不是证书本身的问题。我们必须支持来自 WS2016 的证书,因此非常感谢这里的任何见解。
这是 JDK 8 的一个错误,现已解决。 https://bugs.openjdk.java.net/browse/JDK-8202299
我正在尝试使用 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`
经过一番挖掘,windows-server-2016 似乎改变了他们格式化 PKCS12 和 PFX 证书的方式。具体来说:
Pre-RS1,PKCS7 EncryptedData 用于 CertBag;在 RS1 中,已切换到 PKCS7 数据。 CertBag中AUthSafe内容有多种选择:
AuthenticatedSafe ::= SEQUENCE OF ContentInfo
-- Data if unencrypted
-- EncryptedData if password-encrypted
-- EnvelopedData if public key-encrypted
似乎这个开关可能导致 Java 密钥库失败,但我不确定如何修复它。我可以使用开放式 ssl 解析证书,所以我知道这不是证书本身的问题。我们必须支持来自 WS2016 的证书,因此非常感谢这里的任何见解。
这是 JDK 8 的一个错误,现已解决。 https://bugs.openjdk.java.net/browse/JDK-8202299