当前位置: 首页 > 知识库问答 >
问题:

Java11/12下不加载Bouncy castle安全提供程序

闾丘康安
2023-03-14

我正在尝试做一件本来应该是微不足道的事情,但我却面临着一个问题。

在将JavaFx应用程序从Java8迁移到Java11(也尝试了Java12,结果相同)之后,bouncy castle安全提供程序不会加载。这是一个Maven项目,我对其进行了更新,以使用符合Java11的插件。它编译得很好,但运行时,我在终端窗口中得到了以下信息:

jar.launcher java.lang.reflect.InvocationTargetException(java.base/jdk.internal.reflect.nativeMethodAccessorImpl.Invoke0(原生方法)(java.base/jdk.internal.reflect.nativeMethodAccessorImpl.Invoke)(nativeMethodAccessorImpl.java:62)(java.base/jdk.internal.reflect.delegatingMethodAccessorImpl.java:43)(cherhelper$fxhelper.main(launcherhelper.java:1051)由:java.lang.nclassdeffounderror:org/bouncycastle/jce/provider/bouncycastleprovider在.launcher.main(launcher.java:14)...11其他原因:java.lang.classnotfoundexception:org.bouncycastle.jce.provider.bouncycastleprovider在java.base/jdk.internal.loader.builtinclassloader.loadclass(

在java.security中,我将bouncy castle提供程序作为第一个提供程序(也尝试将其作为最后一个提供程序,但结果相同)

#
# List of providers and their preference orders (see above):
#
security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.2=SUN
security.provider.3=SunRsaSign
security.provider.4=SunEC
security.provider.5=SunJSSE
security.provider.6=SunJCE
security.provider.7=SunJGSS
security.provider.8=SunSASL
security.provider.9=XMLDSig
security.provider.10=SunPCSC
security.provider.11=JdkLDAP
security.provider.10=JdkSASL
security.provider.11=Apple
security.provider.12=SunPKCS11

并且在我的代码中有以下内容(在我过去测试从Java8升级到9或10时,这些内容工作得很好):

            //Since Java 9 we set the unlimited crypto policy in code, not by applying the JCE jars.
            Security.setProperty("crypto.policy", "unlimited");
            //verify that JCE is applied

            // init the BC security provider
            if (Security.getProvider("BC") == null) {
                Security.insertProviderAt(new BouncyCastleProvider(), 0);
                logger.info("Security provider added successfully");
            }

Bouncy castle jar是bcprov-jdk15on-1.61(Bouncy castle provider 1.61版)和bcpkix-jdk15on-1.61.jar。住在正确的地方。

我用来启动JavaFx应用程序的命令行是

java-cp lib-module-path mods-add-modules=javafx.controls、javafx.fxml、javafx.graphics、javafx.web、javafx.swing-jar.launcher,并确保mods和lib位于正确的位置并且可以被jar访问。

我在StackOverflow.com中看到了几个与此类似的问题,但我尝试了提供的解决方案,但它们没有解决问题。

共有1个答案

蓬祺
2023-03-14

我认为您应该(如果还没有完成的话)重试一下BouncyCastle 1.66:它是一个带有模块信息的多版本JAR。

我使用的依赖项:

<dependency> 
  <groupId>org.bouncycastle</groupId>  
  <artifactId>bcprov-jdk15on</artifactId>          
  <version>1.66</version>
</dependency>

您可以使用-djava.Security.debug=JCA为JCA启用调试模式(请参见安全故障排除)。

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

在我的AdoptOpenJDK 11安装的${JAVA_HOME}/conf/security/java.security中。BouncyCastle是由Maven作为scope=compile依赖项提供的。

这段简单的代码:

for (final Provider provider : Security.getProviders()) {
  System.out.println("provider: " + provider.getName());
}

显示bc已加载。

if (Security.getProvider("BC") == null) {
  Security.insertProviderAt(new BouncyCastleProvider(), 0);
  logger.info("Security provider added successfully");
}

文档说明security.insertProviderat:

在指定位置添加新提供程序。该位置是为请求的算法搜索提供程序的首选顺序。职位以1为主,即最优先选择1,其次是2,以此类推。

如果您传递0,这与调用security.addProvider(Provider)相同,您的提供程序将位于末尾(请参阅ProviderList)。

 类似资料:
  • 你好Stackoverflow社区, 在尝试编译使用bouncycastle安全提供程序的maven项目时,我得到了以下错误:我知道必须对jar进行签名,因此我将此添加到pom.xml中以防止编译错误: 基于此(bouncycastle provider找不到算法所需的类),我添加了以下内容:,并且在公共静态void main中添加了具有以下内容的提供程序:。 不幸的是,这没有奏效。对于如何实现上

  • 在Java8中,我通过执行以下步骤全局注册了Bouncy Castle安全提供程序: null

  • 我有一个使用bouncycastle库的Java applet。当我在Eclipse上运行应用程序时,一切正常,但当我在带有标记的浏览器上使用applet时,当我添加安全BouncyCastleProvider时,它会引发异常。 我的stackTrace是: 我正在使用bcpkix-jdk15on-1.48.jar和bcprov-jdk15on-1.48.jar版本的BouncyCastle。为什

  • JCA提供者提出的解决方案是将JAR放在jre/lib/ext文件夹中,但不是从那里加载的。据我所知,这是由于OSGi(Eclipse equinox)类加载器策略将bootstrap类加载器作为每个bundle类加载器的父类,从而排除了从jre/lib/ext文件夹加载的扩展类加载器。即。在jre/lib/ext文件夹中没有一个bundle可以看到任何东西。 是否有一种方法可以让Eclipse

  • 问题内容: 我正在尝试使用bouncycastle使用公共密钥来加密文件。我已经通过编程方式注册了提供程序: 我成功创建了公共密钥对象。 当我使用PGPEncryptedDataGenerator和密钥加密文件时,出现ClassNotFound异常。 似乎提供程序在运行时找不到此类,尽管我确定我有它的jar … 我在Tomcat上运行我的应用程序。使用Maven处理依赖关系- 我放入的充气城堡ja

  • 我的配置是: < li>Grails框架3.0.11 < Li > " org . grails . plugins:spring-security-core:3 . 0 . 3 " < Li > " org . grails . plugins:spring-security-oauth 2-provider:3 . 0 . 0-RC1 " 我已经指定了我的自定义用户详细信息服务(实现Grail