diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml
index 65a9e3edbc..2553be6274 100644
--- a/spring-boot-dependencies/pom.xml
+++ b/spring-boot-dependencies/pom.xml
@@ -153,7 +153,7 @@
2.1.1.RELEASE
1.2.9
1.3
- 8.0.26
+ 8.0.28
1.3.0.Final
1.7
2.0
diff --git a/spring-boot-docs/src/main/asciidoc/howto.adoc b/spring-boot-docs/src/main/asciidoc/howto.adoc
index ed48010ecf..2813382cb1 100644
--- a/spring-boot-docs/src/main/asciidoc/howto.adoc
+++ b/spring-boot-docs/src/main/asciidoc/howto.adoc
@@ -476,10 +476,6 @@ typically in `application.properties` or `application.yml`. For example:
See {sc-spring-boot}/context/embedded/Ssl.{sc-ext}[`Ssl`] for details of all of the
supported properties.
-NOTE: Tomcat requires the key store (and trust store if you're using one) to be directly
-accessible on the filesystem, i.e. it cannot be read from within a jar file. This
-limitation doesn't apply to Jetty and Undertow.
-
Using configuration like the example above means the application will no longer support
plain HTTP connector at port 8080. Spring Boot doesn't support the configuration of both
an HTTP connector and an HTTPS connector via `application.properties`. If you want to
diff --git a/spring-boot-samples/spring-boot-sample-tomcat-ssl/src/main/resources/application.properties b/spring-boot-samples/spring-boot-sample-tomcat-ssl/src/main/resources/application.properties
index c889728394..37199bfd25 100644
--- a/spring-boot-samples/spring-boot-sample-tomcat-ssl/src/main/resources/application.properties
+++ b/spring-boot-samples/spring-boot-sample-tomcat-ssl/src/main/resources/application.properties
@@ -1,4 +1,4 @@
server.port = 8443
-server.ssl.key-store = sample.jks
+server.ssl.key-store = classpath:sample.jks
server.ssl.key-store-password = secret
-server.ssl.key-password = password
\ No newline at end of file
+server.ssl.key-password = password
diff --git a/spring-boot-samples/spring-boot-sample-tomcat-ssl/sample.jks b/spring-boot-samples/spring-boot-sample-tomcat-ssl/src/main/resources/sample.jks
similarity index 100%
rename from spring-boot-samples/spring-boot-sample-tomcat-ssl/sample.jks
rename to spring-boot-samples/spring-boot-sample-tomcat-ssl/src/main/resources/sample.jks
diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java
index 0a1097ab0d..8f9c04463e 100644
--- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java
+++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java
@@ -326,9 +326,7 @@ public class TomcatEmbeddedServletContainerFactory
private void configureSslKeyStore(AbstractHttp11JsseProtocol> protocol, Ssl ssl) {
try {
- assertNotClasspathResource(ssl.getKeyStore());
- File file = ResourceUtils.getFile(ssl.getKeyStore());
- protocol.setKeystoreFile(file.getAbsolutePath());
+ protocol.setKeystoreFile(ResourceUtils.getURL(ssl.getKeyStore()).toString());
}
catch (FileNotFoundException ex) {
throw new EmbeddedServletContainerException(
@@ -345,9 +343,8 @@ public class TomcatEmbeddedServletContainerFactory
private void configureSslTrustStore(AbstractHttp11JsseProtocol> protocol, Ssl ssl) {
if (ssl.getTrustStore() != null) {
try {
- assertNotClasspathResource(ssl.getTrustStore());
- File file = ResourceUtils.getFile(ssl.getTrustStore());
- protocol.setTruststoreFile(file.getAbsolutePath());
+ protocol.setTruststoreFile(
+ ResourceUtils.getURL(ssl.getTrustStore()).toString());
}
catch (FileNotFoundException ex) {
throw new EmbeddedServletContainerException(
@@ -363,14 +360,6 @@ public class TomcatEmbeddedServletContainerFactory
}
}
- private void assertNotClasspathResource(String resource)
- throws FileNotFoundException {
- if (resource.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)) {
- throw new FileNotFoundException("Unable to load '" + resource
- + "' since Tomcat doesn't support classpath resources");
- }
- }
-
/**
* Configure the Tomcat {@link Context}.
* @param context the Tomcat context
diff --git a/spring-boot/src/test/java/org/springframework/boot/context/embedded/AbstractEmbeddedServletContainerFactoryTests.java b/spring-boot/src/test/java/org/springframework/boot/context/embedded/AbstractEmbeddedServletContainerFactoryTests.java
index a504e88e5b..a77c023991 100644
--- a/spring-boot/src/test/java/org/springframework/boot/context/embedded/AbstractEmbeddedServletContainerFactoryTests.java
+++ b/spring-boot/src/test/java/org/springframework/boot/context/embedded/AbstractEmbeddedServletContainerFactoryTests.java
@@ -330,14 +330,19 @@ public abstract class AbstractEmbeddedServletContainerFactoryTests {
}
@Test
- public void basicSsl() throws Exception {
+ public void basicSslFromClassPath() throws Exception {
+ testBasicSslWithKeyStore("classpath:test.jks");
+ }
+
+ @Test
+ public void basicSslFromFileSystem() throws Exception {
testBasicSslWithKeyStore("src/test/resources/test.jks");
}
@Test
public void sslDisabled() throws Exception {
AbstractEmbeddedServletContainerFactory factory = getFactory();
- Ssl ssl = getSsl(null, "password", "src/test/resources/test.jks");
+ Ssl ssl = getSsl(null, "password", "classpath:test.jks");
ssl.setEnabled(false);
factory.setSsl(ssl);
this.container = factory.getEmbeddedServletContainer(
@@ -393,8 +398,8 @@ public abstract class AbstractEmbeddedServletContainerFactoryTests {
public void pkcs12KeyStoreAndTrustStore() throws Exception {
AbstractEmbeddedServletContainerFactory factory = getFactory();
addTestTxtFile(factory);
- factory.setSsl(getSsl(ClientAuth.NEED, null, "src/test/resources/test.p12",
- "src/test/resources/test.p12"));
+ factory.setSsl(getSsl(ClientAuth.NEED, null, "classpath:test.p12",
+ "classpath:test.p12"));
this.container = factory.getEmbeddedServletContainer();
this.container.start();
KeyStore keyStore = KeyStore.getInstance("pkcs12");
@@ -417,8 +422,8 @@ public abstract class AbstractEmbeddedServletContainerFactoryTests {
throws Exception {
AbstractEmbeddedServletContainerFactory factory = getFactory();
addTestTxtFile(factory);
- factory.setSsl(getSsl(ClientAuth.NEED, "password", "src/test/resources/test.jks",
- "src/test/resources/test.jks"));
+ factory.setSsl(getSsl(ClientAuth.NEED, "password", "classpath:test.jks",
+ "classpath:test.jks"));
this.container = factory.getEmbeddedServletContainer();
this.container.start();
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
@@ -441,8 +446,7 @@ public abstract class AbstractEmbeddedServletContainerFactoryTests {
throws Exception {
AbstractEmbeddedServletContainerFactory factory = getFactory();
addTestTxtFile(factory);
- factory.setSsl(
- getSsl(ClientAuth.NEED, "password", "src/test/resources/test.jks"));
+ factory.setSsl(getSsl(ClientAuth.NEED, "password", "classpath:test.jks"));
this.container = factory.getEmbeddedServletContainer();
this.container.start();
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
@@ -460,8 +464,7 @@ public abstract class AbstractEmbeddedServletContainerFactoryTests {
throws Exception {
AbstractEmbeddedServletContainerFactory factory = getFactory();
addTestTxtFile(factory);
- factory.setSsl(
- getSsl(ClientAuth.WANT, "password", "src/test/resources/test.jks"));
+ factory.setSsl(getSsl(ClientAuth.WANT, "password", "classpath:test.jks"));
this.container = factory.getEmbeddedServletContainer();
this.container.start();
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
@@ -484,8 +487,7 @@ public abstract class AbstractEmbeddedServletContainerFactoryTests {
throws Exception {
AbstractEmbeddedServletContainerFactory factory = getFactory();
addTestTxtFile(factory);
- factory.setSsl(
- getSsl(ClientAuth.WANT, "password", "src/test/resources/test.jks"));
+ factory.setSsl(getSsl(ClientAuth.WANT, "password", "classpath:test.jks"));
this.container = factory.getEmbeddedServletContainer();
this.container.start();
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
diff --git a/spring-boot/src/test/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactoryTests.java b/spring-boot/src/test/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactoryTests.java
index 1b35ff356c..515c86c1a1 100644
--- a/spring-boot/src/test/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactoryTests.java
+++ b/spring-boot/src/test/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactoryTests.java
@@ -40,7 +40,6 @@ import org.apache.coyote.http11.AbstractHttp11JsseProtocol;
import org.junit.Test;
import org.mockito.InOrder;
import org.springframework.boot.context.embedded.AbstractEmbeddedServletContainerFactoryTests;
-import org.springframework.boot.context.embedded.EmbeddedServletContainerException;
import org.springframework.boot.context.embedded.Ssl;
import org.springframework.util.SocketUtils;
@@ -316,13 +315,6 @@ public class TomcatEmbeddedServletContainerFactoryTests
}
- @Test
- public void basicSslClasspathKeyStore() throws Exception {
- this.thrown.expect(EmbeddedServletContainerException.class);
- this.thrown.expectMessage("Tomcat doesn't support classpath resources");
- testBasicSslWithKeyStore("classpath:test.jks");
- }
-
@Test
public void jspServletInitParameters() {
Map initParameters = new HashMap();