将Keycloak与符合FIPS的JDK结合使用

时间:2020-03-17 21:43:42

标签: java jboss wildfly keycloak fips

我需要使用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))]

有人可以指出我的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我不知道对此是否有一个规范的答案,但最终我通过将模块注册为文件org.jboss.as.server中根模块$KEYCLOAK_ROOT/modules/system/layers/base/org/jboss/as/server/main/module.xml的显式依赖项来完成这项工作。