Skip to content

Commit 52361e6

Browse files
committed
Honour SSL key and trust store providers when configuring Undertow
Closes gh-14713
1 parent 2c7b74d commit 52361e6

File tree

2 files changed

+45
-7
lines changed

2 files changed

+45
-7
lines changed

spring-boot/src/main/java/org/springframework/boot/context/embedded/undertow/UndertowEmbeddedServletContainerFactory.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -347,8 +347,8 @@ private KeyStore getKeyStore() throws Exception {
347347
return getSslStoreProvider().getKeyStore();
348348
}
349349
Ssl ssl = getSsl();
350-
return loadKeyStore(ssl.getKeyStoreType(), ssl.getKeyStore(),
351-
ssl.getKeyStorePassword());
350+
return loadKeyStore(ssl.getKeyStoreType(), ssl.getKeyStoreProvider(),
351+
ssl.getKeyStore(), ssl.getKeyStorePassword());
352352
}
353353

354354
private TrustManager[] getTrustManagers() {
@@ -369,17 +369,18 @@ private KeyStore getTrustStore() throws Exception {
369369
return getSslStoreProvider().getTrustStore();
370370
}
371371
Ssl ssl = getSsl();
372-
return loadKeyStore(ssl.getTrustStoreType(), ssl.getTrustStore(),
373-
ssl.getTrustStorePassword());
372+
return loadKeyStore(ssl.getTrustStoreType(), ssl.getTrustStoreProvider(),
373+
ssl.getTrustStore(), ssl.getTrustStorePassword());
374374
}
375375

376-
private KeyStore loadKeyStore(String type, String resource, String password)
377-
throws Exception {
376+
private KeyStore loadKeyStore(String type, String provider, String resource,
377+
String password) throws Exception {
378378
type = (type != null) ? type : "JKS";
379379
if (resource == null) {
380380
return null;
381381
}
382-
KeyStore store = KeyStore.getInstance(type);
382+
KeyStore store = (provider != null) ? KeyStore.getInstance(type, provider)
383+
: KeyStore.getInstance(type);
383384
URL url = ResourceUtils.getURL(resource);
384385
store.load(url.openStream(), (password != null) ? password.toCharArray() : null);
385386
return store;

spring-boot/src/test/java/org/springframework/boot/context/embedded/undertow/UndertowEmbeddedServletContainerFactoryTests.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.net.SocketException;
2222
import java.net.URISyntaxException;
2323
import java.nio.charset.Charset;
24+
import java.security.NoSuchProviderException;
2425
import java.util.Arrays;
2526
import java.util.Collection;
2627
import java.util.HashSet;
@@ -54,6 +55,7 @@
5455
import static org.assertj.core.api.Assertions.assertThat;
5556
import static org.hamcrest.CoreMatchers.anyOf;
5657
import static org.hamcrest.CoreMatchers.instanceOf;
58+
import static org.junit.Assert.fail;
5759
import static org.mockito.Matchers.anyObject;
5860
import static org.mockito.Mockito.inOrder;
5961
import static org.mockito.Mockito.mock;
@@ -194,6 +196,41 @@ public void accessLogCanBeCustomized()
194196
testAccessLog("my_access.", "logz", "my_access.logz");
195197
}
196198

199+
@Test
200+
public void sslKeyStoreProvider() {
201+
AbstractEmbeddedServletContainerFactory factory = getFactory();
202+
Ssl ssl = getSsl(null, "password", "classpath:test.jks");
203+
ssl.setKeyStoreProvider("com.example.KeyStoreProvider");
204+
factory.setSsl(ssl);
205+
try {
206+
factory.getEmbeddedServletContainer();
207+
fail();
208+
}
209+
catch (Exception ex) {
210+
Throwable cause = ex.getCause();
211+
assertThat(cause).isInstanceOf(NoSuchProviderException.class);
212+
assertThat(cause).hasMessageContaining("com.example.KeyStoreProvider");
213+
}
214+
}
215+
216+
@Test
217+
public void sslTrustStoreProvider() {
218+
AbstractEmbeddedServletContainerFactory factory = getFactory();
219+
Ssl ssl = getSsl(null, null, null);
220+
ssl.setTrustStore("classpath:test.jks");
221+
ssl.setTrustStoreProvider("com.example.TrustStoreProvider");
222+
factory.setSsl(ssl);
223+
try {
224+
factory.getEmbeddedServletContainer();
225+
fail();
226+
}
227+
catch (Exception ex) {
228+
Throwable cause = ex.getCause();
229+
assertThat(cause).isInstanceOf(NoSuchProviderException.class);
230+
assertThat(cause).hasMessageContaining("com.example.TrustStoreProvider");
231+
}
232+
}
233+
197234
private void testAccessLog(String prefix, String suffix, String expectedFile)
198235
throws IOException, URISyntaxException, InterruptedException {
199236
UndertowEmbeddedServletContainerFactory factory = getFactory();

0 commit comments

Comments
 (0)