Skip to content

Commit 53ee788

Browse files
committed
feat(fips): Add Bouncy Castle FIPS dependencies and initialize FIPS mode in SchedulerApplication
1 parent dd69e1e commit 53ee788

File tree

3 files changed

+109
-5
lines changed

3 files changed

+109
-5
lines changed

src/autoscaler/scheduler/pom.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,17 @@
134134
<artifactId>assertj-core</artifactId>
135135
<scope>test</scope>
136136
</dependency>
137+
<!-- Bouncy Castle FIPS for FIPS 140-2 compliance -->
138+
<dependency>
139+
<groupId>org.bouncycastle</groupId>
140+
<artifactId>bc-fips</artifactId>
141+
<version>2.1.1</version>
142+
</dependency>
143+
<dependency>
144+
<groupId>org.bouncycastle</groupId>
145+
<artifactId>bctls-fips</artifactId>
146+
<version>2.1.20</version>
147+
</dependency>
137148
</dependencies>
138149
<build>
139150
<plugins>

src/autoscaler/scheduler/src/main/java/org/cloudfoundry/autoscaler/scheduler/SchedulerApplication.java

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.cloudfoundry.autoscaler.scheduler;
22

3+
import org.bouncycastle.crypto.fips.FipsStatus;
4+
import org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider;
35
import org.cloudfoundry.autoscaler.scheduler.conf.MetricsConfig;
46
import org.slf4j.Logger;
57
import org.slf4j.LoggerFactory;
@@ -22,6 +24,8 @@
2224
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
2325
import org.springframework.context.event.EventListener;
2426

27+
import java.security.Security;
28+
2529
@ConfigurationPropertiesScan(basePackageClasses = MetricsConfig.class)
2630
@SpringBootApplication(
2731
exclude = {
@@ -41,14 +45,79 @@
4145
})
4246
public class SchedulerApplication {
4347

44-
private Logger logger = LoggerFactory.getLogger(this.getClass());
48+
private static final Logger logger = LoggerFactory.getLogger(SchedulerApplication.class);
49+
private static final int FIPS_ERROR_EXIT_CODE = 140;
4550

4651
@EventListener
4752
public void onApplicationReady(ApplicationReadyEvent event) {
4853
logger.info("Scheduler is ready to start");
4954
}
5055

56+
/**
57+
* Initializes and validates FIPS mode for the application.
58+
* This is equivalent to checking crypto/fips140.Enabled in Go.
59+
* Exits with error code 140 if FIPS mode is not enabled or cannot be initialized.
60+
*/
61+
private static void initializeAndValidateFipsMode() {
62+
try {
63+
logger.info("Initializing FIPS 140-2 compliant cryptographic provider...");
64+
65+
// Register Bouncy Castle FIPS provider as the primary security provider
66+
Security.insertProviderAt(new BouncyCastleFipsProvider(), 1);
67+
68+
// Check if Bouncy Castle FIPS is ready and in approved mode (equivalent to crypto/fips140.Enabled)
69+
if (!FipsStatus.isReady()) {
70+
logger.error("FIPS mode is not ready. Application requires FIPS 140-3 compliance.");
71+
System.exit(FIPS_ERROR_EXIT_CODE);
72+
}
73+
74+
// Verify that BC-FIPS provider is now installed and available
75+
if (Security.getProvider("BCFIPS") == null) {
76+
logger.error("Bouncy Castle FIPS provider (BCFIPS) failed to register.");
77+
System.exit(FIPS_ERROR_EXIT_CODE);
78+
}
79+
80+
// Configure FIPS-compatible system properties for SSL/TLS
81+
configureFipsCompatibleSystemProperties();
82+
83+
logger.info("FIPS mode initialization successful - running in FIPS 140-3 mode");
84+
logger.info("Active security provider: {}", Security.getProvider("BCFIPS").getName());
85+
logger.info("FIPS Status - Ready: {}",
86+
FipsStatus.isReady());
87+
88+
} catch (Exception e) {
89+
logger.error("Failed to initialize FIPS mode: {}", e.getMessage(), e);
90+
System.exit(FIPS_ERROR_EXIT_CODE);
91+
}
92+
}
93+
94+
/**
95+
* Configures system properties for FIPS-compatible SSL/TLS operations.
96+
* This prevents issues with XDH key exchange algorithms that are not supported by BC-FIPS.
97+
*/
98+
private static void configureFipsCompatibleSystemProperties() {
99+
// Disable XDH algorithms (X25519, X448) that cause issues with BC-FIPS
100+
System.setProperty("jdk.tls.namedGroups", "secp256r1,secp384r1,secp521r1");
101+
System.setProperty("jdk.tls.disabledAlgorithms",
102+
"SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, " +
103+
"EC keySize < 224, 3DES_EDE_CBC, anon, NULL, " +
104+
"X25519, X448, XDH");
105+
106+
// Ensure FIPS-compatible cipher suites are preferred
107+
System.setProperty("jdk.tls.client.cipherSuites",
108+
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384," +
109+
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256," +
110+
"TLS_RSA_WITH_AES_256_GCM_SHA384," +
111+
"TLS_RSA_WITH_AES_128_GCM_SHA256");
112+
113+
logger.info("Configured FIPS-compatible SSL/TLS system properties");
114+
}
115+
51116
public static void main(String[] args) {
117+
// Initialize and validate FIPS mode before starting the application (equivalent to crypto/fips140.Enabled check)
118+
initializeAndValidateFipsMode();
119+
120+
logger.info("Starting Scheduler application with FIPS 140-2 compliance enforced");
52121
SpringApplication.run(SchedulerApplication.class, args);
53122
}
54123
}

src/autoscaler/scheduler/src/main/java/org/cloudfoundry/autoscaler/scheduler/conf/DataSourceConfig.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package org.cloudfoundry.autoscaler.scheduler.conf;
22

33
import com.zaxxer.hikari.HikariDataSource;
4-
import java.util.Properties;
5-
import javax.sql.DataSource;
64
import org.cloudfoundry.autoscaler.scheduler.beanPostProcessor.DatasourceBeanPostProcessor;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
77
import org.springframework.beans.factory.annotation.Qualifier;
88
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
99
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -15,16 +15,38 @@
1515
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
1616
import org.springframework.transaction.annotation.EnableTransactionManagement;
1717

18+
import javax.sql.DataSource;
19+
import java.util.Properties;
20+
1821
@Configuration
1922
@EnableTransactionManagement
2023
public class DataSourceConfig {
2124

25+
private static final Logger logger = LoggerFactory.getLogger(DataSourceConfig.class);
26+
27+
/**
28+
* Configures FIPS-compatible TLS properties for database connections.
29+
* Disables XDH key exchange algorithms that are not supported by BC-FIPS.
30+
*/
31+
private void configureFipsCompatibleTLSProperties(HikariDataSource dataSource) {
32+
// Set system properties to configure TLS for FIPS compatibility
33+
System.setProperty("jdk.tls.namedGroups", "secp256r1,secp384r1,secp521r1");
34+
System.setProperty("jdk.tls.disabledAlgorithms",
35+
"SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, " +
36+
"EC keySize < 224, 3DES_EDE_CBC, anon, NULL, " +
37+
"X25519, X448, XDH"); // Disable XDH algorithms
38+
39+
logger.info("Configured FIPS-compatible SSL properties for PostgreSQL datasource");
40+
}
41+
2242
@Bean
2343
@Primary
2444
@Qualifier("primary")
2545
@ConfigurationProperties(prefix = "spring.datasource")
2646
public DataSource dataSource(@Qualifier("primary") DataSourceProperties properties) {
27-
return properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
47+
HikariDataSource dataSource = properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
48+
configureFipsCompatibleTLSProperties(dataSource);
49+
return dataSource;
2850
}
2951

3052
@Bean
@@ -45,7 +67,9 @@ public DataSourceProperties policyDbDataSourceProperties() {
4567
@Qualifier("policy")
4668
@ConfigurationProperties("spring.policy-db-datasource")
4769
public DataSource policyDbDataSource(@Qualifier("policy") DataSourceProperties properties) {
48-
return properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
70+
HikariDataSource dataSource = properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
71+
configureFipsCompatibleTLSProperties(dataSource);
72+
return dataSource;
4973
}
5074

5175
@Bean

0 commit comments

Comments
 (0)