繁体   English   中英

尝试使用 Java Keystore 解析 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 密钥库失败,但我不确定如何修复它。 我可以使用 open ssl 解析证书,所以我知道这不是证书本身的问题。 我们必须支持来自 WS2016 的证书,因此非常感谢这里的任何见解。

这是 JDK 8 的一个错误,此后已解决。 https://bugs.openjdk.java.net/browse/JDK-8202299

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM