本篇文章爲系列文章,未讀前幾集的同窗請猛戳這裏:html
本篇文章講解 Config 如何實現配置中心加解密,配置中心用戶安全認證。java
考慮這樣一個問題:全部的配置文件都存儲在 Git 遠程倉庫,配置文件中的一些信息又是比較敏感的。因此,咱們須要對這些敏感信息進行加密處理。主要的加密方法分爲兩種:一種是共享密鑰加密(對稱密鑰加密),一種是公開密鑰加密(非對稱密鑰加密)。git
對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是一樣的密鑰(secret key)。web
點擊連接觀看:檢查加密環境視頻(獲取更多請關注公衆號「哈嘍沃德先生」)算法
訪問 Config Server:http://localhost:8888/encrypt/statusspring
檢查結果若是是:{"description":"No key was installed for encryption service","status":"NO_KEY"}
說明沒有爲加密服務安裝密鑰,也說明你使用的是較低的 JDK 版本。shell
比較簡單的解決辦法:更換高版本 JDK,好比使用最新版的 LTS 版本 JDK-11.0.6。bootstrap
複雜的解決辦法:從 Oracle 官網下載對應 JCE,下載連接:https://www.oracle.com/java/t...segmentfault
下圖紅色框中內容已經足夠說明緣由:JDK 9 以及更高版本已附帶策略文件,並在默認狀況下啓用。瀏覽器
若是你的當前環境必須使用低版本 JDK,那麼請下載對應 JCE 壓縮包,下載解壓後把 local_policy.jar
和 US_export_policy.jar
文件安裝到須要安裝 JCE 機器上的 JDK 或 JRE 的 security
目錄下便可。
檢查結果若是是:{"description":"The encryption algorithm is not strong enough","status":"INVALID"}
說明服務端未配置加密。
Config Server 建立配置文件,注意必須叫 bootstrap.yml
,配置密鑰信息便可。
# 密鑰 encrypt: key: example
重啓 Config Server 訪問:http://localhost:8888/encrypt/status 結果以下:
點擊連接觀看:對稱加解密視頻(獲取更多請關注公衆號「哈嘍沃德先生」)
使用 curl
命令訪問 /encrypt
端點對屬性值 root 進行加密。反向操做 /decrypt
可解密。
curl http://localhost:8888/encrypt -d root
加密結果:bfb5cf8d7cab63e4b770b76d4e96c3a57d40f7c9df13612cb3134e2f7ed26123
解密
把加密後的數據更新到 Git 遠程倉庫的配置文件中。值得注意的是須要在加密結果前添加 {cipher}
串,若是遠程屬性源包含加密的內容(以開頭的值{cipher}
),則將其解密,而後再經過HTTP發送給客戶端。
Config Client 控制層添加獲取配置信息代碼。
package com.example.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RefreshScope @RestController public class ConfigController { @Value("${name}") private String name; @Value("${password}") private String password; @GetMapping("/name") public String getName() { return name; } @GetMapping("/password") public String getPassword() { return password; } }
修改 Config Client 配置文件,重啓測試。
spring: cloud: config: name: order-service # 配置文件名稱,對應 git 倉庫中配置文件前半部分 label: master # git 分支 profile: prod # 指定環境 discovery: enabled: true # 開啓 service-id: config-server # 指定配置中心服務端的 service-id # 度量指標監控與健康檢查 management: endpoints: web: base-path: /actuator # 訪問端點根路徑,默認爲 /actuator exposure: include: '*' # 須要開啓的端點,這裏主要用到的是 refresh 這個端點 #exclude: # 不須要開啓的端點
訪問:http://localhost:9091/password 返回解密後的結果。
對稱加密算法在加密和解密時使用的是同一個密鑰。只要拿到密鑰,任何人都能破解。
非對稱加密算法須要兩個密鑰來進行加密和解密,這兩個密鑰分別是公開密鑰(public key 簡稱公鑰)和私有密鑰(private key 簡稱私鑰)。在傳輸過程當中,即便攻擊者截獲了傳輸的密文,並獲得了公鑰,也沒法破解密文,由於使用專用密鑰才能破解密文。
圖片取自圖解HTTP一書。
Keytool 用來管理私鑰倉庫(keystore)和與之相關的X.509證書鏈(用以驗證與私鑰對應的公鑰),也能夠用來管理其餘信任實體。
默認你們都配置了 Java 的環境變量,打開 CMD 窗口運行如下命令。
# 生成名爲 config.keystore 的 keystore 文件,別名爲 config,加密算法類型使用 RSA,密鑰庫口令和密鑰口令均爲:config keytool -genkeypair -keystore config.keystore -alias config -keyalg RSA -keypass config -storepass config
此時在個人 D 盤下會生成一個 config.keystore
文件。
點擊連接觀看:非對稱加解密視頻(獲取更多請關注公衆號「哈嘍沃德先生」)
將 config.keystore
文件添加至 Config Server 項目 resources 目錄中。
建立 bootstrap.yml
添加非對稱加解密配置。注意:值要跟 CMD 裏輸入的值對應否則會出錯。
# 非對稱加解密 encrypt: key-store: location: classpath:config.keystore # keystore 文件存儲路徑 alias: config # 密鑰對別名 password: config # storepass 密鑰倉庫 secret: config # keypass 用來保護所生成密鑰對中的私鑰
pom.xml 添加避免 maven 過濾文件的配置。
<!-- build標籤 經常使用於添加插件及編譯配置 --> <build> <!-- 讀取配置文件 --> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> <include>**/*.properties</include> <include>**/*.tld</include> <include>**/*.keystore</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
檢查加密環境,訪問:http://localhost:8889/encrypt/status 結果以下:
使用 curl
命令訪問 /encrypt
端點對屬性值 root 進行加密。反向操做 /decrypt
可解密。
curl http://localhost:8889/encrypt -d root
加密結果:
解密
把加密後的數據更新到 Git 遠程倉庫的配置文件中。值得注意的是須要在加密結果前添加 {cipher}
串,若是遠程屬性源包含加密的內容(以開頭的值{cipher}
),則將其解密,而後再經過HTTP發送給客戶端。
Config Client 配置文件以下。
spring: cloud: config: name: order-service # 配置文件名稱,對應 git 倉庫中配置文件前半部分 label: master # git 分支 profile: prod # 指定環境 discovery: enabled: true # 開啓 service-id: config-server # 指定配置中心服務端的 service-id # 度量指標監控與健康檢查 management: endpoints: web: base-path: /actuator # 訪問端點根路徑,默認爲 /actuator exposure: include: '*' # 須要開啓的端點,這裏主要用到的是 refresh 這個端點 #exclude: # 不須要開啓的端點
訪問:http://localhost:9091/password 返回解密後的結果。
折騰了大半天終於給你們把加解密講完了,可是若是你夠仔細,你會發現此時的 Config Server 誰均可以訪問,並且直接經過 Config Server 訪問配置文件信息,加密的內容就會解密後直接顯示在瀏覽器中,這豈不是又白折騰了?固然不是,咱們只須要添加用戶安全認證便可。
Config Server 添加 security 依賴。
<!-- spring boot security 依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
Config Server 的 application.yml 添加安全認證配置。
spring: # 安全認證 security: user: name: user password: 123456
Config Client 的 bootstrap.yml 添加安全認證配置。
spring: cloud: config: # 安全認證 username: user password: 123456
Config Server 訪問:http://localhost:8889/order-service-prod.yml 被重定向至登陸頁。
輸入用戶名和密碼後,結果以下:
Config Client 訪問:http://localhost:9091/password 結果以下:
至此 Config 配置中心全部的知識點就講解結束了。
本文采用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議
。
你們能夠經過 分類
查看更多關於 Spring Cloud
的文章。
🤗 您的點贊
和轉發
是對我最大的支持。
📢 掃碼關注 哈嘍沃德先生
「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕鬆噢 ~