弹跳城堡提供程序找不到算法所需的类

我正在尝试使用弹跳城堡使用公钥加密文件。我已按程序注册了提供商:

Security.addProvider(new BouncyCastleProvider());

我已成功创建公钥对象。

当我使用PGP加密数据生成器和密钥加密文件时,我得到一个ClassNotFound异常。

似乎提供者在运行时找不到这个类,尽管我知道我肯定有它的jar...

我在tomcat上运行我的应用程序。使用maven来处理依赖关系 - 我放的充气城堡罐是bcpg,bcprov,bcmail,bctsp。我尝试同时使用1.4和1.6版本,但没有成功。我在maven插件中使用了“依赖层次结构”来表示日食,并在pom中使用了排除项,以确保我的项目中没有多个版本的弹跳城堡。

这是堆栈跟踪:

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)

答案 1

您有一个弹跳城堡安全提供程序安装问题,您需要

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

例如。

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

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

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

答案 2

在我的情况下,它有一次工作得很好,但后来我在尝试使用BC时得到了ClassNotFoundException。我重新启动了Tomcat,然后它工作正常。

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

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


推荐