[WEBLOGIC] bcprov中BCECPrivateKey cannot be cast to BCECPrivateKey

总述

私钥类型:EC PRIVATE KEY
使用jar包 bcprov-jdk15on-1.59.jar
重启weblogic后首次启动项目A并使用某工具类B不会报错, 但是在weblogic中重启项目A后再使用某工具类B就会报错, 具体代码:
BCECPrivateKey b = (BCECPrivateKey)kf.generatePrivate(peks);
异常信息:
sm2 Exception msg={org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey cannot be cast to org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey} exception={java.lang.ClassCastException: org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey cannot be cast to org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey} at com.*.bcpcs.auth.SignUtils.sign(SignUtils.java from InputFileObject:44)(第三方工具)
原因未知, 只知道是weblogic中重启项目A后, 报错代码中等号左侧BCECPrivateKey类加载器变更, 而右侧方法返回的实例的类的加载器是weblogic首次加载BCECPrivateKey时使用的类加载器, 导致类名相同但是类加载器不同不能强制转换.

处理

  1. 删除war包中lib下的bcprov-jdk15on-1.59.jar
  2. 将bcprov-jdk15on-1.59.jar放置在weblogic的域名下的/lib/文件下(eg:/安装路径/user_projects/domains/域名/lib)(同startWeblogic.sh所在目录/bin是同级的/lib)
  3. 执行ps-ef|grep java和kill -9 pid停止weblogic, 之后重启webLogic就不会有该问题了
    如果不重启weblogic只重启项目, 配置不会生效

现象

见总述中描述
本地tomcat不会有该问题

排查

  1. 在初步的报错信息中未能找到明确的报错位置, 通过jd-gui工具反编译jar文件, 并依次提取其中的代码测试后锁定了关键代码
byte[] pkcs8Der = new byte[]{/*由私钥进过 BCECUtil.convertPemToPkcs8DerEcPriKey 处理的返回数组*/};
PKCS8EncodedKeySpec peks = new PKCS8EncodedKeySpec(pkcs8Der);
KeyFactory kf = KeyFactory.getInstance("EC", "BC");
Object obj = kf.generatePrivate(peks);
logger.error("generatePrivate 生成实例类名:"+obj.getClass());
logger.error("generatePrivate 生成实例类加载器:"+obj.getClass().getClassLoader());
logger.error("generatePrivate 生成实例类加载器类名:"+obj.getClass().getClassLoader().getClass());

logger.error("BCECPrivateKey.class 类名:"+BCECPrivateKey.class);
logger.error("BCECPrivateKey.class 类加载器:"+BCECPrivateKey.class.getClassLoader());
logger.error("BCECPrivateKey.class 类加载器的类:"+BCECPrivateKey.class.getClassLoader().getClass());
logger.error("BCECPrivateKey.class 类加载器的类的加载器:"+BCECPrivateKey.class.getClassLoader().getClass().getClassLoader());

logger.error( "generatePrivate 获取的实例是否为  BCECPrivateKey.class 的实例:" + (obj instanceof BCECPrivateKey));
  1. 通过对比发现是类的加载器不一致导致的,
    KeyFactory.getInstance返回的实例的类加载器始终是weblogic首次加载BCECPrivateKey时的类加载器weblogic.utils.classloaders.ChangeAwareClassLoader@xxxx
    而直接使用 BCECPrivateKey.class.getClassLoader() 获取的类加载器每次都会变更, 导致 instanceof 返回false
  2. 删除war中的bcprov-jdk15on-1.59.jar ; 在webLogic的对应域名下的lib目录中加入bcprov-jdk15on-1.59.jar,
  3. 之后重启weblogic, BCECPrivateKey.class的类加载器变更为java.net.URLClassLoader@xxxx, 且重启项目不会变化, 问题解决.
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WebLogic服务器,如果在应用程序部署过程出现了ClassCastException(类转换异常)错误,通常是由于应用程序存在类型转换错误导致的。 ClassCastException常见的原因有: 1. 类型转换错误:在代码进行了错误的类型转换,例如将一个对象转换为与其类型不匹配的类。 2. 版本不兼容:可能出现在应用程序和WebLogic服务器之间使用不同版本的类或接口时。这可能导致对象无法正确转换。 3. 缺少依赖:应用程序可能缺少所需的依赖项,导致类无法加载或转换。 解决这个问题可以采取以下步骤: 1. 检查代码的类型转换:仔细检查代码的类型转换操作,确保类型转换是正确的,并与目标类匹配。 2. 检查依赖项:确保应用程序的所有依赖项都正确配置和部署,并且与WebLogic服务器上的版本兼容。 3. 清除临时文件:删除WebLogic服务器上的临时文件,然后重新部署应用程序。这有助于消除可能存在的任何旧版本或损坏的类文件。 4. 检查日志文件:查看WebLogic服务器的日志文件,以获取更详细的错误信息和堆栈跟踪,以便更好地定位问题所在。 总之,ClassCastException在WebLogic上传应用程序时可能发生,原因可能是类型转换错误、版本不兼容或缺少依赖项。解决方法包括检查代码的类型转换、检查依赖项、清除临时文件,并查看日志文件以获得更多信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值