• 【Nacos配置中心】对配置文件内容进行加密


    加密主要是针对于配置文件当中的配置,存储到数据库的时候,加密成密文。然后Nacos展示出来的是明文。因为我们有时候会在配置文件存储很多敏感信息,例如数据库连接方式,或者第三方存储系统的相关信息。出于此考虑,Nacos在2.1版本新发布了配置文件加密功能,根本不需要我们自己来实现,很轻松的就能实现 配置内容AES加密 功能。

    要实现的效果如下:这是要存储的配置

    在这里插入图片描述

    配置文件都是放在config_info表当中的,然后配置内容是放在content字段当中的,假如不配置加密,content字段里面都是存放的明文,添加加密后,里面存储的都是密文,但是在Nacos客户端展示配置的时候都是明文。

    在这里插入图片描述

    总的来说官网写的并不是很明确,还有版本各种问题,导致自己也是踩了好多坑,再加上功能是Nacos刚实现的,网上资料可参考的少之又少,然后专门总结了这一篇文章,希望帮助到更多的人吧!

    一、前言

    注意:这个是Nacos2.1以及以上版本刚发布的功能

    2.1版本发布功能介绍:https://nacos.io/zh-cn/blog/2.1.0-release.html

    官网介绍加密插件:https://nacos.io/zh-cn/docs/config-encryption.html

    使用前提:如果你没有使用mysql持久化数据而是用的nacos内嵌数据库存储的数据,并且使用的不是2.1版本,而是用的2.0.4 - 2.1 版本,那么想使用加密功能,首先需要把nacos/data文件删除掉。使用内嵌数据库的我们都知道,表根本都不是我们创建的,是程序自动创建的,老版本当中自动创建的表当中并没有encrypted_data_key这个字段。

    在这里插入图片描述

    Nacos 默认提供 AES 的实现。用户也可以自定义加解密的实现方式。具体的实现在 https://github.com/nacos-group/nacos-plugin 仓库。

    在 Nacos 服务端启动的时候就会加载所有依赖的加解密算法,然后通过发布配置的 dataId 的前缀来进行匹配是否需要加解密和使用的加解密算法。

    注意:想要使用加密是需要进行修改源码的,通过在源码上进行引入依赖,然后再重新打包。

    在这里插入图片描述

    重点有两个步骤,如下:

    1. 因为插件那个项目没有上传maven仓库,那也就是我们想要使用他,就需要下载下来,然后打包到本地仓库。
    2. 然后再下载下来nacos源码,将插件依赖添加到nacos源码当中,再将nacos打包。
    3. 然后我们通过自己打包的nacos,启动后会发现他已经存在加密功能了。

    二、下载Nacos源码并启动

    下载源码有两种方式,一种是通过git clone直接克隆仓库到本地,一种是直接下载zip源码包,然后解压。

    方式一:克隆最新的代码git clone https://github.com/alibaba/nacos.git

    方式二:下载zip:github源码地址:https://github.com/alibaba/nacos

    在这里插入图片描述

    下载好之后直接通过ider打开项目如下:

    打开源码会发现Nacos也是分了好多子模块,至于他的模块依赖关系,大家可以自行查看,本篇就不具体描述了。目前我们只需要关注哪个是项目启动的入口。如下图所示的console模块,通过这个模块的springboot启动类,我们就可以启动Nacos项目了。

    在这里插入图片描述

    Nacos默认是集群启动方式,所以需要指定为单机启动(不然会启动报错的):
    -Dnacos.standalone=true

    在这里插入图片描述

    配置数据库持久化

    可以选择不配置,不配置就是使用的Nacos默认的derby内嵌数据库,但是为了看加密后的变化,我这里选择使用了mysql

    初始化脚本:https://github.com/alibaba/nacos/blob/master/config/src/main/resources/META-INF/nacos-db.sql

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    启动后测试看看是否可以访问:

    在这里插入图片描述

    三、下载插件源码

    下载插件源码:https://github.com/nacos-group/nacos-plugin

    关于这一步我被坑了好长时间,这个插件他依赖了Nacos源码当中的nacos-common模块,那我们就需要保证下载的nacos版本和插件依赖的版本是保持一致的,不然引入插件后启动nacos直接会启动失败的。

    在这里插入图片描述

    下载下来的时候他引入的是2.1.0-BETA版本

    在这里插入图片描述

    而我的nacos下载下来的源码是2.1.1版本,所以一定要让他两个是一个版本,否则nacos引入插件的依赖后,就会出现jar包冲突,然后启动不起来。

    在这里插入图片描述

    改完之后直接mvn install

    四、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-SNAPSHOTnacos-aes-encryption-plugin.version>
    properties>
    
    <dependencyManagement>
    	<dependencies>
    		<dependency>
    			<groupId>com.alibaba.nacosgroupId>
    			<artifactId>nacos-aes-encryption-pluginartifactId>
    			<version>${nacos-aes-encryption-plugin.version}version>
    		dependency>
       dependencies>
    dependencyManagement>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    然后在config模块下添加如下依赖:

    <dependency>
        <groupId>com.alibaba.nacosgroupId>
        <artifactId>nacos-aes-encryption-pluginartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    五、打包测试使用

    在nacos源码的目录下执行:

    mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
    
    • 1

    打好后,包路径:nacos\distribution\target

    在这里插入图片描述

    打完包解压发现后竟然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}
    
    • 1

    然后基于这一点,我们就可以自行测试使用了,这里我直接创建了两个文件,一个是加密的,一个是不加密的:

    在这里插入图片描述

    存储在数据库如下:一个是明文,一个是加密过后的

    在这里插入图片描述

    六、项目当中也需要添加依赖

    关于springboot当中如何使用Nacos注册中心,本篇就不介绍了,如果不会使用的可以参考这篇文章:https://blog.csdn.net/weixin_43888891/article/details/126680819?spm=1001.2014.3001.5501

    因为我们对Nacos进行使用了加密,所以我们连接nacos配置中心的业务代码当中也需要添加加密插件,他得需要依靠加密插件进行解密

    我使用的cloud-alibaba 2021.0.1.0+ springboot2.6.8,截止到现在可都是官网推荐的最稳定版本,但是我发现一个问题,我nacos加密之后,项目有时候都起不来了,这是什么原因呢?

    在这里插入图片描述

    仔细看依赖会发现问题,cloud-alibaba 2021.0.1.0他实际上引入的是nacos1.4.2版本,而我们用的Nacos是2.1.1版本。

    在这里插入图片描述

    所以我们需要矫正一下依赖版本,将client1.4.2排除,然后引入2.1.1版本,要不然版本不同会报错,出各种问题!

    完整的依赖如下:

    <properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <springboot.version>2.6.8springboot.version>
        <springcloud.alibaba.version>2021.0.1.0springcloud.alibaba.version>
    properties>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
               <groupId>org.springframework.bootgroupId>
               <artifactId>spring-boot-dependenciesartifactId>
               <version>${springboot.version}version>
               <type>pomtype>
               <scope>importscope>
           dependency>
            <dependency>
               <groupId>com.alibaba.cloudgroupId>
               <artifactId>spring-cloud-alibaba-dependenciesartifactId>
               <version>${springcloud.alibaba.version}version>
               <type>pomtype>
               <scope>importscope>
            dependency>
       dependencies>        
    dependencyManagement>
    
    <dependencies>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacosgroupId>
                    <artifactId>nacos-clientartifactId>
                exclusion>
            exclusions>
        dependency>
        <dependency>
            <groupId>com.alibaba.nacosgroupId>
            <artifactId>nacos-clientartifactId>
            <version>2.1.1version>
        dependency>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-bootstrapartifactId>
        dependency>
        
        <dependency>
            <groupId>com.alibaba.nacosgroupId>
            <artifactId>nacos-aes-encryption-pluginartifactId>
            <version>1.0.0-SNAPSHOTversion>
        dependency>
    dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    我要读取这个加密的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不好看,所以通过这个来指定文件名,这样既可以读取到加密的配置文件,然后服务名称又保留了我们想要保留的名字
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    @RestController
    @RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
    public class ConfigClientController {
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/config/info")
        public String getConfigInfo() {
            return configInfo;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

  • 相关阅读:
    基于kubeasz部署高可用k8s集群
    react native app开发环境搭建
    红帽认证笔记2
    Github流出高质量高并发手册,看完面试手稳心不慌,吊打敢于提问高并发的面试官
    安装第三方包报错 error: Microsoft Visual C++ 14.0 or greater is required——解决办法
    单片机stm32智能鱼缸
    Linux环境变量
    交互设计主要做什么?新手入门必读
    企业简化客户服务的5种方法
    混合动力电动车优化调度与建模(发动机,电机,电池组等组件建模)(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/weixin_43888891/article/details/126783468