diff --git a/spring-cloud-consul-config/src/test/java/org/springframework/cloud/consul/config/ConsulPropertySourceLocatorFilesTests.java b/spring-cloud-consul-config/src/test/java/org/springframework/cloud/consul/config/ConsulPropertySourceLocatorFilesTests.java index 02de441b..a40ac4bf 100644 --- a/spring-cloud-consul-config/src/test/java/org/springframework/cloud/consul/config/ConsulPropertySourceLocatorFilesTests.java +++ b/spring-cloud-consul-config/src/test/java/org/springframework/cloud/consul/config/ConsulPropertySourceLocatorFilesTests.java @@ -95,7 +95,9 @@ public class ConsulPropertySourceLocatorFilesTests { @After public void teardown() { this.client.deleteKVValues(PREFIX); - this.context.close(); + if (this.context != null) { + this.context.close(); + } } @Test diff --git a/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulAutoConfiguration.java b/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulAutoConfiguration.java index d8d178a2..3e6d2733 100644 --- a/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulAutoConfiguration.java +++ b/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulAutoConfiguration.java @@ -16,7 +16,10 @@ package org.springframework.cloud.consul; +import com.ecwid.consul.transport.TLSConfig; +import com.ecwid.consul.v1.ConsulClient; import org.aspectj.lang.annotation.Aspect; + import org.springframework.boot.actuate.autoconfigure.ConditionalOnEnabledHealthIndicator; import org.springframework.boot.actuate.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.actuate.endpoint.Endpoint; @@ -32,8 +35,6 @@ import org.springframework.retry.annotation.Retryable; import org.springframework.retry.interceptor.RetryInterceptorBuilder; import org.springframework.retry.interceptor.RetryOperationsInterceptor; -import com.ecwid.consul.v1.ConsulClient; - /** * @author Spencer Gibb */ @@ -51,6 +52,17 @@ public class ConsulAutoConfiguration { @Bean @ConditionalOnMissingBean public ConsulClient consulClient(ConsulProperties consulProperties) { + if (consulProperties.getTls() != null) { + ConsulProperties.TLSConfig tls = consulProperties.getTls(); + TLSConfig tlsConfig = new TLSConfig( + tls.getKeyStoreInstanceType(), + tls.getCertificatePath(), + tls.getCertificatePassword(), + tls.getKeyStorePath(), + tls.getKeyStorePassword() + ); + return new ConsulClient(consulProperties.getHost(), consulProperties.getPort(), tlsConfig); + } return new ConsulClient(consulProperties.getHost(), consulProperties.getPort()); } diff --git a/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulProperties.java b/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulProperties.java index 6c5f686e..3cfa9de7 100644 --- a/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulProperties.java +++ b/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulProperties.java @@ -18,6 +18,7 @@ package org.springframework.cloud.consul; import javax.validation.constraints.NotNull; +import com.ecwid.consul.transport.TLSConfig.KeyStoreInstanceType; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -40,4 +41,25 @@ public class ConsulProperties { /** Is spring cloud consul enabled */ private boolean enabled = true; + + /** configuration for TLS */ + private TLSConfig tls; + + @Data + public static class TLSConfig { + /** Type of key framework to use. */ + private KeyStoreInstanceType keyStoreInstanceType; + + /** Path to an external keystore */ + private String keyStorePath; + + /** Password to an external keystore */ + private String keyStorePassword; + + /**File path to the certificate. */ + private String certificatePath; + + /** Password to open the certificate. */ + private String certificatePassword; + } } diff --git a/spring-cloud-consul-core/src/test/java/org/springframework/cloud/consul/ConsulAutoConfigurationTests.java b/spring-cloud-consul-core/src/test/java/org/springframework/cloud/consul/ConsulAutoConfigurationTests.java new file mode 100644 index 00000000..fe226ba1 --- /dev/null +++ b/spring-cloud-consul-core/src/test/java/org/springframework/cloud/consul/ConsulAutoConfigurationTests.java @@ -0,0 +1,42 @@ +package org.springframework.cloud.consul; + +import com.ecwid.consul.transport.DefaultHttpsTransport; +import com.ecwid.consul.transport.HttpTransport; +import com.ecwid.consul.v1.ConsulClient; +import com.ecwid.consul.v1.ConsulRawClient; +import com.ecwid.consul.v1.catalog.CatalogConsulClient; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringRunner.class) +@SpringBootTest(properties = {"spring.cloud.consul.tls.key-store-instance-type=JKS", + "spring.cloud.consul.tls.key-store-path=src/test/resources/server.jks", + "spring.cloud.consul.tls.key-store-password=letmein", + "spring.cloud.consul.tls.certificate-path=src/test/resources/trustStore.jks", + "spring.cloud.consul.tls.certificate-password=change_me", }) +public class ConsulAutoConfigurationTests { + + @Autowired + private ConsulClient consulClient; + + @Test + public void tlsConfigured() { + CatalogConsulClient client = (CatalogConsulClient) ReflectionTestUtils.getField(consulClient, "catalogClient"); + ConsulRawClient rawClient = (ConsulRawClient) ReflectionTestUtils.getField(client, "rawClient"); + HttpTransport httpTransport = (HttpTransport) ReflectionTestUtils.getField(rawClient, "httpTransport"); + assertThat(httpTransport).isInstanceOf(DefaultHttpsTransport.class); + } + + @EnableAutoConfiguration + @SpringBootConfiguration + protected static class TestConfig {} +} diff --git a/spring-cloud-consul-core/src/test/resources/server.jks b/spring-cloud-consul-core/src/test/resources/server.jks new file mode 100644 index 00000000..560be5fe Binary files /dev/null and b/spring-cloud-consul-core/src/test/resources/server.jks differ diff --git a/spring-cloud-consul-core/src/test/resources/trustStore.jks b/spring-cloud-consul-core/src/test/resources/trustStore.jks new file mode 100644 index 00000000..9f599362 Binary files /dev/null and b/spring-cloud-consul-core/src/test/resources/trustStore.jks differ