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

Java 11加载BouncyCastleFipsProvider遇模块校验和失败错误求助

问题描述

在Java 11中尝试构建包含BouncyCastle FIPS模块的自定义JRE时,执行以下jlink命令:

./jlink --no-header-files --no-man-pages --compress=2 --strip-debug --module-path /root/bcjars/ --add-modules java.se,jdk.unsupported,org.bouncycastle.fips.core --output /tmp/bcjdk/ --ignore-signing-information

收到警告:

WARNING: signed modular JAR /root/bcjars/bc-fips-1.0.2.4.jar is currently not supported

自定义JRE创建完成后,通过--list-modules可以看到org.bouncycastle.fips.core模块存在,但运行ListSecurityProviders程序时出现错误:

java.util.ServiceConfigurationError: java.security.Provider: Provider org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider could not be instantiated
    ...
Caused by: org.bouncycastle.crypto.fips.FipsOperationError: Module checksum failed: unable to calculate
    ...

问题根源是jlink处理签名模块化JAR时会破坏签名信息,导致BC FIPS模块初始化时的校验和验证失败。

解决方案

方案1:使用未签名的BC FIPS模块构建JRE

手动移除BC FIPS JAR的签名信息,重新打包后再用jlink构建:

  1. 解压已签名的BC FIPS JAR:
    unzip bc-fips-1.0.2.4.jar -d bc-fips-unpacked
    
  2. 删除解压目录中META-INF下的签名相关文件(.SF、.DSA、.RSA格式):
    rm bc-fips-unpacked/META-INF/*.SF bc-fips-unpacked/META-INF/*.DSA bc-fips-unpacked/META-INF/*.RSA
    
  3. 将解压内容重新打包为未签名的JAR:
    jar cvf bc-fips-unsigned.jar -C bc-fips-unpacked/ .
    
  4. 用这个未签名的JAR替换原文件,重新执行最初的jlink命令。此时BC FIPS模块不会触发签名校验,可正常初始化。

方案2:将BC FIPS模块作为扩展添加到基础JRE

绕过jlink对签名模块的限制,先构建基础JRE再手动添加BC FIPS:

  1. 构建不包含BC FIPS模块的基础自定义JRE:
    ./jlink --no-header-files --no-man-pages --compress=2 --strip-debug --module-path $JAVA_HOME/jmods --add-modules java.se,jdk.unsupported --output /tmp/basejdk/
    
  2. 将bc-fips-1.0.2.4.jar复制到基础JRE的扩展目录:
    cp bc-fips-1.0.2.4.jar /tmp/basejdk/lib/ext/
    
  3. 编辑JRE的安全配置文件/tmp/basejdk/conf/security/java.security,添加BC FIPS提供者(将N替换为合适的序号,比如在默认提供者之后):
    security.provider.N=org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider
    
  4. 运行程序时,JRE会加载扩展目录中的签名BC FIPS模块,签名信息完整可通过校验和验证。

方案3:使用jpackage打包应用(适用于完整应用场景)

如果你的目标是打包包含BC FIPS的完整应用而非单独JRE,可使用jpackage替代jlink,它对签名JAR的兼容性更好,能保留签名信息:

  1. 先编译你的应用代码:
    javac ListSecurityProviders.java
    
  2. 用jpackage打包应用,指定模块路径和依赖:
    jpackage --name BCProviderApp --module-path /root/bcjars/:$JAVA_HOME/jmods --add-modules java.se,jdk.unsupported,org.bouncycastle.fips.core --main-class ListSecurityProviders --type app-image
    
    生成的应用镜像会完整保留BC FIPS模块的签名信息,运行时不会出现校验错误。

内容的提问来源于stack exchange,提问作者Md Rehman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:24:53