You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:31:04