Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package org.springframework.boot.web.embedded.netty;

import java.io.FileNotFoundException;
import java.net.URL;
import java.security.KeyStore;
import java.util.Arrays;
Expand All @@ -31,13 +32,15 @@
import org.springframework.boot.web.server.Http2;
import org.springframework.boot.web.server.Ssl;
import org.springframework.boot.web.server.SslStoreProvider;
import org.springframework.boot.web.server.WebServerException;
import org.springframework.util.ResourceUtils;

/**
* {@link NettyServerCustomizer} that configures SSL for the given Reactor Netty server
* instance.
*
* @author Brian Clozel
* @author Raheela Aslam
*/
public class SslServerCustomizer implements NettyServerCustomizer {

Expand Down Expand Up @@ -135,21 +138,40 @@ private KeyStore getTrustStore(Ssl ssl, SslStoreProvider sslStoreProvider)
if (sslStoreProvider != null) {
return sslStoreProvider.getTrustStore();
}
return loadKeyStore(ssl.getTrustStoreType(), ssl.getTrustStoreProvider(),
return loadTrustStore(ssl.getTrustStoreType(), ssl.getTrustStoreProvider(),
ssl.getTrustStore(), ssl.getTrustStorePassword());
}

private KeyStore loadKeyStore(String type, String provider, String resource,
String password) throws Exception {
type = (type != null) ? type : "JKS";

return loadStore(type, provider, resource, password);
}

private KeyStore loadTrustStore(String type, String provider, String resource,
String password) throws Exception {
if (resource == null) {
return null;
}
else {
return loadStore(type, provider, resource, password);
}
}

private KeyStore loadStore(String type, String provider, String resource,
String password) throws Exception {
type = (type != null) ? type : "JKS";
KeyStore store = (provider != null) ? KeyStore.getInstance(type, provider)
: KeyStore.getInstance(type);
URL url = ResourceUtils.getURL(resource);
store.load(url.openStream(), (password != null) ? password.toCharArray() : null);
return store;
try {
URL url = ResourceUtils.getURL(resource);
store.load(url.openStream(),
(password != null) ? password.toCharArray() : null);
return store;
}
catch (FileNotFoundException ex) {
throw new WebServerException("Could not load store: " + ex.getMessage(), ex);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package org.springframework.boot.web.embedded.undertow;

import java.io.FileNotFoundException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
Expand All @@ -41,12 +42,14 @@

import org.springframework.boot.web.server.Ssl;
import org.springframework.boot.web.server.SslStoreProvider;
import org.springframework.boot.web.server.WebServerException;
import org.springframework.util.ResourceUtils;

/**
* {@link UndertowBuilderCustomizer} that configures SSL on the given builder instance.
*
* @author Brian Clozel
* @author Raheela Aslam
*/
class SslBuilderCustomizer implements UndertowBuilderCustomizer {

Expand Down Expand Up @@ -166,21 +169,39 @@ private KeyStore getTrustStore(Ssl ssl, SslStoreProvider sslStoreProvider)
if (sslStoreProvider != null) {
return sslStoreProvider.getTrustStore();
}
return loadKeyStore(ssl.getTrustStoreType(), ssl.getTrustStoreProvider(),
return loadTrustStore(ssl.getTrustStoreType(), ssl.getTrustStoreProvider(),
ssl.getTrustStore(), ssl.getTrustStorePassword());
}

private KeyStore loadKeyStore(String type, String provider, String resource,
String password) throws Exception {
type = (type != null) ? type : "JKS";
return loadStore(type, provider, resource, password);
}

private KeyStore loadTrustStore(String type, String provider, String resource,
String password) throws Exception {
if (resource == null) {
return null;
}
else {
return loadStore(type, provider, resource, password);
}
}

private KeyStore loadStore(String type, String provider, String resource,
String password) throws Exception {
type = (type != null) ? type : "JKS";
KeyStore store = (provider != null) ? KeyStore.getInstance(type, provider)
: KeyStore.getInstance(type);
URL url = ResourceUtils.getURL(resource);
store.load(url.openStream(), (password != null) ? password.toCharArray() : null);
return store;
try {
URL url = ResourceUtils.getURL(resource);
store.load(url.openStream(),
(password != null) ? password.toCharArray() : null);
return store;
}
catch (FileNotFoundException ex) {
throw new WebServerException("Could not load store: " + ex.getMessage(), ex);
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
* Tests for {@link SslServerCustomizer}.
*
* @author Andy Wilkinson
* @author Raheela Aslam
*/
public class SslServerCustomizerTests {

Expand Down Expand Up @@ -68,4 +69,20 @@ public void trustStoreProviderIsUsedWhenCreatingTrustStore() throws Exception {
}
}

@Test
public void keyStoreProviderIsUsedWhenKeyStoreNotContaining() throws Exception {
Ssl ssl = new Ssl();
ssl.setKeyPassword("password");
SslServerCustomizer customizer = new SslServerCustomizer(ssl, null, null);
try {
customizer.getKeyManagerFactory(ssl, null);
fail();
}
catch (IllegalStateException ex) {
Throwable cause = ex.getCause();
assertThat(cause).isInstanceOf(IllegalArgumentException.class);
assertThat(cause).hasMessageContaining("Resource location must not be null");
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
* Tests for {@link SslBuilderCustomizer}
*
* @author Brian Clozel
* @author Raheela Aslam
*/
public class SslBuilderCustomizerTests {

Expand Down Expand Up @@ -88,4 +89,24 @@ public void trustStoreProviderIsUsedWhenCreatingTrustStore() throws Exception {
}
}

@Test
public void getKeyManagersWhenKeyStoreIsNotProvided() throws Exception {
Ssl ssl = new Ssl();
ssl.setKeyPassword("password");
SslBuilderCustomizer customizer = new SslBuilderCustomizer(8080,
InetAddress.getLocalHost(), ssl, null);
try {
KeyManager[] keyManagers = ReflectionTestUtils.invokeMethod(customizer,
"getKeyManagers", ssl, null);
Class<?> name = Class.forName("org.springframework.boot.web.embedded.undertow"
+ ".SslBuilderCustomizer$ConfigurableAliasKeyManager");
assertThat(keyManagers[0]).isNotInstanceOf(name);
}
catch (IllegalStateException ex) {
Throwable cause = ex.getCause();
assertThat(cause).isInstanceOf(IllegalArgumentException.class);
assertThat(cause).hasMessageContaining("Resource location must not be null");
}
}

}