当前位置: 首页 > 面试题库 >

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

夏侯楷
2023-03-14
问题内容

尝试使用以下方法读取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-now-Oracle (默认)提供程序 确实支持具有CBC和PKCS5 / 7填充的DES-EDE3算法(aka
TripleDES或TDEA密钥选项1),但 没有此OID映射
。BouncyCastle提供程序确实具有该映射,因此,如果您将BC提供程序用于此操作,它将起作用。这是可以做到
为所有JVM通过配置security.provider.<i>JRE/lib/security/java.security:(J9中更新+ JRE/conf/security/java.security)或
为JVM通过java.lang.security.Provider.addProvider (new BouncyCastleProvider())
通过添加*此操作.setProvider()使用的名称或对象为BC提供给您的JceOpenSSLPKCS8DecryptorProviderBuilder调用



 类似资料:
  • 问题内容: 我正在尝试将Entity Framework与MySQL配合使用,但出现上述错误。我安装了最新的MySQL连接器。 完整错误为: 但是,我找不到任何建议说明您如何在“ entityFramework”部分中进行注册的内容。 其他一些帖子(例如)建议将提供程序添加到该 部分中,如下所示: 但这不起作用,因为它声称名称是重复的。而且,如果我实际上遍历了,我可以看到最后一个是MySQL提供程

  • 问题内容: 如何从包含证书和私钥的PEM文件中以编程方式获取KeyStore?我试图在HTTPS连接中向服务器提供客户端证书。我已经确认,如果我使用openssl和keytool来获取jks文件(该文件是动态加载的),则客户端证书可以使用。我什至可以通过动态读取p12(PKCS12)文件来使其工作。 我正在考虑使用BouncyCastle的PEMReader类,但无法克服一些错误。我正在使用-Dj

  • 问题内容: 我有PEM格式+ PKCS#1(我想)的RSA公钥: 我想在Python中获取其ASN1编码版本的SHA1摘要。第一步应该是读取此密钥,但是我在PyCrypto中无法做到这一点: PyCrypto的文档说支持PEM + PKCS#1,所以我很困惑。我也尝试过M2Crypto,但事实证明M2Crypto不支持PKCS#1,而仅支持X.509。 问题答案: PyCrypto支持 PKCS#

  • 我有一个与问题“找不到具有固定名称”System.Data.SqlClient“的ADO.NET提供程序的实体框架提供程序”中提供的问题类似的问题,错误包含以下消息: “具有固定名称”System.Data.SqlClient“的ADO.NET提供程序未在计算机或应用程序配置文件中注册,或者无法加载。有关详细信息,请参阅内部异常。” 正如相关问题的答案所提示的,我已经通过包管理器控制台重新安装了实

  • 我试图捕捉图像使用相机意图并将其发送到服务器。 我遵循了官方https://developer.android.com/training/camera/photobasics 但是在使用FileProvider从filepath获取Uri时出现异常。 我有个例外 无法找到包含 /storage/emulated/0/Android/data/com.example.app/files/Pictur

  • 我有一个要求,通知客户,他们的证书将在一些日子过期,所以在那之前续订工作TLS加密工作预期。 如何检索PEM格式证书的到期时间?