快速入门:适用于 Go 的 Azure Key Vault 密钥客户端库

在本快速入门中,你将了解如何使用 Azure SDK for Go 创建、检索、更新、列出和删除 Azure Key Vault 密钥。

Azure Key Vault 是一项云服务,用作安全的机密存储。 可以安全地存储密钥、密码、证书和其他机密。 有关 Key Vault 的详细信息,可以参阅概述

按照此指南操作,了解如何通过 Go 使用 azkeys 包来管理 Azure Key Vault 密钥。

先决条件

设置环境

  1. 登录到 Azure。

    az login
    
  2. 创建新的资源组。

    az group create --name quickstart-rg --location chinaeast
    
  3. 部署新的密钥保管库实例。

    az keyvault create --name <keyVaultName> --resource-group quickstart-rg
    

    <keyVaultName> 替换为在整个 Azure 中均唯一的名称。 通常使用个人或公司名称以及其他数字和标识符。

  4. 创建新的 Go 模块并安装包

    go mod init quickstart-keys
    go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity
    go get -u github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys
    

创建示例代码

创建名为 main.go 的文件,并将以下代码复制到该文件中:

package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys"
)

func main() {
	keyVaultName := os.Getenv("KEY_VAULT_NAME")
	keyVaultUrl := fmt.Sprintf("https://%s.vault.azure.cn/", keyVaultName)

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

	// create azkeys client
	client, err := azkeys.NewClient(keyVaultUrl, cred, nil)
	if err != nil {
		log.Fatal(err)
	}

	// create RSA Key
	rsaKeyParams := azkeys.CreateKeyParameters{
		Kty:     to.Ptr(azkeys.JSONWebKeyTypeRSA),
		KeySize: to.Ptr(int32(2048)),
	}
	rsaResp, err := client.CreateKey(context.TODO(), "new-rsa-key", rsaKeyParams, nil)
	if err != nil {
		log.Fatalf("failed to create rsa key: %v", err)
	}
	fmt.Printf("New RSA key ID: %s\n", *rsaResp.Key.KID)

	// create EC Key
	ecKeyParams := azkeys.CreateKeyParameters{
		Kty:   to.Ptr(azkeys.JSONWebKeyTypeEC),
		Curve: to.Ptr(azkeys.JSONWebKeyCurveNameP256),
	}
	ecResp, err := client.CreateKey(context.TODO(), "new-ec-key", ecKeyParams, nil)
	if err != nil {
		log.Fatalf("failed to create ec key: %v", err)
	}
	fmt.Printf("New EC key ID: %s\n", *ecResp.Key.KID)

	// list all vault keys
	fmt.Println("List all vault keys:")
	pager := client.NewListKeysPager(nil)
	for pager.More() {
		page, err := pager.NextPage(context.TODO())
		if err != nil {
			log.Fatal(err)
		}
		for _, key := range page.Value {
			fmt.Println(*key.KID)
		}
	}

	// update key properties to disable key
	updateParams := azkeys.UpdateKeyParameters{
		KeyAttributes: &azkeys.KeyAttributes{
			Enabled: to.Ptr(false),
		},
	}
	// an empty string version updates the latest version of the key
	version := ""
	updateResp, err := client.UpdateKey(context.TODO(), "new-rsa-key", version, updateParams, nil)
	if err != nil {
		panic(err)
	}
	fmt.Printf("Key %s Enabled attribute set to: %t\n", *updateResp.Key.KID, *updateResp.Attributes.Enabled)

	// delete the created keys
	for _, keyName := range []string{"new-rsa-key", "new-ec-key"} {
		// DeleteKey returns when Key Vault has begun deleting the key. That can take several
		// seconds to complete, so it may be necessary to wait before performing other operations
		// on the deleted key.
		delResp, err := client.DeleteKey(context.TODO(), keyName, nil)
		if err != nil {
			panic(err)
		}
		fmt.Printf("Successfully deleted key %s", *delResp.Key.KID)
	}
}

运行代码

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

export KEY_VAULT_NAME=quickstart-kv

接下来,运行以下 go run 命令来运行应用:

go run main.go
Key ID: https://quickstart-kv.vault.azure.cn/keys/new-rsa-key4/f78fe1f34b064934bac86cc8c66a75c3: Key Type: RSA
Key ID: https://quickstart-kv.vault.azure.cn/keys/new-ec-key2/10e2cec51d1749c0a26aab784808cfaf: Key Type: EC
List all vault keys:
https://quickstart-kv.vault.azure.cn/keys/new-ec-key
https://quickstart-kv.vault.azure.cn/keys/new-ec-key1
https://quickstart-kv.vault.azure.cn/keys/new-ec-key2
https://quickstart-kv.vault.azure.cn/keys/new-rsa-key4
Enabled set to: false
Successfully deleted key https://quickstart-kv.vault.azure.cn/keys/new-rsa-key4/f78fe1f34b064934bac86cc8c66a75c3

注意

输出仅用于提供信息。 返回的值可能因 Azure 订阅和 Azure Key Vault 而异。

代码示例

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

清理资源

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

az group delete --resource-group quickstart-rg

后续步骤