Spring Boot 应用的接口访问从 HTTP 改为 HTTPS

LINUX

1. 生成 SSL 证书

使用工具(如 `keytool` 或 `openssl`)生成 SSL 证书。以下以 `keytool` 为例:

bash 复制代码
keytool -genkeypair -alias mydomain -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore keystore.p12 -validity 3650
  • 输入密码并填写证书信息。

  • 生成的 `keystore.p12` 文件需放在项目的 `src/main/resources` 目录下。

2. 配置 Spring Boot 的 HTTPS

在 `application.properties` 或 `application.yml` 中添加 SSL 配置:

XML 复制代码
# 启用 HTTPS
server.port=8443
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-password=your_password
server.ssl.key-alias=mydomain

3. HTTP 自动重定向到 HTTPS(可选)

强制所有 HTTP 请求跳转到 HTTPS:

java 复制代码
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 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("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080); // HTTP 端口
        connector.setSecure(false);
        connector.setRedirectPort(8443); // 重定向到 HTTPS 端口
        return connector;
    }
}

4. 测试 HTTPS 访问

启动应用后,访问:

https://localhost:8443/your-api

  • 浏览器可能会提示证书不安全(自签名证书),选择继续访问即可。

5. 生产环境注意事项

  • 证书来源:生产环境建议使用受信任的证书颁发机构(如 Let's Encrypt)签发的证书。

  • 密钥管理:避免将密码硬编码在配置文件中,可使用环境变量或配置中心。

  • 防火墙配置:确保服务器的 443 端口(或自定义 HTTPS 端口)已开放。

常见问题排查

  • 证书路径错误:检查 `server.ssl.key-store` 路径是否正确。

  • 密码错误:确认 `server.ssl.key-store-password` 与生成证书时设置的密码一致。

  • 端口冲突:确保 HTTP/HTTPS 端口未被占用。

完成以上步骤后,Spring Boot 接口即可通过 HTTPS 访问。

windows

在 Windows 服务器上生成 SSL 证书,可以通过以下两种常见方法实现:

方法 1:使用 Java 自带的 `keytool`(推荐)

`keytool` 是 JDK 自带的密钥管理工具,无需额外安装,适合生成自签名证书。

步骤:

  1. 打开命令提示符(CMD)

按 `Win + R`,输入 `cmd` 后回车。

  1. 定位到 JDK 的 `bin` 目录

如果已配置 JDK 环境变量,可直接使用 `keytool`。

否则需要进入 JDK 安装目录,例如:

cd C:\Program Files\Java\jdk1.8.0_361\bin

  1. 生成 PKCS12 格式的密钥库

运行以下命令生成证书(替换 `-keystore` 路径和密码):

java 复制代码
   keytool -genkeypair -alias mydomain -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore E:\path\to\keystore.p12 -validity 3650
  • 根据提示输入密码、姓名(域名)、组织等信息。

  • `-keystore`:生成的证书文件路径(建议放在项目资源目录,如 `src/main/resources`)。

  1. 验证生成结果

检查文件 `keystore.p12` 是否生成成功。

方法 2:使用 OpenSSL(适合生成通用证书)

如果需要生成 PFX 证书(兼容 IIS 或其他服务),可以使用 OpenSSL。

步骤:

  1. 安装 OpenSSL
  • 下载 Windows 版 OpenSSL:

OpenSSL 官方二进制包\](https://slproweb.com/products/Win32OpenSSL.html) 或使用 Chocolatey 安装: choco install openssl 2. 生成私钥和证书 打开命令提示符,运行以下命令: ```java openssl req -x509 -newkey rsa:2048 -nodes ^ -keyout private.key ^ -out certificate.crt ^ -days 3650 ``` - 根据提示填写证书信息(国家、组织、域名等)。 3. 生成 PFX 文件(可选) 将私钥和证书合并为 PFX 格式(Spring Boot 可直接使用): ```java openssl pkcs12 -export ^ -in certificate.crt ^ -inkey private.key ^ -out keystore.pfx ``` - 输入导出密码(需与 Spring Boot 配置中的 \`server.ssl.key-store-password\` 一致)。 #### Spring Boot 配置 将生成的证书(\`keystore.p12\` 或 \`keystore.pfx\`)放入项目的 \`src/main/resources\` 目录,并在 \`application.properties\` 中配置: ```XML server.port=8443 server.ssl.key-store-type=PKCS12 server.ssl.key-store=classpath:keystore.p12 # 或 keystore.pfx server.ssl.key-store-password=your_password server.ssl.key-alias=mydomain # 使用 keytool 时需指定别名 ``` ### 常见问题解决 1. keytool\` 命令找不到 - 检查 JDK 是否安装,并确保 \`keytool\` 所在目录已添加到系统环境变量 \`PATH\`。 2. 证书密码错误 - 确保 \`server.ssl.key-store-password\` 与生成证书时设置的密码一致。 3. 端口冲突 - 检查 \`server.port\` 是否被其他进程占用(如 443 或 8443)。 4. 浏览器提示证书不安全 - 自签名证书会触发警告,生产环境建议替换为受信任的 CA 证书(如 Let's Encrypt)。 ### 附:转换 PFX 到 JKS 格式(可选) 如果需兼容旧版 Java 应用,可将 PFX 转换为 JKS: ```XML keytool -importkeystore ^ -srckeystore keystore.pfx ^ -srcstoretype PKCS12 ^ -destkeystore keystore.jks ^ -deststoretype JKS ``` 通过以上步骤,即可在 Windows 服务器上生成 SSL 证书并配置 Spring Boot 的 HTTPS 访问。

相关推荐
用户8307196840825 小时前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解6 小时前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解6 小时前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记9 小时前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者1 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840821 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解1 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
小时前端1 天前
HTTPS 页面加载 HTTP 脚本被拦?同源代理来救场
前端·https
初次攀爬者2 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺2 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端