以PEM格式读取PKCS8:找不到提供者

时间:2017-10-16 09:44:00

标签: java bouncycastle

尝试使用以下内容读取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 个答案:

答案 0 :(得分:3)

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

来执行此操作

注意,TripleDES的BC似乎要求Oracle Java下面的'无限强度策略'低于j8u151;请参阅cannot open PKCS12 store because of passwordInvalidKeyException Illegal key size以及许多其他欺骗行为。