ClassNotFoundException: org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256

博客主要探讨Java应用报错问题,关键信息指向org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256。一是当前JDK版本不支持RSA SHA256加密算法,可修改JCE安全策略解决;二是jar包版本冲突,可指定jar包版本并放于应用lib目录解决。

目录

问题表现

情况一:当前JDK版本不支持

情况二:jar包版本冲突


问题表现

报错关键信息:

[Illegal access: this web application instance has been stopped already. Could not load [org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.]
java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
…
com.ntko.docsign.sdk.gm.GMDigitalSeal    : SealValidationErr:SEAL_SIGNATURE_INIT_ERR

java.security.NoSuchAlgorithmException: class configured for Signature (provider: BC) cannot be found.
…
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256

当然应用报错还有其他的信息,我这里把关键的信息提取出来:

1、 Could not load [org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256].

2、java.security.NoSuchAlgorithmException: class configured for Signature (provider: BC) cannot be found.

3、Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256

情况一:当前JDK版本不支持

可以看到 整个应用报错,实际是指向 org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256  提示java.security.NoSuchAlgorithmException: 没有这样的加密算法导致的。

意思是:当前使用的java jdk环境 的JCE不支持RSA SHA256的加密算法。 而应用本身有用到,但是找不到,不好意思,我要给你报错了。

针对这种问题,我们参考官方的资料 :https://www.oracle.com/java/technologies/javase-jce-all-downloads.html, 可知 在早于8u161, 7u171, and 6u181的JDK8、7版本上默认是没有支持RSA256及以上算法的。 

实际使用过程中我们可以发现:Oracle的JDK8、OpenJDK8的版本都有可能会有这样的问题。默认不支持增强型加密算法,如果是128位的加密算法可能就不会出现这样的问题了。 

那针对这种类型的问题,我们也可以修改java 的JCE安全策略,来使得其支持增强型加密算法。

观察对应JDK目录结构可以发现:在jdk安装目录下的jre/lib/security/policy里有limited与unlimited文件夹,这两个文件夹里的文件名是一样的:local_policy.jarUS_export_policy.jar

根据官方资料,可得知limited里的策略配置就是支持增强型加密算法的,我们将limited文件夹下的文件拷贝到policy目录下:

cp policy/limited/local_policy.jar /usr/local/java/jdk1.8.0_311/jre/lib/security/policy/local_policy.jar

sudo cp policy/limited/US_export_policy.jar /usr/local/java/jdk1.8.0_311/jre/lib/security/policy/US_export_policy.jar  #将jre/lib/jre/lib/security/policy/下limited下的jar拷贝到policy文件夹下

之后再重新启动Tongweb应用服务器,再尝试应用已正常使用。其他应用服务器可同样处理办法。

如果,您使用的版本不是我这样的情况,就参考官方资料下载jar文件,然后放好,应该就可以了。

======================================================================

情况二:jar包版本冲突

出现

Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256 

报错,还有一种可能:JDK本身没有问题,但是应用部署起来就是要报这个错。此时就是要考虑是不是jar包冲突的情况了!当通过一个jar有不同版本时候,他就不知道到底用哪个,然后就直接报错:我找不到了,你看着办吧!

针对这种jar包版本冲突的问题,我们需要先找到到底是哪个jar:org.bouncycastle 

这个对应的jar信息可以查看:https://mvnrepository.com/artifact/org.bouncycastle上的介绍,

 bcprov-jdkXXon-xxx.jar :The Bouncy Castle Crypto package is a Java implementation of cryptographic algorithms. This jar contains JCE provider and lightweight API for the Bouncy Castle Cryptography APIs for JDK XX and up  即:适用于jdk XX及以上版本的 ,这个jar包含了JCE provider 以及轻量级的Bouncy Castle Cryptography APIs的API...大致就是这个意思了~~

bcpkix-jdk18on-xxx.jar

The Bouncy Castle Java APIs for CMS, PKCS, EAC, TSP, CMP, CRMF, OCSP, and certificate generation. This jar contains APIs for JDK 1.8 and up. The APIs can be used in conjunction with a JCE/JCA provider such as the one provided with the Bouncy Castle Cryptography APIs. 这个就是提供了CMS, PKCS, EAC, TSP, CMP, CRMF, OCSP以及证书产生相关的Bouncy Castle Java APIs,适用于1.8及以上版本的jdk环境

 bcutil-jdk18on-XXX.jar:

The Bouncy Castle Java APIs for ASN.1 extension and utility APIs used to support bcpkix and bctls. This jar contains APIs for JDK 1.8 and up.如果需要使用ASN.1相关的接口就需要使用到这个包,同样的需要与jdk版本进行匹配 

 当我们应用使用这些jar的时候,应用部署使用的应用中间件软件中可能也有这些jar,而且版本还不一样,这样就会出现冲突。除了按照中间件本身的jar包冲突处理办法,还可以在应用中指定使用的jar包版本,并且将这些jar包放到应用的lib目录下,例如:在maven中指定依赖情况:

<!-- 

https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk18on -->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk18on</artifactId>
            <version>1.77</version>
        </dependency>
        <!-- 

https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk18on -->
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk18on</artifactId>
            <version>1.77</version>
        </dependency>
 

这样一来,应用部署运行就不会再报错了。

当前以上是jar包冲突的情况之一,还有一种情况就是:应用里指定了依赖,但是应用还是要报错,这种情况多半就是:应用本身自己jar包版本放多了!比如说原本应该是:

 然后放成这样:

然后也是会报错的!

所以当遇到Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256  这样的问题的时候就多方排查一下吧,不是环境不支持就是jar包冲突。只要解决这两种情况,理论上就OK了。

`java.lang.ClassNotFoundException: org.bouncycastle.jsse.provider.BouncyCastleJsseProvider` 异常通常表示 Java 虚拟机(JVM)在运行时无法找到 `org.bouncycastle.jsse.provider.BouncyCastleJsseProvider` 类。这一般是由于缺少相关依赖库导致的。`Bouncy Castle` 是一个提供了大量密码学算法实现的 Java 库,`BouncyCastleJsseProvider` 是其提供的一个 JSSE(Java Secure Socket Extension)实现。 #### 解决方案 ##### 1. 使用 Maven 添加依赖 如果你使用的是 Maven 项目,可以在 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.70</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.70</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcjsse-jdk15on</artifactId> <version>1.70</version> </dependency> ``` ##### 2. 使用 Gradle 添加依赖 如果你使用的是 Gradle 项目,可以在 `build.gradle` 文件中添加以下依赖: ```groovy implementation 'org.bouncycastle:bcprov-jdk15on:1.70' implementation 'org.bouncycastle:bcpkix-jdk15on:1.70' implementation 'org.bouncycastle:bcjsse-jdk15on:1.70' ``` ##### 3. 手动添加 JAR 文件 如果你没有使用构建工具,可以手动下载 `bcprov-jdk15on.jar`、`bcpkix-jdk15on.jar` 和 `bcjsse-jdk15on.jar` 文件,并将它们添加到你的项目的类路径中。 #### 验证依赖是否正确添加 添加依赖后,可以通过以下代码验证 `BouncyCastleJsseProvider` 是否可以正常加载: ```java import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider; import javax.net.ssl.SSLContext; import java.security.Security; public class BouncyCastleProviderTest { public static void main(String[] args) { try { // 添加 Bouncy Castle JSSE 提供程序 Security.addProvider(new BouncyCastleJsseProvider()); // 创建 SSL 上下文 SSLContext sslContext = SSLContext.getInstance("TLS", "BCJSSE"); System.out.println("Bouncy Castle JSSE 提供程序加载成功!"); } catch (Exception e) { e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值