正在读取PEM格式的PKCS8:找不到提供程序



尝试使用以下内容读取PEM格式的PKCS8私钥:

private static PrivateKey loadPrivateKey()
throws IOException, GeneralSecurityException, OperatorCreationException, PKCSException {
FileReader fileReader = new FileReader(certsRoot + "/pep-client-key.pem");
PEMParser keyReader = new PEMParser(fileReader);
JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
InputDecryptorProvider decryptionProv = new JceOpenSSLPKCS8DecryptorProviderBuilder().build("mypassword".toCharArray());
Object keyPair = keyReader.readObject();
PrivateKeyInfo keyInfo;
if (keyPair instanceof PKCS8EncryptedPrivateKeyInfo) {
keyInfo = ((PKCS8EncryptedPrivateKeyInfo) keyPair).decryptPrivateKeyInfo(decryptionProv); // Exception thrown from here
keyReader.close();
return converter.getPrivateKey(keyInfo);
}
return null;
}

生成以下错误:

org.bouncycastle.pkcs.PKCSException: unable to read encrypted data: 1.2.840.113549.1.5.13 not available: Cannot find any provider supporting 1.2.840.113549.3.7
at org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo.decryptPrivateKeyInfo(Unknown Source)

我已经向OpenSSL核实了该文件可以作为PKCS8 PEM处理,并提供了密码。

知道吗?我不介意是否有一个不涉及BouncyCastle图书馆的解决方案。

1.2.840.113549.3.7是PKCS5=rfc2898 sec B.2.2中DES-EDE3-CBC-Pad(在PBES2中)的OID。(1.2.840.113549.1.5.13是所有PBES2变体的"外部"OID。)

Sun现在的Oracle(默认)提供程序确实支持带有CBC和PKCS5/7填充的DES-EDE3算法(也称为TripleDES或TDEA密钥选项1),但没有此OID映射。BouncyCastle提供程序确实有映射,因此如果您将BC提供程序用于此操作,它应该可以工作。这可以通过完成

通过在JRE/lib/security/java.security中配置security.provider.<i>(更新:在j9+JRE/conf/security/java.security中)或
  • 对于java.lang.security.Provider.addProvider (new BouncyCastleProvider())的JVM,或者
  • 对于此操作,请将具有BC提供程序的名称或对象的.setProvider()添加到JceOpenSSLPKCS8DecryptorProviderBuilder调用中
  • 注意,TripleDES的BC似乎需要在j8u151以下的Oracle Java上使用"无限强度策略";请参阅由于密码和InvalidKeyException非法密钥大小和许多其他重复操作而无法打开PKCS12存储。

    最新更新