加密主要是针对于配置文件当中的配置,储存到数据库的时侯,加密成密文。之后Nacos展示下来的是明文。由于我们有时侯会在配置文件储存好多敏感信息,比如数据库联接形式,或则第三方储存系统的相关信息。出于此考虑,Nacos在2.1版本新发布了配置文件加密功能,根本不须要我们自己来实现,很轻松的才能实现配置内容AES加密功能。
要实现的疗效如下:这是要储存的配置
配置文件都是置于config_info表当中的,之后配置内容是置于content数组当中的,如果不配置加密,content数组上面都是储存的明文,添加加密后,上面储存的都是密文,并且在Nacos顾客端展示配置的时侯都是明文。
总的来说官网写的并不是很明晰,还有版本各类问题,致使自己也是踩了很多坑,再加上功能是Nacos刚实现的,网上资料可参考的少之又少linux命令手册,之后专门总结了这一篇文章,希望帮助到更多的人吧!
目录
一、前言
注意:这个是Nacos2.1以及以上版本刚发布的功能
2.1版本发布功能介绍:
官网介绍加密插件:
使用前提:假如你没有使用mysql持久化数据而是用的nacos内嵌数据库储存的数据,但是使用的不是2.1版本,而是用的2.0.4-2.1版本,这么想使用加密功能,首先须要把nacos/data文件删掉掉。使用内嵌数据库的我们都晓得,表根本都不是我们创建的,是程序手动创建的,老版本当中手动创建的表当中并没有encrypted_data_key这个数组。
Nacos默认提供AES的实现。用户也可以自定义加揭秘的实现方法。具体的实现在库房。
在Nacos服务端启动的时侯才会加载所有依赖的加揭秘算法,之后通过发布配置的dataId的前缀来进行匹配是否须要加揭秘和使用的加揭秘算法。
注意:想要使用加密是须要进行更改源码的,通过在源码上进行引入依赖,之后再重新打包。
重点有两个步骤,如下:
由于插件那种项目没有上传maven库房,那也就是我们想要使用他,就须要下载出来,之后打包到本地库房。之后再下载出来nacos源码,将插件依赖添加到nacos源码当中,再将nacos打包。之后我们通过自己打包的nacos,启动后会发觉他早已存在加密功能了。二、下载Nacos源码并启动
下载源码有两种形式,一种是通过gitclone直接克隆库房到本地,一种是直接下载zip源码包,之后解压。
方法一:克隆最新的代码:gitclone
方法二:下载zip:github源码地址:
下载好以后直接通过ider打开项目如下:
打开源码会发觉Nacos也是分了很多子模块,至于他的模块依赖关系,你们可以自行查看,本篇就不具体描述了。目前我们只须要关注那个是项目启动的入口。如右图所示的console模块,通过这个模块的springboot启动类,我们就可以启动Nacos项目了。
Nacos默认是集群启动方法,所以须要指定为单机启动(不然会启动报错的):
-Dnacos.standalone=true
配置数据库持久化
可以选择不配置,不配置就是使用的Nacos默认的derby内嵌数据库,并且为了看加密后的变化,我这儿选择使用了mysql
初始化脚本:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
启动后测试瞧瞧是否可以访问:
三、下载插件源码
下载插件源码:
关于这一步我被坑了好长时间,这个插件他依赖了Nacos源码当中的nacos-common模块,那我们就须要保证下载的nacos版本和插件依赖的版本是保持一致的手机linux操作系统,不然引入插件后启动nacos直接会启动失败的。
下载出来的时侯他引入的是2.1.0-BETA版本
而我的nacos下载出来的源码是2.1.1版本,所以一定要让他两个是一个版本,否则nacos引入插件的依赖后,才会出现jar包冲突,之后启动不上去。
改完以后直接mvninstall
四、Nacos源码当中添加依赖
这块虽然也有坑,官网说的${nacos-aes-encryption-plugin.version}可以获取插件的最新版本。压根源码当中没有定义${nacos-aes-encryption-plugin.version}这个变量。
所以我们须要在nacos的父工程依赖自动添加nacos-aes-encryption-plugin版本管理。
<properties>
<nacos-aes-encryption-plugin.version>1.0.0-SNAPSHOT</nacos-aes-encryption-plugin.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-aes-encryption-plugin</artifactId>
<version>${nacos-aes-encryption-plugin.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
之后在config模块下添加如下依赖:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-aes-encryption-plugin</artifactId>
</dependency>
五、打包测试使用
在nacos源码的目录下执行:
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
打好后,包路径:nacosdistributiontarget
打完包解压发觉后居然application.properties当中没有刚才加的mysql配置了。
我们刚才改的是console模块下的application.properties,启动运行发觉配置文件也生效了,而且打包没生效。虽然要想让打包生效须要改这个配置文件。
包括启动方法也是,默认是集群方法启动,可以改如下文件,改完以后直接打包,之后就不用再更改了。
剩下直接通过bin目录下的startup.cmd启动即可
他主要是借助dataId的命名来分辨是否要进行加密的。配置前缀使用cipher-[加密算法名称]-dataId来标示这个配置须要加密,系统会手动辨识并加密。诸如使用AES算法来揭秘配置:cipher-aes-application-dev.yml。
dataId没有加密的时侯命名规则是:
公式:${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
之后基于这一点,我们就可以自行测试使用了,这儿我直接创建了两个文件,一个是加密的,一个是不加密的:
储存在数据库如下:一个是明文,一个是加密之后的
六、项目当中也须要添加依赖
关于springboot当中怎样使用Nacos注册中心,本篇就不介绍了,若果不会使用的可以参考这篇文章:
由于我们对Nacos进行使用了加密,所以我们联接nacos配置中心的业务代码当中也须要添加加密插件,他得须要借助加密插件进行揭秘。
我使用的cloud-alibaba2021.0.1.0+springboot2.6.8,截至到现今可都是官网推荐的最稳定版本,并且我发觉一个问题,我nacos加密然后linux 文件加密传输,项目有时侯都起不来了,这是哪些缘由呢?
仔细看依赖会发觉问题linux 文件加密传输,cloud-alibaba2021.0.1.0他实际上引入的是nacos1.4.2版本,而我们用的Nacos是2.1.1版本。
所以我们须要矫正一下依赖版本,将client1.4.2排除,之后引入2.1.1版本,要不然版本不同会报错,出各类问题!
完整的依赖如下:
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<springboot.version>2.6.8</springboot.version>
<springcloud.alibaba.version>2021.0.1.0</springcloud.alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${springcloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-aes-encryption-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
我要读取这个加密的dev,配置文件如下:
spring:
profiles:
active: dev # 表示开发环境
application:
name: application
cloud:
nacos:
# 这个是服务注册
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
# 这个是配置中心相关的
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置,这块就是文件名字后缀,一定要注意
name: cipher-aes-application #平时都是用application.name当文件名,但是现在有了加密,我们不想让服务名加个cipher-aes不好看,所以通过这个来指定文件名,这样既可以读取到加密的配置文件,然后服务名称又保留了我们想要保留的名字
@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}