Spring boot 2 embed tomcat 9.0.26 无法加载jks文件流关闭

Posted

技术标签:

【中文标题】Spring boot 2 embed tomcat 9.0.26 无法加载jks文件流关闭【英文标题】:Spring boot 2 embed tomcat 9.0.26 can not load jks file stream closed 【发布时间】:2020-01-31 01:04:28 【问题描述】:

我尝试在带有嵌入式 tomcat 9.0.26 的 spring boot 2.2.0 上使用 SSL,但是 tomcat 无法加载 JKS 文件流关闭。

这是应用程序属性:

server.port=443
server.ssl.key-store-type=JKS
server.ssl.key-store=C:\\Keystore\\mykey.jks
server.ssl.key-store-password=cccc 
server.ssl.key-alias=*.mydomain.com

例外:

org.springframework.boot.web.server.WebServerException: 无法 启动嵌入式 Tomcat 服务器 在 org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:215) ~[spring-boot-2.2.0.BUILD-SNAPSHOT.jar!/:2.2.0.BUILD-SNAPSHOT] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.startWebServer(ServletWebServerApplicationContext.java:297) ~[spring-boot-2.2.0.BUILD-SNAPSHOT.jar!/:2.2.0.BUILD-SNAPSHOT] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:163) ~[spring-boot-2.2.0.BUILD-SNAPSHOT.jar!/:2.2.0.BUILD-SNAPSHOT] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553) ~[spring-context-5.2.0.RELEASE.jar!/:5.2.0.RELEASE] 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.0.BUILD-SNAPSHOT.jar!/:2.2.0.BUILD-SNAPSHOT] 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.0.BUILD-SNAPSHOT.jar!/:2.2.0.BUILD-SNAPSHOT] 在 org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.0.BUILD-SNAPSHOT.jar!/:2.2.0.BUILD-SNAPSHOT] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.0.BUILD-SNAPSHOT.jar!/:2.2.0.BUILD-SNAPSHOT] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.0.BUILD-SNAPSHOT.jar!/:2.2.0.BUILD-SNAPSHOT] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.0.BUILD-SNAPSHOT.jar!/:2.2.0.BUILD-SNAPSHOT] 在 eu.soluma.app.SolumaTdvApplication.main(SolumaTdvApplication.java:34) ~[classes!/:0.0.1-SNAPSHOT] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)~[na:na] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 〜[无:无] 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 〜[无:无] 在 java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na] 在 org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) ~[SolumaTDV-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:87) ~[SolumaTDV-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] 在 org.springframework.boot.loader.Launcher.launch(Launcher.java:51) ~[SolumaTDV-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] 在 org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52) ~[SolumaTDV-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT] 原因: java.lang.IllegalArgumentException: standardService.connector.startFailed 在 org.apache.catalina.core.StandardService.addConnector(StandardService.java:231) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviousRemovedConnectors(TomcatWebServer.java:278) ~[spring-boot-2.2.0.BUILD-SNAPSHOT.jar!/:2.2.0.BUILD-SNAPSHOT] 在 org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:197) ~[spring-boot-2.2.0.BUILD-SNAPSHOT.jar!/:2.2.0.BUILD-SNAPSHOT] ...省略了 18 个常见帧 原因:org.apache.catalina.LifecycleException:协议处理程序启动失败 在 org.apache.catalina.connector.Connector.startInternal(Connector.java:1008) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.catalina.core.StandardService.addConnector(StandardService.java:227) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] ... 省略了 20 个常见帧 原因:java.lang.IllegalArgumentException:流已关闭 在 org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:99) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:218) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1124) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1210) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:585) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.catalina.connector.Connector.startInternal(Connector.java:1005) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] ...省略了 22 个常见帧 原因:java.io.IOException: Stream closed 在 java.base/java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:176) 〜[无:无] 在 java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:342) 〜[无:无] 在 java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:252) 〜[无:无] 在 java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:271) 〜[无:无] 在 java.base/java.security.DigestInputStream.read(DigestInputStream.java:125) 〜[无:无] 在 java.base/java.io.DataInputStream.readInt(DataInputStream.java:392) 〜[无:无] 在 java.base/sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:659) 〜[无:无] 在 java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:222) 〜[无:无] 在 java.base/java.security.KeyStore.load(KeyStore.java:1472) ~[na:na] 在 org.apache.tomcat.util.security.KeyStoreUtil.load(KeyStoreUtil.java:69) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:217) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:206) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:283) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:247) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] 在 org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97) ~[tomcat-embed-core-9.0.26.jar!/:9.0.26] ...省略了28个常用框架

【问题讨论】:

您是否尝试过将密钥库的路径放在“双引号”中并使用单斜杠?例如server.ssl.key-store="C:\Keystore\mykey.jks" 你有没有试过在地址前加上file: 是的,我尝试了这两个技巧,但没有运气 这里的问题到底是什么? 【参考方案1】:

这是 Tomcat 9.0.25 中引入的回归,将在 9.0.27 中修复。

【讨论】:

降级到 Spring Boot 2.1.8 并解决了问题。 有人知道这方面的更多信息吗?我有同样的问题,我发现抛出的异常非常模糊。 这似乎是跟踪此回归的问题。该问题现已关闭。 github.com/spring-projects/spring-boot/issues/18505 其实那个适用于jar中的文件,而不是本地文件系统上的。【参考方案2】:

谢谢佩德罗。我遇到了 Spring Boot 2.1.9.RELEASE 的问题,可以确认已通过降级到 2.1.8 来解决。

【讨论】:

Java 12 和从 Spring 2.1.9.RELEASE 到 2.1.8.RELEASE 也为我工作。 ...佩德罗是谁?【参考方案3】:

2.1.10.RELEASE 还纠正了 2.1.9 中出现的问题。

【讨论】:

以上是关于Spring boot 2 embed tomcat 9.0.26 无法加载jks文件流关闭的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot:当 spring-boot-starter-tomcat 和 tomcat-embed-jasper 一起时“扫描失败”

Spring Boot tomcat-embed-core-9.0.21.jar:zip 文件为空

spring boot 添加jsp支持注意事项

Spring Boot 2 Rest Api Example

通过spring boot构建solr查询实例

Spring Boot(23)——使用Jsp视图