在未知 PRF 算法 (hmacWithSHA256) 上使用 BouncyCastle 加载 pkcs12 文件失败

Loading pkcs12 file with BouncyCastle fails on unknown PRF algorithm (hmacWithSHA256)

我们有一个 pkcs#12 格式的证书,由第 3 方(不由我们管理)提供。在从我们的平台将电子邮件发送给该特定客户之前,我们必须使用此证书签署电子邮件。

旧证书没有问题,但由于它即将过期,我们需要将其替换为具有以下密钥加密模式(通过 openssl 提取)的新证书:

PBES2、PBKDF2、AES-256-CBC、迭代 2000、PRF hmacWithSHA256

尝试使用 bouncycastle 安全提供程序加载此密钥库时,出现以下错误

Caused by: java.io.IOException: exception unwrapping private key - java.security.spec.InvalidKeySpecException: Invalid KeySpec: unknown PRF algorithm 1.2.840.113549.2.9
    at org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.unwrapKey(Unknown Source)
    at org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad(Unknown Source)
    at java.security.KeyStore.load(KeyStore.java:1445)
    at org.obfuscated.SignEmailGenerator.loadKeyStore(SignEmailGenerator.java:130)

代码(为简洁起见删除了异常处理和其他实用程序代码):

KeyStore keystore = KeyStore.getInstance("PKCS12", BouncyCastleProvider.PROVIDER_NAME);        
InputStream trustStoreInputStream = MethodHandles.lookup().lookupClass()
                .getResourceAsStream(mailSigningConfiguration.getKeyStorePath());
keystore.load(trustStoreInputStream, mailSigningConfiguration.getKeyStorePassword().toCharArray());

1.2.840.113549.2.9 是 hmacWithSHA256 的 OID,这让我想到了这个问题。充气城堡不支持这个算法吗?基于 http://www.bouncycastle.org/specifications.html 我猜应该是吧?如果支持,为什么我无法加载这样的文件?

Jdk 1.8.0 bcmail-jdk15 版本 1.66

欢迎任何意见,谢谢。

编辑(私钥是文件的一部分):

c:\Programy\OpenSSL-Win64\bin>openssl pkcs12 -info -in PrivateKey.pfx -nodes -nocerts
Enter Import Password:
MAC: sha256, Iteration 2000
MAC length: 32, salt length: 20
PKCS7 Data
Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 2000, PRF hmacWithSHA256
Bag Attributes
    localKeyID: 01 00 00 00
    friendlyName: ---ommited---
    Microsoft CSP Name: Microsoft Enhanced Cryptographic Provider v1.0
Key Attributes
    X509v3 Key Usage: 10
-----BEGIN PRIVATE KEY-----
-- data is here, but I've ommited it ---
-----END PRIVATE KEY-----
PKCS7 Encrypted data: PBES2, PBKDF2, AES-256-CBC, Iteration 2000, PRF hmacWithSHA256
Certificate bag
Certificate bag
Certificate bag

今天遇到这个问题,使用的BouncyCastle provider是1.51。 服务器日志中的异常是:

2022-01-13 14:28:28,699 ERROR (default task-46) getKeyStore,load. location:xxx.p12 at xxx: java.io.IOException: exception unwrapping private key - java.security.spec.InvalidKeySpecException: Invalid KeySpec: unknown PRF algorithm 1.2.840.113549.2.9
    at org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.unwrapKey(Unknown Source)
    at org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad(Unknown Source)
    at java.security.KeyStore.load(KeyStore.java:1445)

openssl 检查 p12 后。

$> openssl pkcs12 -info -in xxx.p12 -nodes -nocerts
Enter Import Password:
MAC: sha1, Iteration 100000
MAC length: 20, salt length: 20
PKCS7 Data
Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 10000, PRF hmacWithSHA256
Bag Attributes

我使用 BouncyCastle 提供程序 1.69 在另一个环境中对其进行了测试,工作正常。但是由于无法在服务器上升级提供程序,我不得不通过 openssl 重新创建 p12 密钥库以将加密与服务器中的一些旧密钥库对齐,然后它起作用了。

openssl pkcs12 -export -inkey <private> -in <cert> -name <alias> -out <keystore>.p12

检查重新创建的密钥库信息:

$> openssl pkcs12 -info -in xxx.p12 -nodes -nocerts
Enter Import Password:
MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048

当我们更新 SprinBoot Security > 5.4.1 时出现此错误

客户端 BC(Bouncy Castle 提供商)无法加载 X509 证书。 无法加载: PKCS7 数据 Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 10000, PRF hmacWithSHA256 包袋属性

解决方案是: 使用 2 个参数“BC”调用 keystore-Instance KeyStore 存储 = KeyStore.getInstance("PKCS12","BC");

--> 然后你得到旧格式的笼罩 BAG ......