目录
问题表现
报错关键信息:



[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.jar与US_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应用报错问题,关键信息指向org.bouncycastle.jcajce.provider.asymmetric.rsa.DigestSignatureSpi$SHA256。一是当前JDK版本不支持RSA SHA256加密算法,可修改JCE安全策略解决;二是jar包版本冲突,可指定jar包版本并放于应用lib目录解决。
1650

被折叠的 条评论
为什么被折叠?



