Skip to content

Commit f7f103d

Browse files
henriqamaralsothawo
authored andcommitted
DATAES-673 Create a Ssl Rest Client using SslContext and HostnameVerifier
Original PR: #334
1 parent 38353e5 commit f7f103d

File tree

5 files changed

+77
-2
lines changed

5 files changed

+77
-2
lines changed

src/main/java/org/springframework/data/elasticsearch/client/ClientConfiguration.java

+19
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.List;
2222
import java.util.Optional;
2323

24+
import javax.net.ssl.HostnameVerifier;
2425
import javax.net.ssl.SSLContext;
2526

2627
import org.springframework.http.HttpHeaders;
@@ -31,6 +32,7 @@
3132
* @author Mark Paluch
3233
* @author Peter-Josef Meisch
3334
* @author Huw Ayling-Miller
35+
* @author Henrique Amaral
3436
* @since 3.2
3537
*/
3638
public interface ClientConfiguration {
@@ -119,6 +121,13 @@ static ClientConfiguration create(InetSocketAddress socketAddress) {
119121
*/
120122
Optional<SSLContext> getSslContext();
121123

124+
/**
125+
* Returns the {@link HostnameVerifier} to use. Can be {@link Optional#empty()} if unconfigured.
126+
*
127+
* @return the {@link HostnameVerifier} to use. Can be {@link Optional#empty()} if unconfigured.
128+
*/
129+
Optional<HostnameVerifier> getHostNameVerifier();
130+
122131
/**
123132
* Returns the {@link java.time.Duration connect timeout}.
124133
*
@@ -210,6 +219,16 @@ interface MaybeSecureClientConfigurationBuilder extends TerminalClientConfigurat
210219
* @return the {@link TerminalClientConfigurationBuilder}.
211220
*/
212221
TerminalClientConfigurationBuilder usingSsl(SSLContext sslContext);
222+
223+
/**
224+
* Connect via {@literal https} using the givens {@link SSLContext} and HostnameVerifier {@link HostnameVerifier} .<br />
225+
*
226+
* <strong>NOTE</strong> You need to leave out the protocol in
227+
* {@link ClientConfigurationBuilderWithRequiredEndpoint#connectedTo(String)}.
228+
*
229+
* @return the {@link TerminalClientConfigurationBuilder}.
230+
*/
231+
TerminalClientConfigurationBuilder usingSsl(SSLContext sslContext, HostnameVerifier hostnameVerifier);
213232
}
214233

215234
/**

src/main/java/org/springframework/data/elasticsearch/client/ClientConfigurationBuilder.java

+20-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.List;
2323
import java.util.stream.Collectors;
2424

25+
import javax.net.ssl.HostnameVerifier;
2526
import javax.net.ssl.SSLContext;
2627

2728
import org.springframework.data.elasticsearch.client.ClientConfiguration.ClientConfigurationBuilderWithRequiredEndpoint;
@@ -38,6 +39,7 @@
3839
* @author Mark Paluch
3940
* @author Peter-Josef Meisch
4041
* @author Huw Ayling-Miller
42+
* @author Henrique Amaral
4143
* @since 3.2
4244
*/
4345
class ClientConfigurationBuilder
@@ -47,6 +49,7 @@ class ClientConfigurationBuilder
4749
private HttpHeaders headers = HttpHeaders.EMPTY;
4850
private boolean useSsl;
4951
private @Nullable SSLContext sslContext;
52+
private @Nullable HostnameVerifier hostnameVerifier;
5053
private Duration connectTimeout = Duration.ofSeconds(10);
5154
private Duration soTimeout = Duration.ofSeconds(5);
5255
private String username;
@@ -105,6 +108,22 @@ public TerminalClientConfigurationBuilder usingSsl(SSLContext sslContext) {
105108
return this;
106109
}
107110

111+
/*
112+
* (non-Javadoc)
113+
* @see org.springframework.data.elasticsearch.client.ClientConfiguration.MaybeSecureClientConfigurationBuilder#usingSsl(javax.net.ssl.SSLContext, javax.net.ssl.HostnameVerifier)
114+
*/
115+
@Override
116+
public TerminalClientConfigurationBuilder usingSsl(SSLContext sslContext, HostnameVerifier hostnameVerifier) {
117+
118+
Assert.notNull(sslContext, "SSL Context must not be null");
119+
Assert.notNull(hostnameVerifier, "Host Name Verifier must not be null");
120+
121+
this.useSsl = true;
122+
this.sslContext = sslContext;
123+
this.hostnameVerifier = hostnameVerifier;
124+
return this;
125+
}
126+
108127
/*
109128
* (non-Javadoc)
110129
* @see org.springframework.data.elasticsearch.client.ClientConfiguration.TerminalClientConfigurationBuilder#withDefaultHeaders(org.springframework.http.HttpHeaders)
@@ -181,7 +200,7 @@ public ClientConfiguration build() {
181200
}
182201

183202
return new DefaultClientConfiguration(this.hosts, this.headers, this.useSsl, this.sslContext, this.soTimeout,
184-
this.connectTimeout, this.pathPrefix);
203+
this.connectTimeout, this.pathPrefix, this.hostnameVerifier);
185204
}
186205

187206
private static InetSocketAddress parse(String hostAndPort) {

src/main/java/org/springframework/data/elasticsearch/client/DefaultClientConfiguration.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.List;
2323
import java.util.Optional;
2424

25+
import javax.net.ssl.HostnameVerifier;
2526
import javax.net.ssl.SSLContext;
2627

2728
import org.springframework.http.HttpHeaders;
@@ -44,9 +45,10 @@ class DefaultClientConfiguration implements ClientConfiguration {
4445
private final Duration soTimeout;
4546
private final Duration connectTimeout;
4647
private final String pathPrefix;
48+
private final @Nullable HostnameVerifier hostnameVerifier;
4749

4850
DefaultClientConfiguration(List<InetSocketAddress> hosts, HttpHeaders headers, boolean useSsl,
49-
@Nullable SSLContext sslContext, Duration soTimeout, Duration connectTimeout, @Nullable String pathPrefix) {
51+
@Nullable SSLContext sslContext, Duration soTimeout, Duration connectTimeout, @Nullable String pathPrefix, @Nullable HostnameVerifier hostnameVerifier) {
5052

5153
this.hosts = Collections.unmodifiableList(new ArrayList<>(hosts));
5254
this.headers = new HttpHeaders(headers);
@@ -55,6 +57,7 @@ class DefaultClientConfiguration implements ClientConfiguration {
5557
this.soTimeout = soTimeout;
5658
this.connectTimeout = connectTimeout;
5759
this.pathPrefix = pathPrefix;
60+
this.hostnameVerifier = hostnameVerifier;
5861
}
5962

6063
/*
@@ -93,6 +96,15 @@ public Optional<SSLContext> getSslContext() {
9396
return Optional.ofNullable(this.sslContext);
9497
}
9598

99+
/*
100+
* (non-Javadoc)
101+
* @see org.springframework.data.elasticsearch.client.ClientConfiguration#getHostNameVerifier()
102+
*/
103+
@Override
104+
public Optional<HostnameVerifier> getHostNameVerifier() {
105+
return Optional.ofNullable(this.hostnameVerifier);
106+
}
107+
96108
/*
97109
* (non-Javadoc)
98110
* @see org.springframework.data.elasticsearch.client.ClientConfiguration#getConnectTimeout()

src/main/java/org/springframework/data/elasticsearch/client/RestClients.java

+4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.Optional;
2525
import java.util.stream.Collectors;
2626

27+
import javax.net.ssl.HostnameVerifier;
2728
import javax.net.ssl.SSLContext;
2829

2930
import org.apache.http.Header;
@@ -53,6 +54,7 @@
5354
* @author Christoph Strobl
5455
* @author Mark Paluch
5556
* @author Huw Ayling-Miller
57+
* @author Henrique Amaral
5658
* @since 3.2
5759
*/
5860
public final class RestClients {
@@ -93,7 +95,9 @@ public static ElasticsearchRestClient create(ClientConfiguration clientConfigura
9395
builder.setHttpClientConfigCallback(clientBuilder -> {
9496

9597
Optional<SSLContext> sslContext = clientConfiguration.getSslContext();
98+
Optional<HostnameVerifier> hostNameVerifier = clientConfiguration.getHostNameVerifier();
9699
sslContext.ifPresent(clientBuilder::setSSLContext);
100+
hostNameVerifier.ifPresent(clientBuilder::setSSLHostnameVerifier);
97101

98102
if (ClientLogger.isEnabled()) {
99103

src/test/java/org/springframework/data/elasticsearch/client/ClientConfigurationUnitTests.java

+21
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import javax.net.ssl.SSLContext;
2525

26+
import org.apache.http.conn.ssl.NoopHostnameVerifier;
2627
import org.junit.Test;
2728
import org.springframework.http.HttpHeaders;
2829

@@ -32,6 +33,7 @@
3233
* @author Mark Paluch
3334
* @author Peter-Josef Meisch
3435
* @author Huw Ayling-Miller
36+
* @author Henrique Amaral
3537
*/
3638
public class ClientConfigurationUnitTests {
3739

@@ -120,6 +122,25 @@ public void shouldAddBasicAuthenticationHeaderAndKeepHeaders() {
120122
assertThat(defaultHeaders.get(HttpHeaders.AUTHORIZATION)).isNull();
121123
}
122124

125+
@Test // DATAES-673
126+
public void shouldCreateSslConfigurationWithHostnameVerifier() {
127+
128+
SSLContext sslContext = mock(SSLContext.class);
129+
130+
ClientConfiguration clientConfiguration = ClientConfiguration.builder() //
131+
.connectedTo("foo", "bar") //
132+
.usingSsl(sslContext, NoopHostnameVerifier.INSTANCE) //
133+
.build();
134+
135+
assertThat(clientConfiguration.getEndpoints()).containsOnly(InetSocketAddress.createUnresolved("foo", 9200),
136+
InetSocketAddress.createUnresolved("bar", 9200));
137+
assertThat(clientConfiguration.useSsl()).isTrue();
138+
assertThat(clientConfiguration.getSslContext()).contains(sslContext);
139+
assertThat(clientConfiguration.getConnectTimeout()).isEqualTo(Duration.ofSeconds(10));
140+
assertThat(clientConfiguration.getSocketTimeout()).isEqualTo(Duration.ofSeconds(5));
141+
assertThat(clientConfiguration.getHostNameVerifier()).contains(NoopHostnameVerifier.INSTANCE);
142+
}
143+
123144
private static String buildBasicAuth(String username, String password) {
124145

125146
HttpHeaders headers = new HttpHeaders();

0 commit comments

Comments
 (0)