在 Spring Boot 中配置微服务以 HTTPS 发布,主要涉及 SSL 证书准备应用配置HTTP 重定向(可选)生产环境注意事项。以下是详细步骤:

在这里插入图片描述

一、准备 SSL 证书

HTTPS 需要通过 SSL 证书验证服务器身份,常见证书类型包括:

  • 自签名证书(开发/测试环境使用,浏览器会提示不安全)
  • CA 颁发的证书(生产环境使用,如 Let’s Encrypt、阿里云 SSL 证书等)
1. 生成自签名证书(开发测试用)

使用 keytool(JDK 自带工具)生成 JKS 格式的密钥库(Keystore):

keytool -genkeypair \
  -alias mydomain \          # 证书别名(可自定义)
  -keyalg RSA \              # 加密算法
  -keysize 2048 \            # 密钥长度
  -storetype JKS \           # 存储类型(Spring Boot 内嵌 Tomcat 支持 JKS/PKCS12)
  -keystore src/main/resources/keystore.jks \  # 密钥库存储路径(建议放在 resources 目录)
  -validity 3650 \           # 有效期(天,这里设为 10 年)
  -dname "CN=localhost, OU=MyOrg, O=MyCompany, L=City, ST=Province, C=Country" \  # 域名等信息(CN 需与访问域名一致)
  -storepass changeit \      # 密钥库密码(建议复杂密码)
  -keypass changeit          # 密钥密码(可与密钥库密码相同)

执行后会生成 keystore.jks 文件,需妥善保管。

在这里插入图片描述

2. 获取 CA 颁发的证书(生产环境)

生产环境需通过 CA 机构(如 Let’s Encrypt)申请证书,通常会得到:

  • 证书文件(.crt.pem
  • 私钥文件(.key
  • 可能需要将证书转换为 JKS 或 PKCS12 格式(Spring Boot 内嵌 Tomcat 推荐 PKCS12):
    openssl pkcs12 -export \
      -in server.crt \          # CA 颁发的证书
      -inkey server.key \       # 私钥
      -out keystore.p12 \       # 输出 PKCS12 格式密钥库
      -name mydomain \          # 别名(与后续配置一致)
      -password pass:changeit   # 密码
    

二、配置 Spring Boot 应用启用 HTTPS

application.propertiesapplication.yml 中配置 SSL 参数,指向生成的密钥库。

1. 基础 HTTPS 配置(application.yml)
server:
  port: 8443                  # HTTPS 端口(生产环境常用 443,需管理员权限)
  ssl:
    enabled: true             # 启用 SSL
    key-store: classpath:keystore.jks  # 密钥库路径(classpath: 表示 resources 目录)
    key-store-type: JKS       # 密钥库类型(若为 PKCS12 则改为 PKCS12)
    key-store-password: changeit  # 密钥库密码
    key-alias: mydomain       # 证书别名(与生成证书时的 alias 一致)
    key-password: changeit    # 密钥密码(若与密钥库密码相同可省略)
    protocol: TLS             # 使用的协议(推荐 TLSv1.2 或更高)
    # 可选:限制允许的加密套件(增强安全性)
    ciphers: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
2. 验证配置

启动应用后,访问 https://localhost:8443/(若为自签名证书,浏览器会提示“不安全”,忽略警告即可)。
在这里插入图片描述

三、(可选)HTTP 自动重定向到 HTTPS

若希望所有 HTTP 请求自动跳转至 HTTPS,需配置 Tomcat 的 HTTP 连接器并重定向到 HTTPS 端口。

1. 添加依赖(可选)

Spring Boot 内嵌 Tomcat 已包含所需依赖,无需额外添加。

2. 配置 HTTP 重定向(Java 配置类)

创建一个配置类,通过 TomcatServletWebServerFactory 添加 HTTP 连接器:

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 HttpsConfig {

    @Bean
    public ServletWebServerFactory servletWebServerFactory() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                // 强制所有请求使用 HTTPS(可选,根据需求)
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL"); // CONFIDENTIAL 表示必须 HTTPS
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*"); // 匹配所有路径
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        // 添加 HTTP 连接器(监听 8080 端口,重定向到 8443)
        Connector httpConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        httpConnector.setPort(8080); // HTTP 端口
        httpConnector.setRedirectPort(8443); // 重定向到 HTTPS 端口
        tomcat.addAdditionalTomcatConnectors(httpConnector);
        return tomcat;
    }
}

配置后,访问 http://localhost:8080/ 会自动跳转至 https://localhost:8443/

四、生产环境注意事项

  1. 证书替换:生产环境必须使用 CA 颁发的证书,替换自签名证书(参考第二步的 PKCS12 转换方法)。
  2. 端口开放:HTTPS 默认端口 443 需要服务器管理员权限开放(可通过 sudo systemctl start tomcat 或云服务器安全组配置)。
  3. 密码安全:避免将 key-store-password 等敏感信息硬编码在配置文件中,建议通过环境变量或配置中心(如 Spring Cloud Config)注入:
    server:
      ssl:
        key-store-password: ${KEY_STORE_PASSWORD}  # 从环境变量获取
    
  4. HSTS 头:启用 HTTP 严格传输安全(HSTS),强制客户端仅使用 HTTPS 访问:
    server:
      http:
        port: 8080
      tomcat:
        protocol-header: X-Forwarded-Proto  # 若使用反向代理(如 Nginx),需配置此参数
        redirect-port: 8443
      ssl:
        enabled: true
      # 启用 HSTS(生产环境推荐)
      hsts:
        enabled: true
        includeSubDomains: true
        max-age: 31536000  # 有效期 1 年(秒)
    
  5. 反向代理(可选):生产环境常用 Nginx/Apache 作为反向代理,由代理层处理 HTTPS 握手,微服务内部使用 HTTP 通信(需确保代理与服务间网络安全)。此时 Spring Boot 应用只需配置 HTTP,Nginx 配置 SSL:
    server {
        listen 443 ssl;
        server_name your-domain.com;
        
        ssl_certificate /path/to/fullchain.pem;  # CA 颁发的证书链
        ssl_certificate_key /path/to/privkey.pem;  # 私钥
        
        location / {
            proxy_pass http://localhost:8080;  # 转发到 Spring Boot 应用的 HTTP 端口
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    

五、常见问题排查

  • 证书链不完整:CA 颁发的证书需包含中间证书,否则浏览器会提示“无法验证证书颁发机构”。可通过 openssl s_client -connect your-domain:443 检查证书链。
  • 端口被占用:检查 server.port 或 HTTP 重定向端口是否被其他进程占用(使用 lsof -i:端口号 查看)。
  • 自签名证书警告:开发环境可通过浏览器手动信任证书(如 Chrome 中点击“高级”→“继续访问”)。
  • 服务间调用 SSL 问题:若微服务间使用 Feign/RestTemplate 调用 HTTPS 接口,需配置信任证书(或忽略自签名验证,仅推荐开发环境):
    // 忽略 SSL 验证(仅开发用)
    @Bean
    public RestTemplate restTemplate() throws Exception {
        TrustStrategy acceptingTrustStrategy = (x509Certificates, authType) -> true;
        SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
        SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(csf).build();
        HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
        return new RestTemplate(requestFactory);
    }
    

通过以上步骤,Spring Boot 微服务即可启用 HTTPS。生产环境需重点关注证书合法性、端口安全和配置管理,确保通信安全。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐