2017-10-16 130 views
0

试图读取PEM格式与PKCS8私钥如下:阅读PKCS8 PEM格式:找不到提供商

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的库的解决方案。

回答

2

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)

太阳现在甲骨文(默认)供应商不支持DES-EDE3算法(又名TripleDes的或TDEA匹配选项1)与CBC和PKCS5/7填充,但没有此OID映射它。 BouncyCastle提供程序确实具有映射,因此如果使用BC提供程序进行此操作,它应该可以工作。这可以通过java.lang.security.Provider.addProvider (new BouncyCastleProvider())
*此操作JRE/lib/security/java.security
*配置security.provider.<i>的JVM用的名称或对象为BC提供商加入.setProvider()JceOpenSSLPKCS8DecryptorProviderBuilder调用来完成
*为所有JVM

注意BC for TripleDES似乎需要通过j8在Oracle Java上实现'无限强度策略';见cannot open PKCS12 store because of passwordInvalidKeyException Illegal key size和许多其他愚蠢。