Enterprise Java

Spring Unified SSL Support

With the increasing need for secure communication, SSL/TLS plays a vital role in protecting sensitive data over the network. Spring Framework has introduced unified SSL support, making it easier to configure SSL across different modules like Spring Boot, Spring Security, and WebFlux. Let us delve into understanding Spring Unified SSL Support and its implementation.

1. Understanding Unified SSL Support

The Spring Framework has introduced Spring Unified SSL Support, making it easier to configure and manage SSL/TLS settings across different Spring components. This enhancement addresses common challenges developers face when setting up secure connections, ensuring a more streamlined and consistent approach.

1.1 Key Improvements

  • Centralized SSL Configuration: Developers can now manage SSL settings in a unified way across application.properties or application.yml without requiring complex custom configurations.
  • Better Support for Mutual TLS Authentication: Spring now provides improved support for mutual TLS authentication (mTLS), enabling secure two-way authentication between clients and servers.
  • Enhanced Integration with WebFlux: SSL configurations are now more seamlessly integrated with Spring WebFlux, allowing for reactive applications to leverage secure communication effortlessly.
  • Support for Externalizing SSL Properties: SSL settings such as key store locations, passwords, and trust stores can be externalized, making it easier to manage configurations across different environments (e.g., development, staging, production).

2. SSL Creation And Setting Up In A Spring Boot App

Follow these steps to configure SSL in a Spring Boot application.

2.1 Generate a Self-Signed Certificate

To enable SSL in a Spring Boot application, the first step is to generate a self-signed certificate. A self-signed certificate is useful for local development and testing before obtaining a certificate from a trusted Certificate Authority (CA). Use the following command to generate a self-signed certificate using the Java keytool utility:

1
keytool -genkey -alias mysslkey -keyalg RSA -keystore keystore.p12 -storetype PKCS12 -storepass your_own_password -validity 3650

2.1.1 Command Explanation

  • -genkey: Generates a new key pair.
  • -alias mysslkey: Defines an alias (unique name) for the key.
  • -keyalg RSA: Uses the RSA algorithm for encryption.
  • -keystore keystore.p12: Specifies the keystore file name (.p12 format is recommended).
  • -storetype PKCS12: Uses the PKCS12 format, which is widely supported across platforms.
  • -storepass your_own_password: Sets a password for securing the keystore (replace with your own).
  • -validity 3650: Sets the certificate validity to 10 years (3650 days).

You will be prompted to enter details such as your name, organization, city, state, and country. Once completed, the keystore file (keystore.p12) will be created in the specified directory.

2.1.2 Verifying the Keystore

You can check the contents of the generated keystore using:

1
keytool -list -v -keystore keystore.p12 -storepass your_own_password

This will display the certificate details, confirming that it has been created successfully.

2.2 Configure application.properties

After generating the SSL certificate, the next step is to configure your Spring Boot application to use it. Update the application.properties file to enable SSL and specify the keystore details. Modify the application.properties file as shown below:

01
02
03
04
05
06
07
08
09
10
11
12
# Set the application to use HTTPS
server.port=8443
server.ssl.enabled=true
 
# Specify the SSL keystore file
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your_own_password
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=mysslkey
 
# Enforce HTTPS in Spring Security
server.ssl.client-auth=need

2.2.1 Explanation

  • server.port=8443: Configures the application to listen on port 8443 (default HTTPS port).
  • server.ssl.enabled=true: Enables SSL/TLS support.
  • server.ssl.key-store=classpath:keystore.p12: Specifies the path to the keystore file inside the classpath.
  • server.ssl.key-store-password=your_own_password: Sets the password for accessing the keystore.
  • server.ssl.key-store-type=PKCS12: Defines the keystore type (PKCS12 is recommended for compatibility).
  • server.ssl.key-alias=mysslkey: Specifies the alias used when generating the key pair.
  • server.ssl.client-auth=need: Enforces client authentication (mutual TLS). Set to want for optional client authentication or none to disable it.

2.2.2 Where to Place the Keystore File?

Ensure that the keystore.p12 file is placed inside the src/main/resources directory so that it can be loaded from the classpath.

2.3 Dependencies

Include the following dependencies in the pom.xml file:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

3. Code Example

3.1 Main Class

Create the main Spring Boot application SpringBootSslApplication.java.

01
02
03
04
05
06
07
08
09
10
11
package com.example.ssl;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@SpringBootApplication
public class SpringBootSslApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootSslApplication.class, args);
    }
}

3.2 Controller Class

Add a simple REST controller to test SSL.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
package com.example.ssl.controller;
 
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RequestMapping("/api")
public class SecureController {
     
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, Secure World! This is running on HTTPS.";
    }
}

3.3 Secure with Spring Security

Spring Security provides an additional layer of security on top of SSL. Below is a security configuration to enforce HTTPS.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.requiresChannel()
      .anyRequest()
      .requiresSecure();
  }
}

3.3.1 Code Explanation

The SecurityConfig class is a Spring Security configuration that enforces HTTPS for all incoming requests. It is annotated with @Configuration to mark it as a Spring configuration class and @EnableWebSecurity to enable Spring Security features. By extending WebSecurityConfigurerAdapter, it allows customization of security settings. The configure(HttpSecurity http) method overrides the default security configuration, where http.requiresChannel().anyRequest().requiresSecure() ensures that every request must be served over HTTPS. This means if a user tries to access the application over HTTP, they will be automatically redirected to HTTPS, ensuring encrypted and secure communication. This configuration is essential for protecting sensitive data, preventing unauthorized access, and ensuring compliance with modern security standards in production environments.

3.4 Running the application

Run the application using mvn spring-boot:run. After starting the application, open your browser and visit:

As this is a self-signed certificate, your browser will display a security warning. You can proceed by accepting the certificate, after which you will see the following output.

1
Hello, Secure World! This is running on HTTPS.

4. Conclusion

The introduction of unified SSL support in the Spring Framework has simplified the process of securing applications using SSL/TLS. With minimal configuration, developers can enable HTTPS, enforce secure communication, and integrate Spring Security for additional protection. This approach ensures that sensitive data is transmitted securely, reducing the risk of unauthorized access and man-in-the-middle attacks. By leveraging Spring Boot’s SSL capabilities, organizations can easily build secure web applications that comply with modern security standards.

Whether using self-signed certificates for local development or integrating with enterprise-level certificate authorities, Spring’s flexible SSL configuration makes it easy to adapt to different security requirements. As applications continue to evolve, having a robust SSL/TLS implementation is crucial for maintaining security and trust in digital communications.

Yatin Batra

An experience full-stack engineer well versed with Core Java, Spring/Springboot, MVC, Security, AOP, Frontend (Angular & React), and cloud technologies (such as AWS, GCP, Jenkins, Docker, K8).
Subscribe
Notify of
guest


This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button