Nacos 中的配置文件如何實現加密傳輸
小伙伴們知道,Spring Cloud Config 很早就提供了配置文件的加解密功能,并且支持對稱加密和非對稱加密兩種不同的模式。Nacos 作為分布式配置中心+服務注冊中心的合體,在配置文件加密這塊一直差點意思,不過好在,如果你使用的 Nacos 版本大于 2.0.4 這個版本,那么現在也可以通過插件的方式來實現配置文件加密了。
1. 配置文件加密
松哥在之前的微服務視頻中講過,Spring Cloud Config 的對稱加密和非對稱加密,加密后的文件格式類似下面這樣:
name={cipher}密文
password={cipher}密文
可以看到,在 Spring Cloud Config 中,對配置文件的加密是針對字段一個一個加密的。
而 Nacos 中的加密,則是對整個配置文件的內容進行加密,這點和 Spring Cloud Config 不同。
Nacos 中是通過 SPI 的機制抽象出加密和解密的操作,Nacos 默認提供 AES 對稱加密的實現,不過用戶也可以自定義加解密的實現方式。
在 Nacos 服務端啟動的時候就會加載所有依賴的加解密算法,然后通過發(fā)布配置的 dataId 的前綴來進行匹配是否需要加解密和使用的加解密算法。
客戶端發(fā)布的配置會在客戶端通過 filter 完成加解密,也就是配置在傳輸過程中都是密文的,而控制臺發(fā)布的配置會在服務端進行處理。
換言之,用了 Nacos 的配置文件加密插件之后,我們在 Nacos 管理頁面上配置的配置文件,將會以加密的密文形式存儲在數據庫中,也會以密文的形式傳輸到客戶端,然后在客戶端自動完成解密操作。大致上就是這樣一個過程。接下來我們就來看看具體的用法。
2. 實踐
首先我們需要下載 nacos 源碼進行編譯,編譯完成之后,需要將之安裝到本地 Maven 倉庫(因為編譯加密插件需要用到 Nacos)。
首先 clone nacos 源碼,如下:
git clone https://github.com/alibaba/nacos.git
下載之后,個人建議用 IDEA 去編譯,操作方便一些(因為后續(xù)還有其他操作)。
所以我們先用 IDEA 打開項目,確認項目所需依賴均已下載完畢,然后點擊 install 按鈕,將項目編譯安裝到本地倉庫:
圖片
接下來 clone 配置文件加解密的插件,如下:
git clone https://github.com/nacos-group/nacos-plugin.git
也用 IDEA 打開這個插件項目。這個插件編譯要用到我們剛剛編譯安裝好的 Nacos,但是給的版本號不對,需要我們手動修改下,位置在 nacos-plugin/pom.xml,修改里邊 Nacos 的版本號,從 2.2.0-SNAPSHOT 改為 2.2.0-BETA(我剛剛編譯安裝的是這個版本,大家根據自己的實際情況選擇):
<alibaba-nacos.version>2.2.0-BETA</alibaba-nacos.version>
改完之后也執(zhí)行 install 操作,將所有的插件都安裝到本地倉庫:
圖片
接下來回到一開始的 Nacos 項目中,在 Nacos 項目中引入這個插件的依賴,建議在 config 模塊中引入,如下圖:
圖片
引入內容如下:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-aes-encryption-plugin</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
加了這個依賴之后,我們的 Nacos 就具備了配置文件加密功能了。
現在我再改一下 console/src/main/resources/application.properties 配置文件,讓 Nacos 將數據存入到本地數據庫中,如下:
### Count of DB:
db.num=1
spring.sql.init.platform=mysql
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&cnotallow=1000&socketTimeout=3000&autoRecnotallow=true&useUnicode=true&useSSL=false&serverTimeznotallow=UTC
db.user=root
db.password=123
配置完成后,本地提前準備好一個名為 nacos_config 的數據庫,并執(zhí)行 distribution/conf/mysql-schema.sql 腳本文件,將所需的表先創(chuàng)建出來。
接下來,為項目添加啟動參數,我們以單機而不是集群的方式來啟動 Nacos,如下:
圖片
上圖大家重點看兩個地方,一個是啟動類所處的位置,另外一個則是啟動參數。
好啦,現在我們就可以像啟動 Spring Boot 項目那樣啟動 Nacos 了。
3. 發(fā)布
如果我們想將項目打包發(fā)布的話,松哥建議大家先從 GitHub 上下載官方的壓縮包,官方的壓縮包里邊,有一個 target 目錄,這個目錄下有一個 nacos-server.jar 文件,這個就是 nacos 的啟動包了。對于這個官方的壓縮包,大家正常配置就行了。
然后,在 IDEA 中,對我們剛剛處理過的 nacos,重新打包,不過記得打包的時候設置一下環(huán)境,如下:
圖片
設置好環(huán)境之后,然后對項目重新進行打包。打包完成后,生成了新的 nacos-server.jar,如下:
圖片
用這個 jar 包替換掉官方壓縮包中的 jar,然后啟動 nacos 即可。
4. 訪問
啟動成功之后,我們就可以直接訪問 nacos 了,用法和平時用法都一樣,不同的是,在創(chuàng)建配置文件的時候,文件名有一個固定的前綴 cipher-aes-,有了這個前綴,這個配置文件就會自動加密,否則就不會加密。
例如我現在創(chuàng)建如下配置文件:
圖片
創(chuàng)建完成后,我們去數據庫中看一下這個配置文件:
圖片
可以看到,這個 content 字段已經是一個加密的字符串了(如果沒有我們沒有加密,則 content 字段保存的就是明文 name=javaboy)。
現在我們創(chuàng)建一個項目,來加載這個加密的配置文件。
創(chuàng)建項目時候,選擇 Nacos Configuration,如下:
圖片
創(chuàng)建好之后,記得手動加上剛剛的那個加密插件的依賴(解密的時候會用到)。
項目名稱記得設置為 cipher-aes-nacos:
# 應用名稱
spring.application.name=cipher-aes-nacos
# 應用服務 WEB 訪問端口
server.port=8080
其他都正常配置即可。