【问题标题】:bouncycastle provider can't find classes needed for algorithmbouncycastle 提供者找不到算法所需的类
【发布时间】:2023-03-29 13:29:01
【问题描述】:

我正在尝试使用 bouncycastle 使用公钥加密文件。 我已经以编程方式注册了提供程序:

Security.addProvider(new BouncyCastleProvider());

我成功创建了公钥对象。

当我开始使用 PGPEncryptedDataGenerator 和密钥加密文件时,我得到一个 ClassNotFound 异常。

似乎提供者在运行时找不到这个类,虽然我确定我有它的 jar...

我在 tomcat 上运行我的应用程序。 使用 maven 处理依赖关系——我放的充气城堡罐子是 bcpg、bcprov、bcmail、bctsp。 我尝试使用 1.4 和 1.6 版本都没有成功。 我在 Maven 插件中为 Eclipse 使用了“依赖层次结构”,并在 pom 中使用了排除项,以确保我的项目中没有多个版本的 bouncycastle。

这是堆栈跟踪:

org.bouncycastle.openpgp.PGPException: exception encrypting session key
        at org.bouncycastle.openpgp.PGPEncryptedDataGenerator.open(Unknown Source)
        at org.bouncycastle.openpgp.PGPEncryptedDataGenerator.open(Unknown Source)
.....(web application stack trace and uninteresting stuff).....
Caused by: java.security.NoSuchAlgorithmException: No such algorithm: ElGamal/ECB/PKCS1Padding
        at javax.crypto.Cipher.getInstance(DashoA13*..)
        at org.bouncycastle.openpgp.PGPEncryptedDataGenerator$PubMethod.addSessionInfo(Unknown Source)
        ... 42 more
Caused by: java.security.NoSuchAlgorithmException: class configured for Cipher(provider: BC)cannot be found.
        at java.security.Provider$Service.getImplClass(Provider.java:1268)
        at java.security.Provider$Service.newInstance(Provider.java:1220)
        ... 44 more
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.JCEElGamalCipher$NoPadding
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
        at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
        at java.security.Provider$Service.getImplClass(Provider.java:1262)

【问题讨论】:

    标签: java bouncycastle classnotfoundexception


    【解决方案1】:

    在我的情况下,它曾经运行良好,但后来我在尝试使用 BC 时遇到了 ClassNotFoundException。我重新启动了Tomcat,然后它就可以正常工作了。

    我认为,如果您重新部署应用程序,就像您在开发时经常做的那样,它会停止工作。 JNI 是另一个受此问题困扰的东西。

    在我们的例子中,这不是问题。我们从不重新部署测试和生产系统。我更喜欢随应用一起运送 jar,而不必手动将其复制到容器 lib 目录。

    【讨论】:

    • 我在重新加载我的 web 应用程序后得到了 java.security.NoSuchAlgorithmException。当我重新启动 Tomcat 时,这种情况就消失了。
    【解决方案2】:

    您需要在您的 lib 文件夹中添加 javapns.jar 和 bcprove-jdk15on-1.47.jar 文件

    import javapns.Push;
    
    import org.apache.log4j.BasicConfigurator;
    
    public class SendPushNotification {
    
      public static void main(String[] args) {
    
        try {
    
            BasicConfigurator.configure();
            Push.alert("Hello World!", "Cetificate.p12", "password", false,
                    "mydeviceToken");
    
        } catch (Exception e) {
            System.out.println(e);
        }
    
       }
    
    }
    

    【讨论】:

    • 需要 bcprov 的代码不需要 javapns.jar。 (反之亦然,但 javapns 的使用与问题无关。)
    【解决方案3】:

    您遇到了 BouncyCastle Security 提供程序安装问题,您需要这样做

    • 将 BouncyCastle 作为提供程序添加到 JRE/JDK $JAVA_HOME/jre/lib/security/java.security 文件中(确保将其添加到运行时使用的 JRE,例如,如果您安装了多个 JRE/JDK)

    例如。

    security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
    

    (并对它下面的安全提供者重新编号 - 不要将其作为最高优先级的提供者)。

    • 或者您可以像上面尝试的那样以编程方式添加 BouncyCastle,但在这种情况下,安全策略 $JAVA_HOME/jre/lib/security/java.policy 应该是“无限制的”(您可能可以从 Java 主页下载无限制的策略文件)。李>

    【讨论】:

    • 您能否为每种方法提供更多技术细节?
    • 你需要把所有的 bouncycastle jar 放在 lib/ext 中吗?您是否需要重新启动任何内容才能进行更改?
    • IIRC 第一个问题是肯定的,当然,您必须重新启动 JVM(例如,如果您正在运行 Glassfish 或任何其他需要使用 BouncyCastle 的 AppServer)。
    • 技术细节:除了编辑文本文件,第一种方法不需要太多。
    • 为遇到问题的人总结一下:不要以编程方式添加充气城堡。在 $JAVA_HOME/jre/lib/security/java.security 中定义它,并将弹性库放在 jre/lib/ext 中。如果您在 tomcat 上运行您的应用程序并像我一样使用 maven,然后使用 maven 将依赖项范围设置为提供,使用这些设置重新部署您的应用程序并重新启动 tomcat,以便它可以“查看”您放入 lib/ext 中的新库
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-09
    • 2016-02-14
    • 2014-10-10
    • 2021-01-06
    相关资源
    最近更新 更多