代码信息
本篇文章涉及代码版本
组件 | 版本 |
---|---|
Spring Boot | 2.0.8.RELEASE |
Spring Cloud | Finchley.SR1 |
本篇文章涉及应用
应用 | 说明 |
---|---|
base-eureka | 服务发现 |
base-config-service-encryption | 配置中心服务端-加密 |
base-config-client-encryption | 配置中心客户端使用-加密 |
数据明文
使用明文保存一些敏感的数据,很显然不是一个很好的方法,尤其是使用配置中心后,大量的配置被集中在一起,这个时候对配置信息进行加密则变得至关重要。
实现数据加密
首先我们需要生成一个Keystore
这部分内容并非springcloud config加密的关键,但是不算太麻烦就顺带说下。
这一段很多都和网络上内容类似,假如有说的不明白的,可以去网络上去再搜索下生成Keystore的方法。
- 首先,需要下载无线长度限制的jce。JDK 8对应的JCE地址为:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
- 然后将下载的内容解压至JDK所在的
/jre/lib/security
文件下。 - 后续,在JDK所在的
bin
文件夹下执行命令:
keytool -genkeypair -alias config-key -keyalg RSA –keystore D:\config-key.jks -validity 1830 -keysize 1024 -storepass 123456 -keypass key123456 -dname "CN=daify,OU=dailearn,O=dailearn,L=武汉市,ST=湖北省,C=CN"
简单的说下参数的意思
参数 | 含义 |
---|---|
-genkey | 表示要创建新的密钥 |
-alias | 别名,每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写。 |
-keystore | keystore文件的存储位置,文件扩展名为".keystore"。 |
-keyalg | 指定密钥的算法 (如 RSA DSA(如果不指定默认采用DSA))。 |
-validity | 指定有效期(天),默认90天。 |
-keysize | 指定密钥长度。 |
-storepass | 指定密钥库的访问密码(获取keystore信息所需的密码) |
-keypass | 指定别名条目的密码(私钥的密码) |
-dname | 指定证书拥有者信息 例如: “CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码”。 |
此时会生成一个config-key.jks
文件,稍后备用
实现服务端
添加依赖
和之前配置中心服务端相同不需要进行修改。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
需要注意的时候,后续我们把config-key.jks
文件放入resources文件夹下,为了防止此文件被maven过滤掉需要添加此配置
<build>
<finalName>config-key</finalName>
<resources>
<resource>
<!-- 防止JKS被Maven过掉 -->
<directory>src/main/resources</directory>
<filtering>false</filtering>
</resource>
</resources>
</build>
修改配置
bootstrap.yml的配置
encrypt:
key: config-key
key-store:
location: config-key.jks
password: 123456
alias: config-key
secret: key123456
bootstrap文件配置了config-key.jks
文件的相关内容,而实际中发现将此配置迁移至application
中会发现启动报错的情况。
application.yml的配置
spring:
application:
name: base-config-service-encryption
cloud:
config:
server:
git:
uri: https://gitee.com/daifylearn/cloud-config
search-paths: /config,/base-config-client,/base-config-client-encryption
encrypt:
enabled: true
server:
port: 8703
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
logging:
file: ${spring.application.name}.log
启动主类
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class ConfigServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServiceApplication.class, args);
}
}
测试
此时为了测试项目加密和解密是否完成我们可以访问此应用的/encrypt/status
接口
此时返回OK表示服务端配置完成了。
客户端
和之前的客户端内容相比,并没有任何修改
客户端测试接口
@RestController
@RequestMapping("config")
public class ConfigController {
@Value("${config.name}")
private String profile;
@Value("${config.encrypt}")
private String encrypt;
@GetMapping("/name")
public String getProfile() {
return this.profile;
}
@GetMapping("/encrypt")
public String getEncrypt() {
return this.encrypt;
}
}
测试
配置中心服务端启动的时候我们可以看到如下内容
2019-07-14 02:19:14.999 INFO 25704 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/encrypt],methods=[POST]}" onto public java.lang.String org.springframework.cloud.config.server.encryption.EncryptionController.encrypt(java.lang.String,org.springframework.http.MediaType)
2019-07-14 02:19:15.000 INFO 25704 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/decrypt],methods=[POST]}" onto public java.lang.String org.springframework.cloud.config.server.encryption.EncryptionController.decrypt(java.lang.String,org.springframework.http.MediaType)
现在服务端暴漏了几个加密和解密的接口
进行数据加密
现在我们想服务端的encrypt接口请求加密admin,可以看到有如下返回
进行数据取回
我们将返回的内容复制后更新到配置中。
此时需要注意的
- 提醒配置中心词数据为加密后的数据需要在前部添加
{cipher}
内容。 - 使用properties类型的文件参数不需要其他处理,但是使用yml的配置文件,加密的数据除了
{cipher}
还需要使用单引号包裹’'
客户端获取数据
现在我们访问客户端的config/encrypt
接口获取的数据正是加密前的数据
本篇文章并未贴出所有代码,涉及的源码下载地址:https://gitee.com/daifylearn/cloud-learn
ps.上述的所有项目都是可以成功运行的。但是在后期为了实现每个应用端口尽量不冲突会有些许调整,而后续某次作死调整结构和名称可能会导致部分项目无法运行o(╯□╰)o,如果发现请留言我进行修改。