使用多個金鑰和金鑰輪換

除了加密屬性值中的 {cipher} 字首外,Config Server 還會查詢一個或多個 {name:value} 字首,這些字首位於(Base64 編碼的)密文之前。這些金鑰被傳遞給一個 TextEncryptorLocator,它可以使用任何所需的邏輯來查詢用於解密的 TextEncryptor。如果您配置了金鑰庫 (encrypt.keystore.location),預設的定位器會查詢由 key 字首提供的別名對應的金鑰,密文類似於以下形式:

foo:
  bar: `\{cipher}{key:testkey}...`

定位器會查詢名為 "testkey" 的金鑰。也可以透過在字首中使用 {secret:…​} 值來提供一個金鑰。但是,如果未提供金鑰,預設情況下會使用金鑰庫密碼(這是您在構建金鑰庫時未指定金鑰的情況下獲得的值)。如果您確實提供了金鑰,則還應該使用自定義的 SecretLocator 對金鑰進行加密。

當金鑰僅用於加密少量配置資料(即它們未在其他地方使用)時,從加密角度來看,幾乎無需進行金鑰輪換。但是,您可能偶爾需要更改金鑰(例如,發生安全漏洞時)。在這種情況下,所有客戶端都需要更改其源配置檔案(例如,在 git 中),並在所有密文中使用了新的 {key:…​} 字首。請注意,客戶端需要首先檢查金鑰別名在 Config Server 金鑰庫中是否可用。

如果您想讓 Config Server 處理所有加密和解密操作,那麼 {name:value} 字首也可以作為純文字新增到傳送到 /encrypt 端點的請求中。