Spring Cloud構建微服務架構:分佈式配置中心

最近正好想發一篇關於配置中心加密的細節內容,結果發現基礎的加密解密竟然漏了,因此在這個入門系列中補充一下。後面再更新一下,使用配置中心的一些經驗和教訓。java

在微服務架構中,咱們一般都會採用DevOps的組織方式來下降因團隊間溝通形成的巨大成本,以加速微服務應用的交付能力。這就使得本來由運維團隊控制的線上信息將交由微服務所屬組織的成員自行維護,其中將會包括大量的敏感信息,好比:數據庫的帳戶與密碼等。很顯然,若是咱們直接將敏感信息以明文的方式存儲於微服務應用的配置文件中是很是危險的。針對這個問題,Spring Cloud Config提供了對屬性進行加密解密的功能,以保護配置文件中的信息安全。好比下面的例子:spring

spring.datasource.username=didi數據庫

spring.datasource.password={cipher}dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b安全

在Spring Cloud Config中經過在屬性值前使用 {cipher}前綴來標註該內容是一個加密值,當微服務客戶端來加載配置時,配置中心會自動的爲帶有 {cipher}前綴的值進行解密。經過該機制的實現,運維團隊就能夠放心的將線上信息的加密資源給到微服務團隊,而不用擔憂這些敏感信息遭到泄露了。下面咱們來具體介紹如何在配置中心使用該項功能。架構

使用前提運維

在使用Spring Cloud Config的加密解密功能時,有一個必要的前提須要咱們注意。爲了啓用該功能,咱們須要在配置中心的運行環境中安裝不限長度的JCE版本(Unlimited Strength Java Cryptography Extension)。雖然,JCE功能在JRE中自帶,可是默認使用的是有長度限制的版本。咱們能夠從Oracle的官方網站中下載到它,它是一個壓縮包,解壓後能夠看到下面三個文件:curl

README.txt分佈式

local_policy.jar微服務

US_export_policy.jar工具

咱們須要將 local_policy.jar和 US_export_policy.jar兩個文件複製到 $JAVA_HOME/jre/lib/security目錄下,覆蓋原來的默認內容。到這裏,加密解密的準備工做就完成了。

相關端點

在完成了JCE的安裝後,能夠嘗試啓動配置中心。在控制檯中,將會輸出了一些配置中心特有的端點,主要包括:

  • /encrypt/status:查看加密功能狀態的端點

  • /key:查看密鑰的端點

  • /encrypt:對請求的body內容進行加密的端點

  • /decrypt:對請求的body內容進行解密的端點

能夠嘗試經過GET請求訪問 /encrypt/status端點,咱們將獲得以下內容:

{

 "description": "No key was installed for encryption service",

 "status": "NO_KEY"

}

該返回說明當前配置中心的加密功能還不能使用,由於沒有爲加密服務配置對應的密鑰。

配置密鑰

咱們能夠經過 encrypt.key屬性在配置文件中直接指定密鑰信息(對稱性密鑰),好比:

encrypt.key=didispace

加入上述配置信息後,重啓配置中心,再訪問 /encrypt/status端點,咱們將獲得以下內容:

{

 "status": "OK"

}

此時,咱們配置中心的加密解密功能就已經可使用了,不妨嘗試訪問一下 /encrypt和 /decrypt端點來進行加密和解密的功能。注意,這兩個端點都是POST請求,加密和解密信息須要經過請求體來發送。好比,以 curl命令爲例,咱們能夠經過下面的方式調用加密與解密端點:

$ curl localhost:7001/encrypt -d didispace

3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7

 

$ curl localhost:7001/decrypt -d  3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7

didispace

這裏,咱們經過配置 encrypt.key參數來指定密鑰的實現方式採用了對稱性加密。這種方式實現比較簡單,只須要配置一個參數便可。另外,咱們也可使用環境變量 ENCRYPT_KEY來進行配置,讓密鑰信息外部化存儲。

非對稱加密

Spring Cloud Config的配置中心不只可使用對稱性加密,也可使用非對稱性加密(好比:RSA密鑰對)。雖然非對稱性加密的密鑰生成與配置相對複雜一些,可是它具備更高的安全性。下面,咱們來具體介紹一下如何使用非對稱加密。

首先,咱們須要經過 keytool工具來生成密鑰對。 keytool是JDK中的一個密鑰和證書管理工具。它使用戶可以管理本身的公鑰/私鑰對及相關證書,用於(經過數字簽名)自我認證(用戶向別的用戶/服務認證本身)或數據完整性以及認證服務。在JDK 1.4之後的版本中都包含了這一工具,它的位置在: %JAVA_HOME%\bin\keytool.exe

生成密鑰的具體命令以下:

$ keytool -genkeypair -alias config-server -keyalg RSA -keystore config-server.keystore

輸入密鑰庫口令:

再次輸入新口令:

您的名字與姓氏是什麼?

 [Unknown]:  zhaiyongchao

您的組織單位名稱是什麼?

 [Unknown]:  company

您的組織名稱是什麼?

 [Unknown]:  organization

您所在的城市或區域名稱是什麼?

 [Unknown]:  city

您所在的省/市/自治區名稱是什麼?

 [Unknown]:  province

該單位的雙字母國家/地區代碼是什麼?

 [Unknown]:  china

CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china是否正確?

 [否]:  y

 

輸入 <config-server> 的密鑰口令

       (若是和密鑰庫口令相同, 按回車):

再次輸入新口令:

另外,若是咱們不想逐步的輸入那些提示信息,可使用 -dname來直接指定,而密鑰庫口令與密鑰口令可以使用 -storepass和 -keypass來直接指定。因此,咱們能夠經過下面的命令直接建立出與上述命令同樣的密鑰庫:

$ keytool -genkeypair -alias config-server -keyalg RSA \

 -dname "CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china" \

 -keypass 222222 \

 -keystore config-server.keystore \

 -storepass 111111 \

默認狀況下,上述命令建立的密鑰只有90天有效期。若是咱們想要調整它的有效期,能夠經過增長 -validity參數來實現,好比咱們能夠經過下面的命令,讓密鑰的有效期延長到一年:

$ keytool -genkeypair -alias config-server -keyalg RSA \

 -dname "CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china" \

 -keypass 222222 \

 -keystore config-server.keystore \

 -storepass 111111 \

 -validity 365 \

上述的三種命令生成方式,最終都會在命令的當前執行目錄下生成一個 config-server.keystore文件。下面,咱們須要將它保存在配置中心的文件系統中的某個位置,好比放在當前的用戶目錄下,而後在配置中心中加入相關的配置信息:

encrypt.key-store.location=file://${user.home}/config-server.keystore

encrypt.key-store.alias=config-server

encrypt.key-store.password=111111

encrypt.key-store.secret=222222

若是咱們將 config-server.keystore放在配置中心的 src/main/resource目錄下,也能夠直接這樣配置: encrypt.key-store.location=config-server.keystore。另外,非對稱加密的配置信息也能夠經過環境變量的方式進行配置,它們對應的具體變量名以下:

ENCRYPT_KEY_STORE_LOCATION

ENCRYPT_KEY_STORE_ALIAS

ENCRYPT_KEY_STORE_PASSWORD

ENCRYPT_KEY_STORE_SECRET

經過環境變量來配置密鑰庫相關信息能夠得到更好的安全性,因此咱們能夠將敏感的口令信息存儲在配置中心的環境變量中是一種不錯的選擇

歡迎學Java和大數據的朋友們加入java架構交流: 855835163

加羣連接:https://jq.qq.com/?_wv=1027&k=5dPqXGI

羣內提供免費的架構資料還有:Java工程化、高性能及分佈式、高性能、深刻淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的免費直播講解 能夠進來一塊兒學習交流哦

相關文章
相關標籤/搜索