Spring Cloud Config启用https

Spring Cloud Config启用https

前言

本篇主要整理spring cloud config如何开启https,以及微服务如何通过https去访问spring cloud config服务器上的配置文件。

项目工程

包含一个eurekaServer服务器,一个eurekaClient客户端,一个cloud config server配置中心。
Spring Cloud Config启用https_第1张图片

springcloudconfig配置中心开启https

和之前整理的文章一样,配置中心其实就是一个spring boot的工程,只要添加ssl证书以及配置证书的账号密码这些信息就可以了,这边就简单梳理下。

首先生成spring cloud config配置中心的证书configServer.keystore,关于证书生成,可以看一下之前的文章。

将证书放置到配置中心项目的resources目录下,并在配置文件中添加如下的配置:
Spring Cloud Config启用https_第2张图片

server:
  port: 8888
  ssl:
    enabled: true # 开始ssl认证
    key-alias: configServer # 证书别名
    key-store: classpath:configServer.keystore # 证书位置
    key-store-type: JKS # 秘钥库存储类型
    key-store-password: 123456 # 秘钥库口令

spring cloud config配置中心同时也作为一个eurekaClient,需要通过https的方式注册到eureka服务器上。

添加信任库trustStore.keystore文件到项目的resource目录,信任库中包含了eureka的证书
Spring Cloud Config启用https_第3张图片

在配置文件中设置信任库信息

server:
  port: 8888
  ssl:
    trust-store: classpath:trustStore.keystore # 信任库证书位置
    trust-store-type: JKS # 信任库秘钥存储类型
    trust-store-password: 123456 # 秘钥库口令

注入一个DiscoveryClientOptionalArgs的bean,同时设置其SSLContext的trustStore属性为设置的信任库的信息

/**
 * SSLContext对象 设置了信任库信息
 *
 * @author yuanzhihao
 * @since 2021/11/28
 */
@Configuration
public class SSLContextConfig {
    @Value("${server.ssl.trust-store}")
    private String trustStorePath;

    @Value("${server.ssl.trust-store-password}")
    private String trustStorePassword;

    @Bean
    public SSLContext sslContext() throws Exception {
        return SSLContextBuilder.
                create().
                loadTrustMaterial(ResourceUtils.getFile(trustStorePath), trustStorePassword.toCharArray()).
                build();
    }
}

// 通过https注册到eureka
@Bean
public DiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs(SSLContext sslContext) {
    DiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs = new DiscoveryClient.DiscoveryClientOptionalArgs();
    discoveryClientOptionalArgs.setSSLContext(sslContext);
    return discoveryClientOptionalArgs;
}

启动spring cloud config配置中心,发现configServer已经注册到了eureka服务器上:
Spring Cloud Config启用https_第4张图片

客户端通过https去读取spring cloud config配置中心的配置文件

客户端通过https去访问spring cloud config配置中心首选需要将配置中心的证书加到信任库文件中,具体如何导入证书可以参考我之前的博客。

将配置文件中spring.cloud.config.uri修改为https

spring:
  application:
    name: eureka-client1
  cloud:
    config:
      name: config # 指定读取配置文件的名称
      uri: https://localhost:8888 # 指定config server的地址
      profile: default # 指定配置文件版本 默认是default

之后需要重新覆盖一下客户端与配置中心之间调用使用的RestTemplate对象,一开始我没有覆盖,导致一直是调用错误。

这边具体参考了一篇博客和spring cloud config官方文档,参考链接我放在了最后~

具体操作如下:

首先,需要自己实现一个ConfigServicePropertySourceLocator配置类,我理解是覆盖spring cloud config默认的配置

/**
 * 自定义spring config server的配置类
 *
 * @author yuanzhihao
 * @since 2021/11/28
 */
@Configuration
public class CustomConfigServiceBootstrapConfiguration {
    // spring cloud config配置文件信息
    @Autowired
    private ConfigClientProperties clientProperties;

    @Value("${server.ssl.trust-store}")
    private String trustStorePath;

    @Value("${server.ssl.trust-store-password}")
    private String trustStorePassword;

    @Bean
    public ConfigServicePropertySourceLocator configServicePropertySourceLocator() throws Exception {
        ConfigServicePropertySourceLocator configServicePropertySourceLocator =  new ConfigServicePropertySourceLocator(clientProperties);
        // 自定义spring cloud config的restTemplate 加载配置中心的信任库信息
        SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(ResourceUtils.getFile(trustStorePath), trustStorePassword.toCharArray()).build();
        CloseableHttpClient build = HttpClients.custom().setSSLContext(sslContext).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE).build();
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(build);
        RestTemplate customRestTemplate = new RestTemplate(factory);
        configServicePropertySourceLocator.setRestTemplate(customRestTemplate);
        return configServicePropertySourceLocator;
    }
}

之后,需要在resources/META-INF目录下,创建一个名字为spring.factories的配置文件,添加如下配置来让spring加载我们自定义的配置类
Spring Cloud Config启用https_第5张图片

spring.factories

org.springframework.cloud.bootstrap.BootstrapConfiguration = com.yzh.client1.config.CustomConfigServiceBootstrapConfiguration

启动客户端发现已经正常运行了,也可以访问到spring cloud config配置中心的配置文件,spring cloud config启用https OK!
Spring Cloud Config启用https_第6张图片Spring Cloud Config启用https_第7张图片

参考以及源码

参考地址:

  1. https://cloud.spring.io/spring-cloud-config/reference/html/#custom-rest-template
  2. https://piotrminkowski.com/2019/12/03/secure-spring-cloud-config/

源码地址:https://github.com/yzh19961031/SpringCloudDemo

你可能感兴趣的:(SpringCloud,spring,cloud)