Spring Cloud 入门——7.3 Config 远程配置中心-数据加密

24 篇文章 0 订阅
22 篇文章 3 订阅

代码信息

本篇文章涉及代码版本

组件版本
Spring Boot2.0.8.RELEASE
Spring CloudFinchley.SR1

本篇文章涉及应用

应用说明
base-eureka服务发现
base-config-service-encryption配置中心服务端-加密
base-config-client-encryption配置中心客户端使用-加密

数据明文

使用明文保存一些敏感的数据,很显然不是一个很好的方法,尤其是使用配置中心后,大量的配置被集中在一起,这个时候对配置信息进行加密则变得至关重要。

实现数据加密

首先我们需要生成一个Keystore

这部分内容并非springcloud config加密的关键,但是不算太麻烦就顺带说下。

这一段很多都和网络上内容类似,假如有说的不明白的,可以去网络上去再搜索下生成Keystore的方法。

  1. 首先,需要下载无线长度限制的jce。JDK 8对应的JCE地址为:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
  2. 然后将下载的内容解压至JDK所在的/jre/lib/security文件下。
  3. 后续,在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通常不区分大小写。
-keystorekeystore文件的存储位置,文件扩展名为".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,可以看到有如下返回

在这里插入图片描述

进行数据取回

我们将返回的内容复制后更新到配置中。

此时需要注意的

  1. 提醒配置中心词数据为加密后的数据需要在前部添加{cipher}内容。
  2. 使用properties类型的文件参数不需要其他处理,但是使用yml的配置文件,加密的数据除了{cipher}还需要使用单引号包裹’'

客户端获取数据

现在我们访问客户端的config/encrypt接口获取的数据正是加密前的数据

在这里插入图片描述


本篇文章并未贴出所有代码,涉及的源码下载地址:https://gitee.com/daifylearn/cloud-learn

ps.上述的所有项目都是可以成功运行的。但是在后期为了实现每个应用端口尽量不冲突会有些许调整,而后续某次作死调整结构和名称可能会导致部分项目无法运行o(╯□╰)o,如果发现请留言我进行修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大·风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值