【问题标题】:Java - RSA Public Key from PEM File - java.lang.NoClassDefFoundError: org/bouncycastle/asn1/x509/SubjectPublicKeyInfoJava - PEM 文件中的 RSA 公钥 - java.lang.NoClassDefFoundError: org/bouncycastle/asn1/x509/SubjectPublicKeyInfo
【发布时间】:2020-07-19 18:20:01
【问题描述】:

我有一个 PEM 文件,它是一个 RSA 私钥,我正在使用下面的代码读取私钥和公钥::

            StringReader reader = new StringReader(//pem);

            PEMReader pemReader = new PEMReader(reader);
            final KeyPair keyPair = (KeyPair) pemReader.readObject();
            pKey = keyPair.getPublic();
            RSAPublicKey rsaPublicKey = (RSAPublicKey) pKey;
            rsaPublicKey.getEncoded();
            Base64.getEncoder().encodeToString(rsaPublicKey.getEncoded()))
  

此代码在作为独立 Java 运行时运行良好

但是,当作为 Webapplication 运行时,我收到以下错误::

SEVERE: Servlet.service() for servlet MYSERVER threw exception
java.lang.NoClassDefFoundError: org/bouncycastle/asn1/x509/SubjectPublicKeyInfo
        at org.bouncycastle.jce.provider.JCERSAPublicKey.getEncoded(Unknown Source)

库 :: bcprov-jdk16-143

有什么线索吗??

【问题讨论】:

  • 您是否检查了文件或密钥存储的权限.. 因为网络应用程序可能在不同的帐户下运行。
  • 我将 pem 值加载为字符串对象。我成功获得了 KeyPair,但在提取 Base64 编码之后......它失败了......
  • 请检查您的类路径中是否存在重复的 BC jar。例如网络服务器可能有自己的 bcprov jar,或者可能在您的 JRE 的 lib/ext 文件夹中安装了一个。

标签: java security rsa bouncycastle java-security


【解决方案1】:

该错误是因为您在代码中遗漏了一些 Bouncy Castle jar 依赖项。

【讨论】:

  • Nopes bc 是 WEB-INF/lib 的一部分 - 事实上 org.bouncycastle.jce.provider.JCERSAPublicKey 和 org/bouncycastle/asn1/x509/SubjectPublicKeyInfo 是同一个 jar 的一部分
【解决方案2】:

问题在于 Bouncy Castle 需要在 Java 中注册为有效的加密提供者。你可以用这样的代码来做:

Security.addProvider(new BouncyCastleProvider());

或在 Java 中全局使用 this

【讨论】:

  • 我认为您在注册提供程序失败时不会遇到该异常。以及他在提供的代码片段中没有使用 bouncycastle 提供程序的任何人。
  • 我实际上加载了充气城堡提供程序..doesnt 给出任何错误- Security.addProvider(new BouncyCastleProvider());
猜你喜欢
  • 2014-04-26
  • 2016-12-11
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2015-05-27
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多