本篇主要整理spring cloud config如何开启https,以及微服务如何通过https去访问spring cloud config服务器上的配置文件。
包含一个eurekaServer服务器,一个eurekaClient客户端,一个cloud config server配置中心。
和之前整理的文章一样,配置中心其实就是一个spring boot的工程,只要添加ssl证书以及配置证书的账号密码这些信息就可以了,这边就简单梳理下。
首先生成spring cloud config配置中心的证书configServer.keystore,关于证书生成,可以看一下之前的文章。
将证书放置到配置中心项目的resources目录下,并在配置文件中添加如下的配置:
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的证书
在配置文件中设置信任库信息
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服务器上:
客户端通过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.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration = com.yzh.client1.config.CustomConfigServiceBootstrapConfiguration
启动客户端发现已经正常运行了,也可以访问到spring cloud config配置中心的配置文件,spring cloud config启用https OK!
参考地址:
源码地址:https://github.com/yzh19961031/SpringCloudDemo