Spring Boot 是一个简化 Spring 应用开发的框架,在实际开发中,为了保证数据传输的安全性,常常需要将应用配置为使用 HTTPS 协议。HTTPS 是在 HTTP 基础上加入了 SSL/TLS 协议,通过对数据进行加密,防止数据在传输过程中被窃取或篡改。下面就详细介绍 Spring Boot 配置 HTTPS 的具体步骤。

步骤一:生成 SSL 证书

可以使用 Java 自带的 keytool 工具来生成自签名的 SSL 证书。自签名证书在开发和测试环境中使用比较方便,但在生产环境中,建议使用由受信任的证书颁发机构(CA)颁发的证书。打开命令行工具,执行以下命令来生成证书:

keytool -genkeypair -alias mycert -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650

上述命令中,-alias 指定证书的别名,-keyalg 指定密钥算法,-keysize 指定密钥长度,-storetype 指定密钥库的类型,-keystore 指定密钥库的文件名,-validity 指定证书的有效期。执行命令后,会提示输入密钥库密码、姓名、组织单位等信息,按照提示输入即可。生成的 keystore.p12 文件就是我们需要的 SSL 证书。

步骤二:将证书文件复制到 Spring Boot 项目中

将生成的 keystore.p12 文件复制到 Spring Boot 项目的 src/main/resources 目录下。这个目录是 Spring Boot 项目的资源目录,应用启动时会自动加载该目录下的文件。

步骤三:配置 Spring Boot 应用使用 HTTPS

在 Spring Boot 项目的 application.properties 或 application.yml 文件中添加以下配置:

如果使用 application.properties 文件,添加以下内容:

server.port=8443
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your_password
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=mycert

如果使用 application.yml 文件,添加以下内容:

server:
  port: 8443
  ssl:
    key-store: classpath:keystore.p12
    key-store-password: your_password
    key-store-type: PKCS12
    key-alias: mycert

上述配置中,server.port 指定应用使用的端口,这里使用 8443 是 HTTPS 的默认端口。server.ssl.key-store 指定证书文件的路径,使用 classpath 前缀表示从类路径下加载文件。server.ssl.key-store-password 指定密钥库的密码,需要替换为你生成证书时设置的密码。server.ssl.key-store-type 指定密钥库的类型,与生成证书时指定的类型一致。server.ssl.key-alias 指定证书的别名,与生成证书时指定的别名一致。

步骤四:启动 Spring Boot 应用

启动 Spring Boot 应用,访问 https://localhost:8443,如果是自签名证书,浏览器会提示证书不受信任,这是正常现象。在开发和测试环境中,可以忽略该提示,继续访问应用。如果是生产环境,使用受信任的证书颁发机构颁发的证书,浏览器不会提示证书不受信任。

步骤五:配置 HTTP 重定向到 HTTPS

为了保证用户访问应用时始终使用 HTTPS 协议,可以配置 HTTP 请求重定向到 HTTPS。在 Spring Boot 项目中,可以通过配置 Tomcat 或其他嵌入式服务器来实现。以下是一个示例代码:

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TomcatConfig {

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(redirectConnector());
        return tomcat;
    }

    private Connector redirectConnector() {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }
}

上述代码中,通过配置 TomcatServletWebServerFactory,添加一个额外的 Tomcat 连接器,将 HTTP 请求重定向到 HTTPS。其中,redirectConnector 方法创建一个 HTTP 连接器,设置端口为 8080,重定向端口为 8443。postProcessContext 方法配置安全约束,确保所有请求都使用 HTTPS 协议。

步骤六:验证配置是否生效

启动 Spring Boot 应用后,访问 http://localhost:8080,浏览器会自动重定向到 https://localhost:8443,说明 HTTP 重定向到 HTTPS 的配置生效。

注意事项

在生产环境中,建议使用由受信任的证书颁发机构(CA)颁发的证书,以避免浏览器提示证书不受信任的问题。同时,要定期更新证书,确保证书的有效性。另外,在配置 HTTPS 时,要注意密钥库的密码安全,避免密码泄露导致证书被非法使用。

通过以上步骤,就可以将 Spring Boot 应用配置为使用 HTTPS 协议,保证数据传输的安全性。在实际开发中,可以根据具体需求对配置进行调整和优化。