教學課程:在 Java Spring 應用程式中使用 Key Vault 參考
在此教學課程中,您將了解如何搭配 Azure Key Vault 一起使用 Azure 應用程式組態服務。 應用程式組態與 Key Vault 是互補服務,將在大部分的應用程式部署中並行使用。
應用程式組態可協助您一起使用這些服務,方法是建立參考 Key Vault 中所儲存之值的金鑰。 當應用程式組態建立此類金鑰時,它會儲存 Key Vault 值的 URI,而不是值本身。
您的應用程式會使用應用程式組態用戶端提供者擷取 Key Vault 參考,就像是儲存在應用程式組態中的其他任何金鑰一樣。 在此案例中,儲存在應用程式組態中的值是參考 Key Vault 中之值的 URI。 它們不是 Key Vault 值或認證。 用戶端提供者會將金鑰視為 Key Vault 參考,因此它會使用 Key Vault 擷取其值。
您的應用程式會負責適當地驗證應用程式組態和 Key Vault。 這兩個服務不會直接通訊。
此教學課程說明如何在程式碼中實作 Key Vault 參考。 本文會以快速入門中介紹的 Web 應用程式作為基礎。 繼續之前,請先完成使用應用程式設定建立 Java Spring 應用程式。
您可以使用任何程式碼編輯器來進行本教學課程中的步驟。 例如,Visual Studio Code 是適用於 Windows、macOS 與 Linux 作業系統的跨平台程式碼編輯器。
在本教學課程中,您會了解如何:
- 建立可參考 Key Vault 中儲存之值的應用程式組態金鑰。
- 從 Java Spring 應用程式存取此金鑰的值。
必要條件
- Azure 訂用帳戶 - 建立免費帳戶
- 支援的 Java 開發套件 (JDK) 第 11 版。
- Apache Maven 3.0 版或更新版本。
建立保存庫
選取 Azure 入口網站左上角的 [建立資源] 選項:
在 [搜尋] 方塊中輸入 Key Vault。
從結果清單,選取左側的 [金鑰保存庫]。
在 [金鑰保存庫] 中,選取 [新增]。
在 [建立金鑰保存庫] 的右側,提供下列資訊:
- 選取 [訂用帳戶] 以選擇訂用帳戶。
- 在 [資源群組] 中,選取 [新建],然後輸入資源群組名稱。
- 在 [金鑰保存庫名稱] 中,需要唯一的名稱。 針對此教學課程,請輸入 Contoso-vault2。
- 在 [區域] 下拉式清單中,選擇一個位置。
將其他 [建立金鑰保存庫] 選項維持為預設值。
選取 建立。
此時,您的 Azure 帳戶是唯一獲得授權可存取此新保存庫的帳戶。
將祕密新增至 Key Vault
若要將祕密新增至保存庫,您只需要採取一些額外步驟。 在此案例中,請新增一則您可以用來測試 Key Vault 擷取的訊息。 此訊息稱為 Message,而您要將 "Hello from Key Vault" 的值儲存於其中。
- 從 Key Vault 屬性頁面,選取 [祕密]。
- 選取產生/匯入。
- 在 [建立祕密] 窗格中,輸入下列值:
- 上傳選項:輸入 [手動]。
- 名稱:輸入 [訊息]。
- 值:輸入 Hello from Key Vault。
- 保留其他 [建立祕密] 屬性的預設值。
- 選取 建立。
將 Key Vault 參考新增至應用程式組態
登入 Azure 入口網站。 選取 [所有資源],然後選取您在快速入門中建立的應用程式組態存放區執行個體。
選取 [組態總管]。
選取 [+ 建立]>[金鑰保存庫參考],然後指定下列值:
- 金鑰:選取 [/application/config.keyvaultmessage]
- 標籤:將此值保留空白。
- 訂用帳戶、資源群組與金鑰保存庫:輸入與您在上一節中建立的金鑰保存庫中的值對應的值。
- 祕密:選取您在上一節中所建立、名為 Message 的祕密。
連線到 Key Vault
在此教學課程中,您將使用服務主體來驗證 Key Vault。 若要建立此服務主體,請使用 Azure CLI az ad sp create-for-rbac 命令:
az ad sp create-for-rbac -n "http://mySP" --role Contributor --scopes /subscriptions/{subscription-id} --sdk-auth
此作業會傳回一系列的金鑰/值組:
{ "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444", "clientSecret": "aaaaaaaa-0b0b-1c1c-2d2d-333333333333", "subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e", "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee", "activeDirectoryEndpointUrl": "https://login.microsoftonline.com", "resourceManagerEndpointUrl": "https://management.azure.com/", "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/", "galleryEndpointUrl": "https://gallery.azure.com/", "managementEndpointUrl": "https://management.core.windows.net/" }
執行下列命令,讓服務主體存取您的金鑰保存庫:
az keyvault set-policy -n <your-unique-keyvault-name> --spn <clientId-of-your-service-principal> --secret-permissions delete get
執行下列命令以取得您的物件識別碼,然後將其新增至應用程式組態。
az ad sp show --id <clientId-of-your-service-principal> az role assignment create --role "App Configuration Data Reader" --scope /subscriptions/<subscriptionId>/resourceGroups/<group-name> --assignee-principal-type --assignee-object-id <objectId-of-your-service-principal> --resource-group <your-resource-group>
建立環境變數 AZURE_CLIENT_ID、AZURE_CLIENT_SECRET 和 AZURE_TENANT_ID。 使用先前步驟中所顯示的服務主體值。 在命令列執行下列命令,然後重新啟動命令提示字元,讓變更生效:
setx AZURE_CLIENT_ID "clientId" setx AZURE_CLIENT_SECRET "clientSecret" setx AZURE_TENANT_ID "tenantId"
如果您使用 Windows PowerShell,請執行下列命令:
$Env:AZURE_CLIENT_ID = "clientId" $Env:AZURE_CLIENT_SECRET = "clientSecret" $Env:AZURE_TENANT_ID = "tenantId"
如果您使用 macOS 或 Linux,請執行下列命令:
export AZURE_CLIENT_ID ='clientId' export AZURE_CLIENT_SECRET ='clientSecret' export AZURE_TENANT_ID ='tenantId'
注意
這些 Key Vault 認證只會在您的應用程式中使用。 您的應用程式會使用這些認證直接向 Key Vault 驗證,而不會涉及應用程式組態服務。 Key Vault 會為您的應用程式和應用程式組態服務提供驗證,而不需共用或公開金鑰。
更新您的程式碼以使用 Key Vault 參考
建立稱為 APP_CONFIGURATION_ENDPOINT的環境變數。 將其值設定為應用程式組態存放區的端點。 您可以在 Azure 入口網站中的 [存取金鑰] 刀鋒視窗上找到此端點。 重新啟動命令提示字元,讓變更生效。
在 resources 資料夾中開啟您的組態檔。 更新此檔案,以使用 APP_CONFIGURATION_ENDPOINT 值。 移除此檔案中連接字串的任何參考。
spring:
cloud:
azure:
appconfiguration:
stores:
- endpoint: ${APP_CONFIGURATION_ENDPOINT}
注意
您也可使用 Spring Cloud Azure 全域設定來連線到 Key Vault。
開啟 MessageProperties.java。 新增名為 keyVaultMessage 的新變數:
private String keyVaultMessage; public String getKeyVaultMessage() { return keyVaultMessage; } public void setKeyVaultMessage(String keyVaultMessage) { this.keyVaultMessage = keyVaultMessage; }
開啟 Hellocontroller.java。 更新 getMessage 方法,以包含從 Key Vault 擷取到的訊息。
@GetMapping public String getMessage() { return "Message: " + properties.getMessage() + "\nKey Vault message: " + properties.getKeyVaultMessage(); }
使用 Maven 建置 Spring Boot 應用程式並加以執行;例如:
mvn clean package mvn spring-boot:run
在您的應用程式執行之後,使用 curl 來測試您的應用程式;例如:
curl -X GET http://localhost:8080/
您會看到您在應用程式組態存放區中輸入的訊息。 您也會看到已在 Key Vault 中輸入的訊息。
清除資源
如果您不想繼續使用本文中建立的資源,請刪除在此處建立的資源群組,以避免產生費用。
重要
刪除資源群組是無法回復的動作。 資源群組和其中的所有資源都將被永久刪除。 請確定您不會誤刪錯誤的資源群組或資源。 如果您是在包含需保留其他資源的資源群組內部,建立本文的資源,則可以從每個資源各自的窗格中個別刪除每個資源,而不必刪除整個資源群組。
- 登入 Azure 入口網站,然後選取 [資源群組]。
- 在 [依名稱篩選] 方塊中,輸入您資源群組的名稱。
- 在結果清單中,選取資源群組名稱以查看概觀。
- 選取 [刪除資源群組]。
- 系統將會要求您確認是否刪除資源群組。 輸入您資源群組的名稱以進行確認,然後選取 [刪除]。
不久後,系統便會刪除該資源群組及其所有的資源。
下一步
在此教學課程中,您建立了參考 Key Vault 中儲存之值的應用程式組態金鑰。 若有進一步問題,請參閱參考文件,其中包含 Spring Cloud Azure 應用程式設定程式庫運作方式的所有詳細資料。 若要了解如何在 Java Spring 應用程式中使用功能旗標,請繼續進行下一個教學課程。