Spring Boot如何发布 https协议的API接口?
·
在 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.properties 或 application.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/。
四、生产环境注意事项
- 证书替换:生产环境必须使用 CA 颁发的证书,替换自签名证书(参考第二步的 PKCS12 转换方法)。
- 端口开放:HTTPS 默认端口 443 需要服务器管理员权限开放(可通过
sudo systemctl start tomcat或云服务器安全组配置)。 - 密码安全:避免将
key-store-password等敏感信息硬编码在配置文件中,建议通过环境变量或配置中心(如 Spring Cloud Config)注入:server: ssl: key-store-password: ${KEY_STORE_PASSWORD} # 从环境变量获取 - 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 年(秒) - 反向代理(可选):生产环境常用 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。生产环境需重点关注证书合法性、端口安全和配置管理,确保通信安全。
更多推荐
所有评论(0)