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