以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中DES-EDE3-CBC-Pad(在PBES2中)的OID = rfc2898秒B.2.2 。 (1.2.840.113549.1.5.13是所有PBES2变体的’外部’OID。)

Sun-now-Oracle (默认)提供程序支持使用CBC和PKCS5 / 7填充的DES-EDE3算法(也称为TripleDES或TDEA键控选项1),但没有此OID映射 。 BouncyCastle提供程序确实具有映射,因此如果您使用BC提供程序进行此操作,它应该可以工作。 这可以做到
*通过在JRE/lib/security/java.security配置security.provider.来为所有JVM或
*通过java.lang.security.Provider.addProvider (new BouncyCastleProvider())获取JVM或
*对于此操作,通过将.setProvider()与BC提供程序的名称或对象添加到JceOpenSSLPKCS8DecryptorProviderBuilder调用

注意,TripleDES的BC似乎需要通过j8在Oracle Java上实现“无限强度策略”; 看到无法打开PKCS12存储因为密码和InvalidKeyException非法密钥大小和许多其他欺骗。