我将Spring Boot上的项目从2.0.0.M7升级到2.0.1,我的ssl配置已经破解。 我在资源目录中有我的密钥库/信任库,以及指向它们的application.yml中的属性。
application.yml
server:
schema: "https"
address: "localhost"
port: 8080
sslPort: 8443
servlet:
session:
timeout: 900
spring:
profiles:
active: dev
ssl:
keystoreFile: classpath:.keystore
keystorePass: ****
truststoreFile: classpath:.truststore
truststorePass: ****
我使用属性在我的@Configuration类中构建ssl连接器。 这里的sslProperties对象包含来自上面的application.yml的ssl部分的所有属性。
private Connector createSslConnector(WebServerProperties webServerProperties, SslProperties sslProperties) {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
connector.setScheme(WebServerProperties.HTTPS_SCHEMA);
connector.setSecure(true);
connector.setPort(webServerProperties.getSslPort());
protocol.setSSLEnabled(true);
protocol.setKeystoreFile(sslProperties.getKeystoreFile());
protocol.setKeystorePass(sslProperties.getKeystorePass());
protocol.setKeyPass(sslProperties.getKeyPass());
protocol.setKeyAlias(sslProperties.getKeyAlias());
protocol.setCiphers(sslProperties.getCiphers());
protocol.setSslEnabledProtocols(sslProperties.getSslProtocols());
return connector;
}
升级后,应用程序不会以下面的异常开始
org.apache.catalina.LifecycleException: Failed to initialize component [Connector[HTTP/1.1-8443]]
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:112)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:549)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:875)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:140)
at org.apache.catalina.startup.Tomcat.start(Tomcat.java:367)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:107)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:86)
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:409)
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:174)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:179)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:152)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:395)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:327)
at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:137)
at net.twisteddna.Application.main(Application.java:37)
Caused by: org.apache.catalina.LifecycleException: Protocol handler initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:995)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:107)
... 19 common frames omitted
Caused by: java.lang.IllegalArgumentException: unknown protocol: classpath
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:116)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:87)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:225)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1086)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.init(AbstractJsseEndpoint.java:268)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:581)
at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:68)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:993)
... 20 common frames omitted
Caused by: java.net.MalformedURLException: unknown protocol: classpath
at java.net.URL.<init>(URL.java:600)
at java.net.URL.<init>(URL.java:490)
at java.net.URL.<init>(URL.java:439)
at java.net.URI.toURL(URI.java:1089)
at org.apache.tomcat.util.file.ConfigFileLoader.getInputStream(ConfigFileLoader.java:95)
at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:132)
at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:204)
at org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:184)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114)
... 27 common frames omitted
Spring Boot 2.0.0.M7包含tomcat-embed-core-8.5.23,其中AbstractHttp11Protocol为。 Spring Boot 2.0.1有tomcat-embed-core-8.5.29。 而较新的tomcat版本似乎忘记了如何从类路径中读取