如何让Spring Boot 2应用基于Bouncy Castle满足FIPS 140-2合规要求
Spring Boot 2 整合 BouncyCastle FIPS 实现TLS合规配置步骤
一、现有冗余配置清理
- 重复的Provider注册逻辑删除:如果选择修改JDK的
java.security配置方式,就不需要在启动类main方法、Cipher Bean中重复调用Security.addProvider(),注意调整java.security中所有security.provider的序号,保证org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider排在第一位,优先级最高。如果不想修改JDK配置,删掉java.security的新增配置,只在启动类main方法最开头注册Provider即可,代码如下:
public static void main(String[] args) throws Exception { // 放在所有逻辑最前面,设置优先级为1 Security.insertProviderAt(new BouncyCastleFipsProvider(), 1); SpringApplication.run(Application.class, args); }
- 依赖修正:当前引入的
bcpkix-jdk15on是普通非FIPS版本,和bc-fips不兼容,替换为FIPS版本的依赖:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bc-fips</artifactId> <version>1.0.2.1</version> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-fips</artifactId> <version>1.0.7</version> </dependency>
二、新增TLS适配配置
1. application.properties 新增SSL配置
在原有SSL配置基础上增加以下参数:
# 指定SSL provider为BC FIPS server.ssl.provider=BCFIPS # 只启用FIPS合规的TLS版本 server.ssl.enabled-protocols=TLSv1.2,TLSv1.3 # 配置FIPS允许的加密套件,过滤弱加密算法 server.ssl.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
2. 配置内置Tomcat强制使用BC FIPS的SSLContext
新增配置类,自定义Tomcat Web容器的SSL配置:
import org.apache.catalina.connector.Connector; import org.apache.tomcat.util.net.SSLHostConfig; import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatSslConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> sslCustomizer() { return factory -> factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> { if (connector.getSecure()) { SSLHostConfig[] sslHostConfigs = connector.getProtocolHandler().findSslHostConfigs(); for (SSLHostConfig sslHostConfig : sslHostConfigs) { // 强制指定SSL provider为BCFIPS sslHostConfig.setSslProvider("BCFIPS"); } } }); } }
三、现有Cipher Bean用法说明
你当前配置的cbcCipher Bean不需要参与TLS链路的配置,该Bean是给业务代码做对称加解密时直接注入使用的,保证业务侧的加解密逻辑也符合FIPS合规要求,用法示例:
@Service public class EncryptService { @Autowired private Cipher cbcCipher; // 业务加解密逻辑直接使用该Cipher实例即可 }
四、生效验证
启动应用时添加JVM参数-Djavax.net.debug=ssl,观察启动日志:
- SSLContext初始化日志中会显示provider为
BCFIPS - TLS握手日志中使用的加密套件为你配置的FIPS合规套件
- 也可在代码中调用
Security.getProviders()[0].getName(),确认返回值为BCFIPS
内容的提问来源于stack exchange,提问作者thevoyager
相关产品推荐
相关产品推荐

