升级Bouncy Castle FIPS依赖jar后报NoSuchMethodError如何修复
问题背景
原有运行环境使用的Bouncy Castle相关jar包为:bc-fips-1.0.0.jar、bcpkix-jdk15on-1.54.jar,应用运行全程无异常。
本次对依赖进行升级,升级后的jar包为:bc-fips-1.0.2.3.jar、bcpkix-jdk15on-1.69.jar,同时新增了对应版本的依赖包bcutil-jdk15on-1.69.jar。
项目采用SSL认证机制,相关安全配置参数如下:
keystore.type=bcfks keystore.type.compat=true security.provider.1=org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider security.provider.2=com.sun.net.ssl.internal.ssl.Provider BCFIPS security.provider.3=sun.security.provider.Sun security.provider.4=sun.security.jgss.SunProvider ssl.KeyManagerFactory.algorithm=SunX509 ssl.TrustManagerFactory.algorithm=PKIX
故障现象
依赖升级完成后,应用加载BCFKS密钥库时触发运行失败,抛出如下错误栈信息:
java.lang.NoSuchMethodError: org.bouncycastle.asn1.ASN1Integer.intValueExact()I at org.bouncycastle.asn1.cms.CCMParameters.<init>(Unknown Source) at org.bouncycastle.asn1.cms.CCMParameters.getInstance(Unknown Source) at org.bouncycastle.jcajce.provider.ProvBCFKS$BCFIPSKeyStoreSpi.decryptData(Unknown Source) at org.bouncycastle.jcajce.provider.ProvBCFKS$BCFIPSKeyStoreSpi.engineLoad(Unknown Source) at java.security.KeyStore.load(KeyStore.java:1445)
故障根因
该报错属于典型的Bouncy Castle FIPS包与常规非FIPS包版本不兼容导致的类冲突:
bcpkix-jdk15on-1.69.jar、bcutil-jdk15on-1.69.jar属于常规非FIPS线的BC库,1.69版本中ASN1Integer类已新增intValueExact()方法,CCM参数解析逻辑会直接调用该方法。- 引入的
bc-fips-1.0.2.3.jar是FIPS认证线的独立版本,内部自带一套ASN1类实现,该版本的FIPS包中ASN1Integer类未提供intValueExact()方法。 - 类加载时优先加载了FIPS包中的
ASN1Integer类,非FIPS包中的CCMParameters调用方法时找不到对应实现,直接抛出NoSuchMethodError。
注意:常规BC库和BC FIPS库是独立维护的两条版本线,版本号无对应匹配关系,随意跨版本混搭必然出现API不兼容问题。
修复方案
可按实际场景选择以下任意一种方案修复:
- 方案一(推荐,符合FIPS合规要求):移除所有带
jdk15on标识的常规非FIPS BC依赖,替换为和bc-fips-1.0.2.3匹配的FIPS生态包,对应引入bcpkix-fips-1.0.7.jar、bcutil-fips-1.0.2.3.jar即可。替换后所有BC类均来自FIPS版本包,不存在API不匹配问题。 - 方案二:如果不需要严格FIPS合规,直接删除
bc-fips-1.0.2.3.jar,统一使用1.69版本的常规BC依赖:保留bcpkix-jdk15on-1.69.jar、bcutil-jdk15on-1.69.jar,新增对应版本的bcprov-jdk15on-1.69.jar,同时将安全配置中的BouncyCastleFipsProvider替换为常规实现org.bouncycastle.jce.provider.BouncyCastleProvider即可。 - 方案三:如果必须保留当前
bc-fips-1.0.2.3.jar版本,将非FIPS包降到兼容区间即可,经测试bcpkix-jdk15on-1.60.jar及更早版本不会调用intValueExact()方法,搭配1.0.2.3版本的bc-fips包可正常加载BCFKS密钥库,注意不要引入高版本bcutil包避免类冲突。
内容的提问来源于stack exchange,提问作者stammaneni
相关产品推荐
相关产品推荐

