Add SSL bundle support to Elasticsearch auto-configuration

Update Elasticsearch RestClient auto-configuration so that an SSL
can be configured via an SSL bundle.

Closes gh-35155
This commit is contained in:
Phillip Webb
2023-04-25 17:18:00 -07:00
parent e9a85b91a8
commit 423c60acfa
4 changed files with 86 additions and 6 deletions

View File

@@ -17,6 +17,7 @@
package org.springframework.boot.autoconfigure.elasticsearch;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpHost;
@@ -24,7 +25,9 @@ import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.nio.conn.SchemeIOSessionStrategy;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.elasticsearch.client.Node;
import org.elasticsearch.client.RestClient;
@@ -35,10 +38,12 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchConnectionDetails.Node.Protocol;
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientConfigurations.PropertiesElasticsearchConnectionDetails;
import org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration;
import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.util.ReflectionTestUtils;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.then;
@@ -57,8 +62,8 @@ import static org.mockito.Mockito.mock;
*/
class ElasticsearchRestClientAutoConfigurationTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(ElasticsearchRestClientAutoConfiguration.class));
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withConfiguration(
AutoConfigurations.of(ElasticsearchRestClientAutoConfiguration.class, SslAutoConfiguration.class));
@Test
void configureShouldCreateRestClientBuilderAndRestClient() {
@@ -282,6 +287,32 @@ class ElasticsearchRestClientAutoConfigurationTests {
});
}
@Test
@SuppressWarnings("unchecked")
void configureWithSslBundle() {
List<String> properties = new ArrayList<>();
properties.add("spring.elasticsearch.restclient.ssl.bundle=mybundle");
properties.add("spring.ssl.bundle.jks.mybundle.truststore.location=classpath:test.jks");
properties.add("spring.ssl.bundle.jks.mybundle.options.ciphers=DESede");
properties.add("spring.ssl.bundle.jks.mybundle.options.enabled-protocols=TLSv1.3");
this.contextRunner.withPropertyValues(properties.toArray(String[]::new)).run((context) -> {
assertThat(context).hasSingleBean(RestClient.class);
RestClient restClient = context.getBean(RestClient.class);
Object client = ReflectionTestUtils.getField(restClient, "client");
Object connmgr = ReflectionTestUtils.getField(client, "connmgr");
Registry<SchemeIOSessionStrategy> registry = (Registry<SchemeIOSessionStrategy>) ReflectionTestUtils
.getField(connmgr, "ioSessionFactoryRegistry");
SchemeIOSessionStrategy strategy = registry.lookup("https");
assertThat(strategy).extracting("sslContext").isNotNull();
assertThat(strategy).extracting("supportedCipherSuites")
.asInstanceOf(InstanceOfAssertFactories.ARRAY)
.containsExactly("DESede");
assertThat(strategy).extracting("supportedProtocols")
.asInstanceOf(InstanceOfAssertFactories.ARRAY)
.containsExactly("TLSv1.3");
});
}
@Configuration(proxyBeanMethods = false)
static class ConnectionDetailsConfiguration {