从BouncyCastle bcprov-jdk15on 1.62升级到1.69的适配及部署问题
BouncyCastle 1.62升级至1.69后的兼容问题解决方案
1. DEROutputStream无法外部访问的处理
BouncyCastle从1.65版本开始将DEROutputStream改为包私有访问权限,不再对外暴露,需替换为官方推荐的公开API:
代码修改示例
原1.62版本代码:
import org.bouncycastle.asn1.DEROutputStream; // ... DEROutputStream derOut = new DEROutputStream(outputStream); derOut.writeObject(asn1Encodable);
修改后1.69版本代码:
使用ASN1OutputStream替代,这是通用的ASN.1输出流公开接口:
import org.bouncycastle.asn1.ASN1OutputStream; // ... ASN1OutputStream asn1Out = ASN1OutputStream.create(outputStream); asn1Out.writeObject(asn1Encodable);
如果是生成特定DER序列结构,也可以用DERSequenceGenerator简化操作:
import org.bouncycastle.asn1.DERSequenceGenerator; // ... DERSequenceGenerator seqGen = new DERSequenceGenerator(outputStream); seqGen.addObject(asn1Object1); seqGen.addObject(asn1Object2); seqGen.close();
2. IOException未在代码块中抛出的修复
升级后部分BouncyCastle API的方法签名新增了IOException抛出声明,导致原有代码的捕获逻辑不符合编译器要求,可按以下两种方式处理:
方式1:在方法签名中声明抛出IOException
// 为方法添加throws IOException声明,将异常交由上层处理 public void processASN1Data(OutputStream out) throws IOException { try { ASN1OutputStream asn1Out = ASN1OutputStream.create(out); asn1Out.writeObject(yourASN1Object); } catch (IOException e) { // 记录错误日志 log.error("ASN1数据写入失败", e); // 重新抛出异常 throw e; } }
方式2:将IOException包装为RuntimeException抛出
如果上层逻辑不允许处理检查异常,可包装为运行时异常抛出:
public void processASN1Data(OutputStream out) { try { ASN1OutputStream asn1Out = ASN1OutputStream.create(out); asn1Out.writeObject(yourASN1Object); } catch (IOException e) { log.error("ASN1数据写入失败", e); throw new RuntimeException("ASN1处理异常", e); } }
3. Wildfly 10部署时ArrayIndexOutOfBoundsException:51201的解决
该异常是Wildfly自带的旧版本BouncyCastle与应用打包的1.69版本类加载冲突导致的,解决步骤如下:
步骤1:排除Wildfly自带的BouncyCastle模块
在应用的WEB-INF/jboss-deployment-structure.xml文件中添加配置,排除服务器自带的org.bouncycastle模块(无此文件则直接创建):
<jboss-deployment-structure> <deployment> <exclusions> <module name="org.bouncycastle" /> </exclusions> </deployment> </jboss-deployment-structure>
步骤2:确保应用依赖打包正确
在Maven/Gradle构建配置中,确保bcprov-jdk15on依赖被完整打包到应用中(避免设置为provided scope):
Maven示例:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.69</version> </dependency>
步骤3:调整Wildfly安全域配置(可选)
如果应用使用了Wildfly安全域,需修改安全域配置,指定使用应用打包的BouncyCastle Provider:
在standalone.xml或domain.xml的安全域配置中添加provider属性:
<security-domain name="your-security-domain"> <authentication> <login-module code="..." flag="required"> <module-option name="password-stacking" value="useFirstPass"/> <module-option name="provider" value="BC"/> </login-module> </authentication> </security-domain>
内容的提问来源于stack exchange,提问作者user3637971
相关产品推荐
相关产品推荐

