我需要使用Keycloak和FIPS兼容的JDK(基于OpenJDK 8)构建Docker映像。
我公司有一个内部FIPS JDK发行版,其工作方式如下:
在-Djava.endorsed.dirs
目录中,安装了安全提供程序,该安全提供程序将所有安全调用调度到BouncyCastle。该安全提供程序具有依赖关系,我通过Maven引入了这些依赖关系:几个BouncyCastle广口瓶,还有杰克逊,斯卡拉,番石榴和厨房水槽等其他东西。
我正在做mvn dependency:copy-dependencies
,将BouncyCastle罐子复制到库文件夹中,并且我正在使用Maven Shade插件来构建UberJar和其他所有东西,减去Keycloak中已经存在的东西。为避免冲突,我在此UberJar中应用了程序包阴影(程序包com.foo
已移至myteam.com.foo
),但上述安全提供程序引用的公共入口点除外。
我有一个Java测试类,可以验证此设置是否在FIPS兼容模式下工作,基本上测试是
MessageDigest.getInstance("SHA-256", "SUN").getProvider().getName()
返回BCFIPS
而不是SUN
,这有效。
现在,我的问题是如何在Keycloak上运行此设置,因为它可以在JBoss / WildFly上运行,并且对类加载具有完全自己的想法。
我在-Djava.endorsed.dirs
中使用JAVA_OPTS
参数启动Keycloak,这将依赖关系留给BouncyCastle和其他库。
我尝试了以下方法
方法1:
将所有内容声明为一个模块。在/opt/jboss/keycloak/modules/system/layers/keycloak
(或我尝试过base
)内部,用所有bc jar声明一个org/bouncycastle
模块,并用UberJar声明一个com/mycompany module
。同时注册两个as global modules(KC当前在WildFly 18上运行,因此全局目录选项尚不可用)
方法2:
将所有jar放在目录中,并将reference that using -Djava.ext.dirs
放在我的JAVA_OPTS
中。
其中每个都导致了相同的错误消息:
由于:java.lang.ClassNotFoundException: 来自[Module的org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider 本地模块加载程序的“ org.jboss.as.server”版本10.0.3.Final @ 52a86356(查找程序:本地模块查找程序@ 5ce81285(根目录: / opt / jboss / keycloak / modules,/ opt / jboss / keycloak / modules / system / layers / keycloak,/ opt / jboss / keycloak / modules / system / layers / base))]
有人可以指出我的解决方案吗?
答案 0 :(得分:0)
我不知道对此是否有一个规范的答案,但最终我通过将模块注册为文件org.jboss.as.server
中根模块$KEYCLOAK_ROOT/modules/system/layers/base/org/jboss/as/server/main/module.xml
的显式依赖项来完成这项工作。