你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 Azure Key Vault Go 客户端库管理机密

本快速入门介绍如何使用 Azure SDK for Go 在 Azure 密钥保管库中创建、检索、列出和删除机密。

Azure 密钥保管库中可以存储各种对象类型。 将机密存储在密钥保管库中时,无需将它们存储在代码中,从而提高应用程序的安全性。

开始使用 azsecrets 包,并了解如何使用 Go 管理 Azure 密钥保管库中的机密。

先决条件

设置

对于本快速入门,请使用 Azure CLI 通过 azidentity 包向 Azure 进行身份验证。 若要了解各种身份验证方法,请参阅使用 Azure SDK for Go 进行 Azure 身份验证

登录到 Azure 门户

  1. 在 Azure CLI 中运行以下命令:

    az login
    

    如果 Azure CLI 可以打开默认浏览器,它将在默认浏览器中打开 Azure 门户登录页。

    如果此页面没有自动打开,请转到 https://aka.ms/devicelogin,然后输入在你的终端中显示的授权代码。

  2. 使用你的帐户凭据登录到 Azure 门户。

创建资源组和 Key Vault

本快速入门使用预先创建的 Azure 密钥保管库。 可以遵循 Azure CLI 快速入门Azure PowerShell 快速入门Azure 门户快速入门中的步骤创建 Key Vault。

或者,也可运行这些 Azure CLI 或 Azure PowerShell 命令。

重要

每个密钥保管库必须具有唯一的名称。 在以下示例中,将 <your-unique-keyvault-name> 替换为密钥保管库的名称。

az group create --name "myResourceGroup" -l "EastUS"

az keyvault create --name "<your-unique-keyvault-name>" -g "myResourceGroup" --enable-rbac-authorization

授予对 Key Vault 的访问权限

若要通过基于角色的访问控制 (RBAC) 授予对密钥保管库的权限,请使用 Azure CLI 命令 az role assignment create 将角色分配给你的“用户主体名称”(UPN)。

az role assignment create --role "Key Vault Secrets Officer" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"

将 <upn>、<subscription-id>、<resource-group-name> 和 <your-unique-keyvault-name> 替换为你的实际值。 你的 UPN 通常采用电子邮件地址格式(例如 username@domain.com)。

创建新的 Go 模块并安装包

运行以下 Go 命令:

go mod init kvSecrets
go get -u github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets
go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity

代码示例

创建名为 main.go 的文件,然后将以下代码粘贴到该文件中:

package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets"
)

func main() {
    mySecretName := "secretName01"
    mySecretValue := "secretValue"
    vaultURI := fmt.Sprintf("https://%s.vault.azure.net/", os.Getenv("KEY_VAULT_NAME"))

    // Create a credential using the NewDefaultAzureCredential type.
    cred, err := azidentity.NewDefaultAzureCredential(nil)
    if err != nil {
        log.Fatalf("failed to obtain a credential: %v", err)
    }

    // Establish a connection to the Key Vault client
    client, err := azsecrets.NewClient(vaultURI, cred, nil)

    // Create a secret
    params := azsecrets.SetSecretParameters{Value: &mySecretValue}
    _, err = client.SetSecret(context.TODO(), mySecretName, params, nil)
    if err != nil {
        log.Fatalf("failed to create a secret: %v", err)
    }

    // Get a secret. An empty string version gets the latest version of the secret.
    version := ""
    resp, err := client.GetSecret(context.TODO(), mySecretName, version, nil)
    if err != nil {
        log.Fatalf("failed to get the secret: %v", err)
    }

    fmt.Printf("secretValue: %s\n", *resp.Value)

    // List secrets
    pager := client.NewListSecretsPager(nil)
    for pager.More() {
        page, err := pager.NextPage(context.TODO())
        if err != nil {
            log.Fatal(err)
        }
        for _, secret := range page.Value {
            fmt.Printf("Secret ID: %s\n", *secret.ID)
        }
    }

    // Delete a secret. DeleteSecret returns when Key Vault has begun deleting the secret.
    // That can take several seconds to complete, so it may be necessary to wait before
    // performing other operations on the deleted secret.
    delResp, err := client.DeleteSecret(context.TODO(), mySecretName, nil)
    if err != nil {
        log.Fatalf("failed to delete secret: %v", err)
    }

    fmt.Println(delResp.ID.Name() + " has been deleted")
}

运行代码

  1. 在运行代码前,请创建名为 KEY_VAULT_NAME 的环境变量。 将环境变量值设置为之前创建的密钥保管库的名称。

    export KEY_VAULT_NAME=quickstart-kv
    
  2. 若要启动 Go 应用,请运行以下命令:

    go run main.go
    
    secretValue: createdWithGO
    Secret ID: https://quickstart-kv.vault.azure.net/secrets/quickstart-secret
    Secret ID: https://quickstart-kv.vault.azure.net/secrets/secretName
    quickstart-secret has been deleted
    

代码示例

有关更多示例,请参阅模块文档

清理资源

运行以下命令来删除资源组及其所有剩余资源:

az group delete --resource-group quickstart-rg

后续步骤