关于 java.lang.SecurityException: JCE cannot authenticate the provider BC 问题的另一种可能

目录

1、背景

2、新的问题 Type 'org/bouncycastle/asn1/DERIA5String' (current frame, stack[2]) is not assignable to 'org/bouncycastle/asn1/ASN1IA5String'

3、 新的问题class "org. bouncycastle.asnl,ASN1IA5Strings"'s signer information does notmatch signer information of other classes in the same package

4、tomcat jar加载机制

5‌、jre ext 目录作用‌

6.总结


1、背景

依旧是跟上一次 的 java.lang.SecurityException: JCE cannot authenticate the provider BC 问题表现一致,需要使用加解密相关算法,文件解密获取信息失败。  使用的是tomcat作为应用的容器。

上一次我遇到的这个问题,处理办法详见: 

java.lang.SecurityException: JCE cannot authenticate the Provider BC问题处理方法记录-优快云博客

于是乎再一次按照上次的方法处理: 

做完这些,文件是可以正常解析了,然而在应用运行过程中出现了新的问题。具体如下:

2、新的问题 Type 'org/bouncycastle/asn1/DERIA5String' (current frame, stack[2]) is not assignable to 'org/bouncycastle/asn1/ASN1IA5String'

应用实际上是在做类似签名这样的操作,日志报错内容为:


java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    com/ntko/docsign/sdk/gm/GMDigitalSeal.create(Lcom/ntko/docsign/sdk/gm/GMSpecification;Lcom/ntko/docsign/sdk/gm/GMDigitalSeal$GMSealType;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;IILjava/util/Date;Ljava/util/Date;Ljava/util/List;Lcom/ntko/docsign/sdk/params/FileKeystore;Ljava/util/List;)Lcom/ntko/docsign/sdk/gm/GMDigitalSeal$DigitalSeal; @162: invokespecial
  Reason:
    Type 'org/bouncycastle/asn1/DERIA5String' (current frame, stack[2]) is not assignable to 'org/bouncycastle/asn1/ASN1IA5String'

  Current Frame:
    bci: @162
    flags: { }
    locals: { 'com/ntko/docsign/sdk/gm/GMSpecification', 'com/ntko/docsign/sdk/gm/GMDigitalSeal$GMSealType', 'java/lang/String', 'java/lang/String', 'java/io/File', integer, integer, 'java/util/Date', 'java/util/Date', 'java/util/List', 'com/ntko/docsign/sdk/params/FileKeystore', 'java/util/List', 'java/security/cert/Certificate', 'java/security/PrivateKey', 'org/bouncycastle/asn1/DEROctetString', 'org/bouncycastle/asn1/ASN1EncodableVector' }
    stack: { uninitialized 97, uninitialized 97, 'org/bouncycastle/asn1/DERIA5String', 'org/bouncycastle/asn1/DEROctetString', 'org/bouncycastle/asn1/ASN1Integer', 'org/bouncycastle/asn1/ASN1Integer' }
  Bytecode:
。。。。。。

反正一堆错误,实际上应该归结于:

  Reason:
    Type 'org/bouncycastle/asn1/DERIA5String' (current frame, stack[2]) is not assignable to 'org/bouncycastle/asn1/ASN1IA5String'

这个问题,去查看源代码是发现做了一个类型转换,从DERIA5String与ASN1IA5String的转换 ,但是转换时候并不匹配,大概率是因为当前环境里使用的 DERIA5String  与ASN1IA5String 版本不匹配.......

首先需要了解 这个org/bouncycastle/asn1/ASN1IA5String 以及DERIA5String 在哪里

可以通过Maven网站 查询 org.bouncycastle:https://mvnrepository.com/search?q=org.bouncyCastle

查询到org.bouncycastle: 相关的jar包有 :

1、bcprov-jdkXXX.jar

比如 bcprov-jdk15on :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 1.5 and up.    适用于jdk 1.5及以上版本,包含了JCE provider以及轻量级的实现java加密算法的相关API

 bcprov-jdk18on  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 1.8 and up.:  当jdk版本在1.8及以上版本时候,用bcprov-jdk18on的jar包,而这个jar又有具体版本号 如:  官方有说明   bcprov-jdk15on的工作是已经转移到了 bcprov-jdk18on 上面了

2、bcpkix-jdkXXX.jar  : 

 bcpkix-jdk15on: 适用于 jdk 1.5及以上版本  ,包含了  CMS, PKCS, EAC, TSP, CMP, CRMF, OCSP以及证书生成相关的java api,这些api可以与JCE/JCA provider 比如Bouncy Castle Cryptography的相关API结合使用。说白点就是  可以和bcprov-jdkXXXon 结合使用。

bcpkix-jdk18on: 适用于jdk 1.8及以上版本,bcpkix-jdk15on的相关功能已转至  bcpkix-jdk18on

3、bcprov-ext-jdkXXX.jar

bcprov-ext-jdk15on:适用于jdk 1.5及以上版本 ,包含了JCE provider以及轻量级的实现java加密算法的相关API,同时包含了 NTRU加密算法

bcprov-ext-jdk18on:  适用于jdk 1.8及以上版本,bcprov-ext-jdk18on相关功能已转至   bcprov-ext-jdk18on。

4、bcutil-jdk18on .jar   :适用于jdk 1.8 及以上版本,包含了ASN.1的扩展以及utility的用于支持bcpkix以及bctls的相关API。也就是说如果 环境是jdk 1.8及以上版本,并且使用了 bcpkix 或者bctls 里的 ASN.1扩展属性或方法 或者utility 就会需要同时引入 bcutil。

上述翻译,如有不准确,请参考官方说明......

以当前遇到的问题的应用使用jar包的情况为例子,去查看这些jar包的情况 :

 以及 开始放到jdk 的 jre/lib/ext下的 

在应用的WEB-INF\lib下的 bcprov-jdk18on-1.77.jar有:ASN1IA5String.class

以及DERIA5String.class 

而在 bcutil-jdk18on-1.77.jar 有asn1但是已经没有了基础类(说明当前应用指定的是用自己项目下的WEB-INF/lib下的bcprov-jdk18on-1.77.jar):

而在此前的 bcprov-ext-jdk15on-160.jar 里没有ASN1IA5String.class 但是却有DERIA5String.class

那么也就是说 开始放置到 

 jre/lib/ext下的 bcprov-ext-jdk15on-160.jar  与应用的 bcprov-jdk18on-1.77.jar 可能存在冲突 (我猜的,可能是由于 应用用的是bcprov-jdk18on-1.77.jar 里的 ASN1IA5String类,而到了 DERIA5String类时,由于两个jar包都有,而本身两个jar 里这个DERIA5String类是不一致的,所以  ,而由于  jre/lib/ext下的 bcprov-ext-jdk15on-160.jar的 是优先于  应用里的 bcprov-jdk18on-1.77.jar加载的,所以 DERIA5String 也优先加载了,然后 由于ASN1IA5String类 与 DERIA5String 版本不一致,属性、方法不相兼容 ,于是就出现了   Type 'org/bouncycastle/asn1/DERIA5String' (current frame, stack[2]) is not assignable to 'org/bouncycastle/asn1/ASN1IA5String'的问题

3、 新的问题class "org. bouncycastle.asnl,ASN1IA5Strings"'s signer information does notmatch signer information of other classes in the same package

之后有尝试 将这几个jar都放到   jre/lib/ext下(应用lib下是将其移除了的)  ,后来就出现了 :

java. lang. SecurityException: class "org. bouncycastle.asnl,ASN1IA5Strings signer information does notmatch signer information of other classes in the same package

 如下图所示:

后来摇人些协助,就将 jre/lib/ext下的bcprov-ext-jdk15on-160.jar 移除了,同时移除了,并将其在 应用lib恢复了,并且将jre/lib/security/下的java.security里添加的内容去掉了,恢复成原来的内容。

 结果 不再报JCE cannot authenticate the provider BC的错。

也就是说到这为止,这个 JCE 报错的问题处理方式 java.lang.SecurityException: JCE cannot authenticate the Provider BC问题处理方法记录-优快云博客  失效了!!! 

而针对:java. lang. SecurityException: class "org. bouncycastle.asnl.ASN1IA5Strings signer information does notmatch signer information of other classes in the same package 问题 实际上就还是 属于jar包冲突的原因 。间接也说明了 开始的猜想 是对的。

每次改动,都有停止tomcat服务,并且删除缓存目录:Catalina。

就很奇怪,诡异~~~  开始怎么都不行,设置之后可以了,但是之后取消也还是可以的,不再报JCE cannot authenticate the provider BC的错。。。。想不通。

4、tomcat jar加载机制

从tomcat jar包的加载顺序:

tomcat的运行需要java 运行时环境,即常说的jdk \jre等,所以会优先加载

  1. 首先是$JAVA_HOME/jre/lib/ext/下的jar文件‌:这是Java运行时环境的扩展目录,Tomcat会首先加载此目录下的jar文件‌。
  2. 接着是TOMCAT_HOME/lib中的jar包‌:这是Tomcat自身的库文件,会被优先加载‌。
  3. 然后是WEB-INF/lib中的jar包‌:每个Web应用都有自己的WEB-INF/lib目录,Tomcat在加载Web应用时会加载此目录下的jar文件‌。
  4. 最后是WEB-INF/classes中的.class文件‌:这些是Web应用自己的类文件,会被最后加载‌。

注意,tomcat 后加载的类会覆盖前面加载的同名类‌。

5‌、jre ext 目录作用

jre的ext目录是Java扩展机制的一部分,它允许用户向Java运行时环境添加自定义的扩展。在此目录中,可以存放一些JAR文件或其他文件,这些文件可以扩展Java的功能,使得开发者可以在应用程序中使用一些额外的库或工具‌。

当多个目录下使用的jar包版本不一致,里面的类存在不一致、不兼容的时候就会出现问题。

由于当时这个问题的环境比较复杂,除了当前应用 还有其他的应用,tomcat本身是做了定制修改的,jdk与jre 也与往常的不一样。 并且也没有办法 去确认还有哪里使用了这些jar包,实在没有办法排查了。

6.总结

后来使用正常环境下的应用环境,包括 tomcat版本、包括jdk版本,配置了环境变量指向 应用自带的jdk路径 ,jdk版本号为:1.8.0_261

,部署发现  而原本环境jdk版本为:java jdk 1.8.0_91-b14 windows   x86环境

结合之前的问题出现以及jdk版本:java/jdk1.8.0_311 aarch64环境 

猜想: java.lang.SecurityException: JCE cannot authenticate the provider BC 问题 的出现,与jdk版本 有关系,不同环境下,可能因为环境差异、版本差异而出现。 总之就是:具体环境具体分析.....

感觉是废话呢........

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值