知識庫 / Spring / Spring Cloud RSS 訂閱

Azure Spring Cloud 密鑰保管庫使用指南

Security,Spring Cloud
HongKong
11
11:41 AM · Dec 06 ,2025

1. 概述

在本教程中,我們將探討雲原生開發的基本原則以及使用 Spring Cloud Azure Key Vault 的益處。

2. Spring Cloud Azure 是什麼?

Spring Cloud Azure 是一套全面的庫和工具集合,專門設計用於促進 Spring 應用與 Microsoft Azure 服務之間的集成。

雖然已經可以利用 Azure SDK 將 Java 應用與 Azure 集成,但 Spring Cloud Azure 將這種集成提升到了一個新的水平。

通過利用 Spring Cloud Azure 提供的強大 API 集合,我們可以方便地與諸如 Azure 存儲Cosmos DB 等各種 Azure 服務進行交互。

簡化了開發流程並增強了應用程序的整體安全性與性能。

Spring Cloud Azure 提供多個模塊,用於將我們的應用程序與最相關的 Azure 服務集成。 讓我們看看幾個例子:

完整的可用模塊列表可以在這裏找到:這裏

3. 項目設置

要開始使用 Azure 雲服務,第一步是註冊一個 Azure 訂閲

一旦訂閲已就位,我們接下來 安裝 Azure CLI 此命令行工具允許我們從本地機器與 Azure 服務進行交互。

接下來,我們打開命令提示符並運行以下命令:

> az login

一旦我們登錄後,我們就會為我們的訂閲創建一個新的資源組:

>az group create --name spring_cloud_azure --location eastus

除了通過命令行創建資源組,我們還可以使用 Azure 門户 在我們的 Web 瀏覽器中創建新的訂閲。

這提供了一個直觀的界面,用於管理我們的 Azure 資源和訂閲。

在接下來的步驟中,下一步是配置我們的 IDE。在本教程中,我們將 IntelliJ 作為我們的首選 IDE。

Azure Toolkit 是在 Azure 相關開發中使用的有用工具包 。它提供專門為幫助開發者在 Azure 平台上構建和管理應用程序的工具和資源。

現在,讓我們 安裝 此插件到我們的 IDE,然後轉到 Tools>Azure>Login。這將提示我們輸入我們的 Azure 憑據以驗證我們對平台的訪問權限。

4. 集成

我們已完成將 Spring 應用與 Azure 服務集成的必要準備工作。

在本教程中,我們將通過使用官方 Azure Java SDK 和 Spring Cloud 模塊,將 Azure Key Vault 服務集成到我們的應用程序中。

4.1. Azure 密鑰保管箱

Azure 密鑰保管箱 是一種強大的基於雲的服務,它提供了一種安全可靠的方式來存儲和管理敏感數據,包括加密密鑰、機密和證書。

它可以作為應用程序的外部配置源。而不是將敏感信息定義為配置文件的值,我們可以將其定義為 Azure 密鑰保管箱中的機密,然後在應用程序運行時將其安全地注入到應用程序中。

要開始,我們需要在之前創建的資源組中創建一個新的密鑰保管箱。我們可以使用 Azure CLI 來完成此操作,但如果更喜歡,也可以使用 Azure 門户

> az keyvault create --name new_keyvault --resource-group spring_cloud_azure --location eastus

在創建 Key Vault 存儲後,讓我們在 Key Vault 存儲 new_keyvault 中創建兩個密鑰:

> az keyvault secret set --name my-database-secret --value my-database-secret-value --vault-name new_keyvault
> az keyvault secret set --name my-secret --value my-secret-value --vault-name new_keyvault

第一個密鑰擁有值 my-database-secretmy-database-secret-value,而第二個密鑰擁有值 my-secretmy-secret-value

我們還可以通過 Azure 門户檢查和確認這些密鑰的創建:

4.2. 密鑰客户端

一旦我們定義了這些密鑰,就可以在我們的應用程序中定義 SecretClient

SecretClient 類提供了一個客户端接口,用於從 Azure 密鑰保管庫檢索和管理密鑰。

現在,讓我們定義一個接口:

public interface KeyVaultClient {

    SecretClient getSecretClient();

    default KeyVaultSecret getSecret(String key) {
        KeyVaultSecret secret;
        try {
            secret = getSecretClient().getSecret(key);
        } catch (Exception ex) {
            throw new NoSuchElementException(String.format("Unable to retrieve %s secret", key), ex);
        }
        return secret;
    }
}

接口 KeyVaultClient 聲明瞭兩個方法:

現在,讓我們看看定義 SecretClient 的兩種方法,一種使用標準 Azure SDK,另一種使用 Spring Cloud 模塊。

4.3. 不使用 Spring Cloud Azure 集成

在這種方法中,我們將僅配置 SecretClient,並利用微軟提供的 Azure SDK 的 API。

因此,讓我們將 azure-keyvault-extensions 依賴項添加到我們的 pom.xml 文件中:

<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-keyvault-extensions</artifactId>
    <version>1.2.6</version>
</dependency>

現在,讓我們在我們的 application.yaml文件中定義配置 SecretClient 所需的參數:

azure:
  keyvault:
    vaultUrl: {$myVaultUrl}
    tenantId: {$myTenantId}
    clientId: {$myClientId}
    clientSecret: {$myClientSecret}

我們應該將所有佔位符替換為適當的值。

一種選擇是在 application.yaml 中直接硬編碼這些值。但是,這種方法需要存儲多個敏感數據,包括 clientIdclientSecret,這可能帶來安全風險。

與其硬編碼這些值,不如為每個敏感數據創建一個密鑰,並使用 Azure 管道將其注入到我們的配置文件中

接下來,我們創建一個 KeyVaultProperties 類來處理這些配置:

@ConfigurationProperties("azure.keyvault")
@ConstructorBinding
public class KeyVaultProperties {
    private String vaultUrl;
    private String tenantId;
    private String clientId;
    private String clientSecret;
    //Standard constructors, getters and setters
}

現在我們來創建我們的客户端類:

@EnableConfigurationProperties(KeyVaultProperties.class)
@Component("KeyVaultManuallyConfiguredClient")
public class KeyVaultManuallyConfiguredClient implements KeyVaultClient {

    private KeyVaultProperties keyVaultProperties;

    private SecretClient secretClient;

    @Override
    public SecretClient getSecretClient() {
        if (secretClient == null) {
            secretClient = new SecretClientBuilder()
              .vaultUrl(keyVaultProperties.getVaultUrl())
              .credential(new ClientSecretCredentialBuilder()
                .tenantId(keyVaultProperties.getTenantId())
                .clientId(keyVaultProperties.getClientId())
                .clientSecret(keyVaultProperties.getClientSecret())
                .build())
              .buildClient();
        }
        return secretClient;
    }
}

一旦我們注入這個 KeyVaultClient 的實現,getSecret() 默認方法將返回手動配置的 SecretClient 對象。

4.4. 與 Spring Cloud Azure 集成

作為這種方法的組成部分,我們將使用 SecretClient 與 Spring Cloud Azure Key Vault 配合,並利用該框架的另一個有用的功能:將密鑰注入到屬性文件中。

因此,讓我們將 spring-cloud-azure-starter-keyvault-secrets 依賴項添加到我們的 pom.xml 文件中:

<dependency>
   <groupId>com.azure.spring</groupId>
   <artifactId>spring-cloud-azure-starter-keyvault-secrets</artifactId>
   <version>5.12.0-beta.1</version>
</dependency>

接下來,讓我們為我們的 application.yaml 添加以下屬性:

spring:
  cloud:
    azure:
      keyvault:
        secret:
          endpoint: {$key-vault-endpoint}

我們應該用 key-vault-endpoint 佔位符替換為我們存儲的 URI,該 URI 在 Azure 門户的 資源 > {我們的 keyvault} > Vault URI 下定義。

現在,讓我們創建我們的客户端類:

@Component("KeyVaultAutoconfiguredClient")
public class KeyVaultAutoconfiguredClient implements KeyVaultClient {
    private final SecretClient secretClient;

    public KeyVaultAutoconfiguredClient(SecretClient secretClient) {
        this.secretClient = secretClient;
    }

    @Override
    public SecretClient getSecretClient() {
        return secretClient;
    }
}

注入這個 KeyVaultClient 實現後,getSecret() 默認方法將返回自動配置的 SecretClient 對象。在我們的 application.yaml 中,除了 endpoint secret 外,無需指定任何配置值。

Spring Cloud 將自動填充所有 SecretClient 的憑據參數。

我們也可以使用 Spring Cloud Azure 模塊在我們的屬性文件中注入 secret。 讓我們在 application.yaml 中添加以下屬性:

spring:
  cloud:
    azure:
      compatibility-verifier:
        enabled: false
      keyvault:
        secret:
          property-sources[0]:
            name: key-vault-property-source-1
            endpoint: https://spring-cloud-azure.vault.azure.net/
          property-source-enabled: true

通過設置標誌 ,Spring Cloud Azure 會從 中注入密鑰保管箱中的憑據。

接下來,我們可以為我們的 創建一個動態屬性:

database:
  secret:
    value: ${my-database-secret}

當應用程序啓動時,Spring Cloud Azure 會將 ${my-database-secret} 佔位符替換為 Azure Key Vault 中定義的實際密鑰 my-database-secret 的值。

4.5. 在屬性文件中注入密鑰

我們已經看到了兩種注入密鑰到屬性文件的方式:使用 Spring Cloud Azure Key Vault 或配置 Azure 管道。

如果僅使用 Spring Cloud Azure Key Vault,則應在 application.yaml 中硬編碼 Key Vault 端點,以便在屬性文件中啓用注入,這可能會帶來安全風險。

另一方面,使用 Azure 管道時,無需硬編碼任何值。 管道將替換 application.yaml 中的密鑰。

因此,我們應該僅將 Spring Cloud Azure Key Vault 模塊用於配置自動配置的 SecretClient 和其他功能,並將注入密鑰到屬性文件中的任務委派給 Azure 管道。

4.6. 運行應用程序

現在讓我們運行我們的 Spring Boot 應用程序:

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Value("${database.secret.value}")
    private String mySecret;

    private final KeyVaultClient keyVaultClient;

    public Application(@Qualifier(value = "KeyVaultAutoconfiguredClient") KeyVaultAutoconfiguredClient keyVaultAutoconfiguredClient) {
        this.keyVaultClient = keyVaultAutoconfiguredClient;
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class);

    }

    @Override
    public void run(String... args) throws Exception {
        KeyVaultSecret keyVaultSecret = keyVaultClient.getSecret("my-secret");
        System.out.println("Hey, our secret is here ->" + keyVaultSecret.getValue());
        System.out.println("Hey, our secret is here from application properties file ->" + mySecret);
    }
}

我們的應用程序將在啓動時從自動配置的客户端和注入到 application.yaml 中的客户端中檢索密鑰,然後將兩者同時顯示在控制枱上。

5. 結論

在本文中,我們討論了 Spring Cloud 與 Azure 的集成。

我們瞭解到,使用 Spring Cloud Azure Key Vault 代替 Microsoft 提供的 Azure SDK,可以更簡單、更簡潔地集成 Azure Key Vault 和 Spring 應用程序。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.