在springboot中配置https安装证书 Unable to Start embedded TomCat

本文详细介绍了如何配置HTTPS并解决常见的配置错误。包括了证书的获取与放置位置、使用Spring Boot进行SSL设置的方法,以及如何将HTTP请求重定向到HTTPS。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先要获得http证书,可以向证书机构申请也可以自己制作根证书。在我当初配置https时一直报Unable to Start embedded TomCat的错误,后来仔细检查发现因为证书没和jar包放在一个根目录。然后添加如下代码设置证书配置即可


代码如下:

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.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.Ssl;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfig {
	@Bean
	public EmbeddedServletContainerCustomizer containerCustomizer() {
	    return new EmbeddedServletContainerCustomizer() {
	        @Override
	        public void customize(ConfigurableEmbeddedServletContainer container) {
	            Ssl ssl = new Ssl();
	            //Server.jks中包含服务器私钥和证书
	            ssl.setKeyStore("证书名");
	            ssl.setKeyStorePassword("密码");
	            container.setSsl(ssl);
	            container.setPort(443);
	        }
	    };
	}
	//将http重定向至https
	@Bean
	public EmbeddedServletContainerFactory servletContainerFactory() {
	    TomcatEmbeddedServletContainerFactory factory =
	        new TomcatEmbeddedServletContainerFactory() {
	            @Override
	            protected void postProcessContext(Context context) {
	                //SecurityConstraint必须存在,可以通过其为不同的URL设置不同的重定向策略。
	                SecurityConstraint securityConstraint = new SecurityConstraint();
	                securityConstraint.setUserConstraint("CONFIDENTIAL");
	                SecurityCollection collection = new SecurityCollection();
	                collection.addPattern("/*");
	                securityConstraint.addCollection(collection);
	                context.addConstraint(securityConstraint);
	            }
	        };
	    factory.addAdditionalTomcatConnectors(createHttpConnector());
	    return factory;
	}

	private Connector createHttpConnector() {
	    Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
	    connector.setScheme("http");
	    connector.setSecure(false);
	    connector.setPort(80);
	    connector.setRedirectPort(443);
	    return connector;
	}
}


<think>我们正在处理一个Spring Boot启动时出现的错误:`WebServerException: Unable to start embedded Tomcat`。根据提供的引用信息,我们可以总结出以下几个可能的原因和解决方案: 1. **端口被占用**:TCP端口范围是0~65535,如果配置的端口被其他进程占用,会导致Tomcat启动失败[^3]。 2. **缺少JAXB依赖**:从JDK9开始,JAXB不再默认包含,而Eureka Server等组件可能需要它[^4]。 3. **其他配置问题**:比如依赖冲突、配置错误等。 下面我们将逐步分析并给出解决方案。 ### 步骤1: 检查端口占用 - 如果报错信息中包含端口冲突(如`Port already in use`),则可能是端口被占用。 - 解决方案: 1. 更改应用程序端口:在`application.properties`中设置`server.port`为其他可用端口,例如: ``` server.port=8081 ``` 2. 或者,找出占用端口的进程并终止它(以8080端口为例): - 在Windows上: ```bash netstat -ano | findstr :8080 taskkill /PID <进程ID> /F ``` - 在Linux/Mac上: ```bash lsof -i :8080 kill -9 <进程ID> ``` ### 步骤2: 添加JAXB依赖(适用于使用Eureka或需要JAXB的场景) - 在JDK9及以上版本,如果项目使用了JAXB(如Eureka Server),需要手动添加依赖[^4]。 - 在`pom.xml`中添加以下依赖: ```xml <!-- Java9以及之后版本需要引入 start --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> <!-- end --> ``` ### 步骤3: 检查依赖冲突 - 使用Maven的依赖树分析工具检查冲突: ```bash mvn dependency:tree ``` - 查看是否有多个不同版本的Tomcat相关依赖(如`spring-boot-starter-web`和`spring-boot-starter-tomcat`)或其他库的冲突。 - 解决方案:排除冲突的依赖,例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> ``` 然后添加你需要的容器依赖(如Jetty)。 ### 步骤4: 检查其他配置 - 确保没有错误的配置,例如在`application.properties`中检查所有配置项是否正确。 - 检查项目中是否有自定义的`TomcatServletWebServerFactory` Bean,如果有,检查其实现是否正确。 ### 步骤5: 查看完整错误日志 - 错误日志中可能有更详细的信息,请仔细阅读日志以定位问题。 ### 总结 以上步骤应能解决大多数`Unable to start embedded Tomcat`的问题。如果问题仍然存在,请根据具体的错误日志进一步排查。 §§相关问题§§ 1. 如何解决Spring Boot应用端口被占用的问题? 2. 在JDK11中运行Spring Boot项目需要额外注意什么? 3. Spring Boot如何切换嵌入式服务器(例如从Tomcat切换到Jetty)?</think>### Spring Boot启动报错`WebServerException: Unable to start embedded Tomcat`解决方案 #### 一、常见原因及解决方案 1. **端口冲突(最常见)** TCP端口范围是 $0 \sim 65535$,若端口被占用会导致启动失败[^3]。 **解决步骤**: - 检查端口占用: ```bash # Windows netstat -ano | findstr :8080 # Linux/Mac lsof -i :8080 ``` - 释放端口: - 终止占用进程:`kill -9 <PID>`(Linux/Mac)或任务管理器(Windows) - **或**修改应用端口(`application.properties`中): ```properties server.port=8081 # 更换可用端口 ``` 2. **JDK版本问题(JDK9+需手动添加JAXB依赖)** 适用于使用Eureka等组件的场景[^4]。 **解决方案**: 在`pom.xml`中添加依赖: ```xml <!-- JDK9+ 需手动添加JAXB --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> ``` 3. **依赖冲突** 例如多个Tomcat版本冲突。 **解决步骤**: - 检查依赖树: ```bash mvn dependency:tree | grep tomcat ``` - 排除冲突依赖(示例): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> ``` 4. **SSL配置错误** 若启用HTTPS证书无效: **解决方案**: - 检查`application.properties`中SSL路径: ```properties server.ssl.key-store=classpath:keystore.p12 server.ssl.key-store-password=your_password ``` --- #### 二、通用排查流程 ```mermaid graph TD A[启动报错] --> B{检查日志} B -->|端口冲突| C[释放端口或修改配置] B -->|缺少JAXB| D[添加JDK9+依赖] B -->|依赖冲突| E[排除冲突依赖] B -->|SSL错误| F[检查证书路径] C --> G[重启应用] D --> G E --> G F --> G G --> H{是否解决} H -->|是| I[完成] H -->|否| J[检查内存/权限] ``` > **关键提示**:完整错误日志可通过启动命令添加 `--debug` 参数获取详细堆栈信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值