参考了
springboot将http改造成https_springboot改https协议_迷途风哥的博客-CSDN博客
的配置我将https的相关配置改好后,启动项目收到报错
ERROR SpringApplication Application run failed
org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server
报错信息显示tomcat启动失败。
向chatgpt提问后给了我几个方向
这个错误主要是由于 keystore 文件有误,导致嵌入式 Tomcat 服务器在启动时无法加载 keystore 文件。具体的原因可能如下:
- keystore 文件路径不正确
请确保在
application.properties
或application.yml
配置文件中正确指定了 keystore 文件的路径,并且该路径与实际的文件路径相符。如果 keystore 文件不存在或路径不正确会导致该错误。
- keystore 格式不正确
请确保您生成 keystore 文件时指定的格式与所配置的
server.ssl.key-store-type
属性相符(也可以通过省略此属性来使用默认值),否则嵌入式 Tomcat 服务器将无法加载 keystore 文件。如果您不确定 keystore 的格式,请使用以下命令来查看:$ keytool -list -v -keystore <your-keystore-file>
- keystore 密码不正确
请确保在
server.ssl.key-store-password
属性中提供 keystore 的正确密码,并且该密码与实际的 keystore 密码相符。如果密码不正确,将无法加载 keystore 文件。
- keystore 中的证书或密钥不正确
如果你的 SSL 证书生成有问题,就可能会导致证书或密钥无法被正确加载。可以重新生成 SSL 证书并更新 keystore 文件。您可以使用以下命令来检查 keystore 文件中的证书和密钥:
$ keytool -list -v -keystore <your-keystore-file>
如果以上步骤都确认正确,可以检查 keystore 文件本身是否存在问题,例如文件损坏或格式不正确。您可以尝试重新生成 keystore 文件,并使用新生成的 keystore 文件来代替旧文件,并在
application.properties
或application.yml
中指定新文件的路径和密码。
经过反复检查,这个明显不符合实际情况。
在检索资料过程中看到了这篇文章
这里提示说要配置ssl参数,增加一个配置类并且对http请求做重定向,但是他发出来的代码和我的springboot版本对不上,我的版本是2.6.14 问计chatgpt给出了修改方案
@Configuration
public class WebConfig {
@Bean
public TomcatServletWebServerFactory servletWebServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
// 配置 SSL
Ssl ssl = new Ssl();
ssl.setKeyStore("证书名");
ssl.setKeyStorePassword("密码");
factory.setSsl(ssl);
// 配置 HTTPS 端口
factory.setPort(443);
// 将 HTTP 请求重定向至 HTTPS
Connector connector = createHttpConnector();
factory.addAdditionalTomcatConnectors(connector);
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;
}
}
重启后启动正常了,可以通过https访问了!