教程:在 Java Spring 应用中使用 Key Vault 引用

本教程介绍如何将 Azure 应用程序配置服务与 Azure Key Vault 配合使用。 应用程序配置和 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 应用程序访问此密钥的值。

先决条件

创建保管库

  1. 选择 Azure 门户左上角的“创建资源”选项:

    屏幕截图显示 Azure 门户中的“创建资源”选项。

  2. 在搜索框中输入 Key Vault

  3. 在结果列表中,选择左侧的“Key Vault” 。

  4. 在“Key Vault”中选择“添加”。

  5. 在“创建 Key Vault”中的右侧提供以下信息:

    • 选择“订阅”以选择订阅。
    • 在“资源组”中选择“新建”,然后输入资源组的名称 。
    • 在“Key Vault 名称”中,必须输入唯一的名称。 对于本教程,请输入 Contoso-vault2
    • 在“区域”下拉列表中,选择一个位置。
  6. 将“创建 Key Vault”的其他选项保留默认值。

  7. 选择“创建” 。

目前,只有你的 Azure 帐户有权访问这个新保管库。

屏幕截图显示密钥保管库。

向 Key Vault 添加机密

只需执行几个额外的步骤即可将机密添加到保管库。 在本例中,我们将添加一条消息,用于测试 Key Vault 检索功能。 此消息名为 Message,我们将在其中存储“Hello from Key Vault”值。

  1. 在 Key Vault 属性页中选择“机密” 。
  2. 选择“生成/导入”。
  3. 在“创建机密”窗格中输入以下值:
    • 上传选项:输入 Manual
    • Name:输入 Message
    • :输入 Hello from Key Vault
  4. 将“创建机密”的其他属性保留默认值。
  5. 选择“创建” 。

将 Key Vault 引用添加到应用程序配置

  1. 登录 Azure 门户。 选择“所有资源”,然后选择在快速入门中创建的应用程序配置存储实例 。

  2. 选择“配置资源管理器”。

  3. 选择“+ 创建”>“Key Vault 引用”,然后指定以下值:

    • 密钥:选择 /application/config.keyvaultmessage
    • 标签:将此值保留空白。
    • “订阅”、“资源组”和“Key Vault”: 输入上一部分在密钥保管库中创建的值相对应的值。
    • 机密:选择在上一部分创建的名为 Message 的机密。

连接到 Key Vault

  1. 在本教程中,我们将使用一个服务主体向 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": "7da18cae-779c-41fc-992e-0527854c6583",
    "clientSecret": "b421b443-1669-4cd7-b5b1-394d5c945002",
    "subscriptionId": "443e30da-feca-47c4-b68f-1636b75e16b3",
    "tenantId": "35ad10f1-7799-4766-9acf-f2d946161b77",
    "activeDirectoryEndpointUrl": "https://login.chinacloudapi.cn",
    "resourceManagerEndpointUrl": "https://management.chinacloudapi.cn/",
    "sqlManagementEndpointUrl": "https://management.core.chinacloudapi.cn:8443/",
    "galleryEndpointUrl": "https://gallery.chinacloudapi.cn/",
    "managementEndpointUrl": "https://management.core.chinacloudapi.cn/"
    }
    
  2. 运行以下命令,使服务主体能够访问 Key Vault:

    az keyvault set-policy -n <your-unique-keyvault-name> --spn <clientId-of-your-service-principal> --secret-permissions delete get
    
  3. 运行以下命令获取 object-id,然后将其添加到应用配置。

    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>
    
  4. 创建环境变量 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 引用

  1. 创建一个名为“APP_CONFIGURATION_ENDPOINT” 的环境变量。 将其值设为你的应用配置存储的终结点。 可以在 Azure 门户的“访问密钥” 边栏选项卡上找到该终结点。 重启命令提示符以使更改生效。

  2. 打开 resources 文件夹中的配置文件。 更新此文件以使用 APP_CONFIGURATION_ENDPOINT 值。 删除对此文件中的连接字符串的任何引用。

spring:
    cloud:
        azure:
            appconfiguration:
                stores:
                    - endpoint: ${APP_CONFIGURATION_ENDPOINT}

注意

还可使用 Spring Cloud Azure 全局配置连接到密钥保管库。

  1. 打开 MessageProperties.java 。 添加一个名为“keyVaultMessage” 的新变量:

    private String keyVaultMessage;
    
    public String getKeyVaultMessage() {
        return keyVaultMessage;
    }
    
    public void setKeyVaultMessage(String keyVaultMessage) {
        this.keyVaultMessage = keyVaultMessage;
    }
    
  2. 打开 HelloController.java 。 更新 getMessage 方法,以包括从 Key Vault 检索到的消息。

    @GetMapping
    public String getMessage() {
        return "Message: " + properties.getMessage() + "\nKey Vault message: " + properties.getKeyVaultMessage();
    }
    
  3. 使用 Maven 生成 Spring Boot 应用程序,然后运行该程序,例如:

    mvn clean package
    mvn spring-boot:run
    
  4. 应用程序运行以后,请使用 curl 测试该应用程序,例如 :

    curl -X GET http://localhost:8080/
    

    可看到在应用程序配置存储区中输入的消息。 还会看到你在 Key Vault 中输入的消息。

清理资源

如果不想继续使用本文中创建的资源,请删除此处创建的资源组以避免产生费用。

重要

删除资源组的操作不可逆。 将永久删除资源组以及其中的所有资源。 请确保不要意外删除错误的资源组或资源。 如果在包含要保留的其他资源的资源组中创建了本文的资源,请从相应的窗格中单独删除每个资源,而不是删除该资源组。

  1. 登录到 Azure 门户,然后选择“资源组”。
  2. 在“按名称筛选”框中,输入资源组的名称
  3. 在结果列表中,选择资源组名称以查看概述。
  4. 选择“删除资源组”。
  5. 系统会要求确认是否删除资源组。 重新键入资源组的名称进行确认,然后选择“删除” 。

片刻之后,将会删除该资源组及其所有资源。

后续步骤

在本教程中,我们已创建一个引用 Key Vault 中存储的值的应用程序配置密钥。 若要了解如何在 Java Spring 应用程序中使用功能标记,请继续阅读下一个教程。