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构建:
- 解压已签名的BC FIPS JAR:
unzip bc-fips-1.0.2.4.jar -d bc-fips-unpacked - 删除解压目录中META-INF下的签名相关文件(
.SF、.DSA、.RSA格式):rm bc-fips-unpacked/META-INF/*.SF bc-fips-unpacked/META-INF/*.DSA bc-fips-unpacked/META-INF/*.RSA - 将解压内容重新打包为未签名的JAR:
jar cvf bc-fips-unsigned.jar -C bc-fips-unpacked/ . - 用这个未签名的JAR替换原文件,重新执行最初的jlink命令。此时BC FIPS模块不会触发签名校验,可正常初始化。
方案2:将BC FIPS模块作为扩展添加到基础JRE
绕过jlink对签名模块的限制,先构建基础JRE再手动添加BC FIPS:
- 构建不包含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/ - 将
bc-fips-1.0.2.4.jar复制到基础JRE的扩展目录:cp bc-fips-1.0.2.4.jar /tmp/basejdk/lib/ext/ - 编辑JRE的安全配置文件
/tmp/basejdk/conf/security/java.security,添加BC FIPS提供者(将N替换为合适的序号,比如在默认提供者之后):security.provider.N=org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider - 运行程序时,JRE会加载扩展目录中的签名BC FIPS模块,签名信息完整可通过校验和验证。
方案3:使用jpackage打包应用(适用于完整应用场景)
如果你的目标是打包包含BC FIPS的完整应用而非单独JRE,可使用jpackage替代jlink,它对签名JAR的兼容性更好,能保留签名信息:
- 先编译你的应用代码:
javac ListSecurityProviders.java - 用jpackage打包应用,指定模块路径和依赖:
生成的应用镜像会完整保留BC FIPS模块的签名信息,运行时不会出现校验错误。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
内容的提问来源于stack exchange,提问作者Md Rehman
相关产品推荐
相关产品推荐

