diff --git a/spring-boot-project/spring-boot-dependencies/pom.xml b/spring-boot-project/spring-boot-dependencies/pom.xml
index 3cdc33499b..af2a3319fc 100644
--- a/spring-boot-project/spring-boot-dependencies/pom.xml
+++ b/spring-boot-project/spring-boot-dependencies/pom.xml
@@ -99,7 +99,7 @@
2.9.3
2.26
5.3.4
- 9.4.14.v20181114
+ 9.4.15.v20190215
2.2.0.v201112011158
8.5.35.1
1.14
diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/server/AbstractReactiveWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/server/AbstractReactiveWebServerFactoryTests.java
index 0fdf46acd9..b634dc58f7 100644
--- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/server/AbstractReactiveWebServerFactoryTests.java
+++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/reactive/server/AbstractReactiveWebServerFactoryTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2012-2018 the original author or authors.
+ * Copyright 2012-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,12 +21,16 @@ import java.io.FileInputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.security.KeyStore;
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
import java.time.Duration;
import java.util.Arrays;
import java.util.function.Consumer;
+import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLException;
+import javax.net.ssl.X509KeyManager;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
@@ -169,10 +173,22 @@ public abstract class AbstractReactiveWebServerFactoryTests {
KeyManagerFactory clientKeyManagerFactory = KeyManagerFactory
.getInstance(KeyManagerFactory.getDefaultAlgorithm());
clientKeyManagerFactory.init(clientKeyStore, "password".toCharArray());
- return new ReactorClientHttpConnector((options) -> options.sslSupport(
- (sslContextBuilder) -> sslContextBuilder.sslProvider(SslProvider.JDK)
- .trustManager(InsecureTrustManagerFactory.INSTANCE)
- .keyManager(clientKeyManagerFactory)));
+ for (KeyManager keyManager : clientKeyManagerFactory.getKeyManagers()) {
+ if (keyManager instanceof X509KeyManager) {
+ X509KeyManager x509KeyManager = (X509KeyManager) keyManager;
+ PrivateKey privateKey = x509KeyManager.getPrivateKey("spring-boot");
+ if (privateKey != null) {
+ X509Certificate[] certificateChain = x509KeyManager
+ .getCertificateChain("spring-boot");
+ return new ReactorClientHttpConnector((options) -> options
+ .sslSupport((sslContextBuilder) -> sslContextBuilder
+ .sslProvider(SslProvider.JDK)
+ .trustManager(InsecureTrustManagerFactory.INSTANCE)
+ .keyManager(privateKey, certificateChain)));
+ }
+ }
+ }
+ throw new IllegalStateException("Key with alias 'spring-boot' not found");
}
protected void testClientAuthSuccess(Ssl sslConfiguration,
diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java
index b4c7b35053..70cfd659b8 100644
--- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java
+++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2012-2018 the original author or authors.
+ * Copyright 2012-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@ import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.ServerSocket;
+import java.net.Socket;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
@@ -74,6 +75,8 @@ import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HttpContext;
+import org.apache.http.ssl.PrivateKeyDetails;
+import org.apache.http.ssl.PrivateKeyStrategy;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;
import org.apache.jasper.EmbeddedServletOptions;
@@ -424,7 +427,7 @@ public abstract class AbstractServletWebServerFactoryTests {
this.webServer = factory.getWebServer(registration);
this.webServer.start();
TrustStrategy trustStrategy = new SerialNumberValidatingTrustSelfSignedStrategy(
- "77e7c302");
+ "5c7ae101");
SSLContext sslContext = new SSLContextBuilder()
.loadTrustMaterial(null, trustStrategy).build();
HttpClient httpClient = HttpClients.custom()
@@ -500,7 +503,18 @@ public abstract class AbstractServletWebServerFactoryTests {
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
new SSLContextBuilder()
.loadTrustMaterial(null, new TrustSelfSignedStrategy())
- .loadKeyMaterial(keyStore, "secret".toCharArray()).build());
+ .loadKeyMaterial(keyStore, "secret".toCharArray(),
+ new PrivateKeyStrategy() {
+
+ @Override
+ public String chooseAlias(
+ Map aliases,
+ Socket socket) {
+ return "spring-boot";
+ }
+
+ })
+ .build());
HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(
@@ -524,7 +538,17 @@ public abstract class AbstractServletWebServerFactoryTests {
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
new SSLContextBuilder()
.loadTrustMaterial(null, new TrustSelfSignedStrategy())
- .loadKeyMaterial(keyStore, "password".toCharArray()).build());
+ .loadKeyMaterial(keyStore, "password".toCharArray(),
+ new PrivateKeyStrategy() {
+
+ @Override
+ public String chooseAlias(
+ Map aliases,
+ Socket socket) {
+ return "spring-boot";
+ }
+ })
+ .build());
HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(
@@ -613,7 +637,17 @@ public abstract class AbstractServletWebServerFactoryTests {
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
new SSLContextBuilder()
.loadTrustMaterial(null, new TrustSelfSignedStrategy())
- .loadKeyMaterial(keyStore, "password".toCharArray()).build());
+ .loadKeyMaterial(keyStore, "password".toCharArray(),
+ new PrivateKeyStrategy() {
+
+ @Override
+ public String chooseAlias(
+ Map aliases,
+ Socket socket) {
+ return "spring-boot";
+ }
+ })
+ .build());
HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(
diff --git a/spring-boot-project/spring-boot/src/test/resources/test.jks b/spring-boot-project/spring-boot/src/test/resources/test.jks
index 1bce90bba6..f8a5f70596 100644
Binary files a/spring-boot-project/spring-boot/src/test/resources/test.jks and b/spring-boot-project/spring-boot/src/test/resources/test.jks differ
diff --git a/spring-boot-project/spring-boot/src/test/resources/test.p12 b/spring-boot-project/spring-boot/src/test/resources/test.p12
index de3664b9d7..1d6a25829c 100644
Binary files a/spring-boot-project/spring-boot/src/test/resources/test.p12 and b/spring-boot-project/spring-boot/src/test/resources/test.p12 differ