[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
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值