启用FIPS的容器中OpenJDK 1.8.0运行失败求助
问题:OpenJDK 1.8容器化应用在FIPS启用的Kubernetes节点启动失败(JCEKS未找到)
容器化Java应用基于OpenJDK 1.8.0,在启用FIPS的Kubernetes节点部署时启动失败,报错如下:
org.springframework.beans.factory.BeanCreationException: Error occured reading security configuration; nested exception is java.io.IOException: java.security.KeyStoreException: JCEKS not found java.security.NoSuchAlgorithmException: JCEKS KeyStore not available应用自带cacerts文件,尝试将其重新创建为JCEKS密钥库后问题仍存在;已尝试设置JVM参数
-Dcom.redhat.fips=false(包括通过JDK_JAVA_OPTIONS环境变量),但报错依旧。根据RedHat相关说明,该场景下建议使用NSS密钥库数据库而非文件密钥库。
解决方案
1. 切换使用NSS密钥库(符合FIPS合规要求)
FIPS模式下OpenJDK 1.8默认禁用JCEKS,改用NSS是官方推荐方案:
- 安装NSS工具:如果使用RedHat系基础镜像(如ubi8/openjdk-8),在Dockerfile中添加:
RUN yum install -y nss-tools && yum clean all - 配置JVM参数:通过环境变量或启动参数指定NSS相关配置:
注:默认NSS数据库路径为JDK_JAVA_OPTIONS="-Djavax.net.ssl.trustStoreType=NSS \ -Djavax.net.ssl.trustStore=/etc/pki/nssdb \ -Djavax.net.ssl.trustStorePassword='' \ -Dorg.apache.tomcat.util.net.SSLContextFactory.algorithm=SunX509"/etc/pki/nssdb,若使用自定义路径,需提前创建并初始化数据库。
2. 临时启用JCEKS(仅应急测试,不合规)
如果必须使用JCEKS,可修改JDK安全配置恢复支持,但此操作会违反FIPS合规要求,仅建议临时测试:
- 在Dockerfile中修改
java.security配置文件:
该操作将SunJCE提供者加入安全列表,恢复JCEKS算法支持。RUN sed -i 's/security.provider.1=sun.security.provider.Sun/security.provider.1=sun.security.provider.Sun\nsecurity.provider.2=com.sun.crypto.provider.SunJCE/' $JAVA_HOME/jre/lib/security/java.security
3. 换用FIPS合规的基础镜像
直接使用RedHat官方提供的FIPS认证OpenJDK镜像,比如registry.access.redhat.com/ubi8/openjdk-8-fips,这类镜像已预配置好FIPS模式下的密钥库支持,无需手动修改配置。
4. 检查代码/配置中的硬编码密钥库类型
确认应用代码或配置文件中是否硬指定了JCEKS作为密钥库类型,若有需修改为PKCS12或NSS,例如Spring Security配置:
// 原硬编码JCEKS的写法 @Bean public KeyStore keyStore() throws Exception { KeyStore keyStore = KeyStore.getInstance("JCEKS"); // ...其他逻辑 } // 修改为PKCS12(兼容FIPS) @Bean public KeyStore keyStore() throws Exception { KeyStore keyStore = KeyStore.getInstance("PKCS12"); // ...其他逻辑 }
内容的提问来源于stack exchange,提问作者IT_User
相关产品推荐
相关产品推荐

