Spring Boot 实战:自定义 Tomcat 实现多 SSL 证书配置全攻略
在 Spring Boot 中配置多个 SSL 证书可以通过自定义 `TomcatServletWebServerFactory` 来实现。以下是具体步骤和示例代码: 1. 准备 SSL 证书 确保已经有多个 SSL 证书文件(通常是 `.jks` 或 `.p12` 格式),并记住每个证书的密码。 2. 添加依赖 如果使用的是 Spring Boot 的 Web 模块,确保 `pom.xml` 中包含以下依赖: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> ``` 3. 配置多个 SSL 证书 创建一个配置类,自定义 `TomcatServletWebServerFactory` 来配置多个 SSL 连接器。 ```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; import java.io.File; import java.io.IOException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; @Configuration public class MultiSslConfig { @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); } }; // 添加第一个 SSL 连接器 tomcat.addAdditionalTomcatConnectors(createSslConnector("keystore1.jks", "password1", 8443)); // 添加第二个 SSL 连接器 tomcat.addAdditionalTomcatConnectors(createSslConnector("keystore2.jks", "password2", 8444)); return tomcat; } private Connector createSslConnector(String keystorePath, String keystorePassword, int port) { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("https"); connector.setSecure(true); connector.setPort(port); org.apache.coyote.http11.Http11NioProtocol protocol = (org.apache.coyote.http11.Http11NioProtocol) connector.getProtocolHandler(); protocol.setSSLEnabled(true); protocol.setKeystoreFile(new File(keystorePath).getAbsolutePath()); protocol.setKeystorePass(keystorePassword); protocol.setKeyAlias("tomcat"); // 根据实际情况修改 protocol.setKeyPass(keystorePassword); protocol.setTruststoreFile(new File(keystorePath).getAbsolutePath()); protocol.setTruststorePass(keystorePassword); return connector; } } ``` 4. 代码解释 - `MultiSslConfig` 类是一个配置类,用于自定义 `TomcatServletWebServerFactory`。 - `servletContainer` 方法创建了一个 `TomcatServletWebServerFactory` 实例,并添加了多个 SSL 连接器。 - `createSslConnector` 方法用于创建一个 SSL 连接器,需要传入证书文件路径、证书密码和端口号。 5. 运行应用程序 启动 Spring Boot 应用程序,应用程序将在指定的端口上监听多个 SSL 连接。 注意事项 - 确保证书文件路径和密码正确。 - 根据实际情况修改 `KeyAlias`。 - 如果使用的是不同的 Web 服务器(如 Jetty),需要相应地调整配置。 ######[AI问答 | 941点数解答 | 2025-09-17 11:49:53]
- Spring框架实战:从配置到实现,搞定员工信息查询功能(GPT | 2135点数解答 | 2024-06-12 08:32:35)318
- IntelliJ IDEA 搭建 Spring Boot 项目:从创建到 JPA 实体类及数据源配置全攻略(讯飞星火 | 920点数解答 | 2024-10-31 15:37:22)267
- 解决 Java 中 HTTP 请求方法名含非法字符异常:示例与注意要点(阿里通义 | 321点数解答 | 2024-12-03 17:34:09)359
- HTML 页面排版:安装 ZeroSSL 证书的详细指南及文件要求(字节豆包 | 33点数解答 | 2024-08-26 10:37:34)306
- Spring Boot 与 Vue 联手:轻松实现微信扫码登录全攻略(字节豆包 | 207点数解答 | 2025-05-13 09:12:19)172
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)352
- Android开发自定义 Handler :七大策略有效规避内存泄漏!(百度文心 | 526点数解答 | 2023-11-09 17:34:21)291
- 超详细:使用Java 8创建连接MySQL数据库的Spring Boot项目全步骤( | 1491点数解答 | 2024-05-13 16:25:58)262
- IDEA搭建 Java 8 连接 MySQL 的 Spring Boot 项目全流程:从创建到测试( | 1985点数解答 | 2024-05-13 16:26:16)305
- 深度解析:Vue + Spring Boot 组合的应用优势与发展前景(字节豆包 | 587点数解答 | 2025-04-29 16:25:49)161
- 揭秘Spring Boot + Vue3前后端分离架构:从开发到安全的全方位技术优势(DeepSeek | 2255点数解答 | 2025-05-07 18:15:21)346
- 深度剖析:Spring Boot + Vue3 前后端分离架构的全方位技术优势(DeepSeek | 1760点数解答 | 2025-05-24 11:04:00)221