如何通过 golang 从 Azure 保险库中找到机密列表和证书列表?

how can find list of secrets and certificate list from Azure vault via golang?

我正在尝试使用 Golang 集成 azure vault。我使用以下代码获取密钥列表:

func (rcv Resources) KeyList(cred Credentials, subscriptionID, resourceGp, vaultName string) ([]string, error) {
    var (
        res []string
        err error
    )
    logger.Info("create client for connecting to the azure as vault client for getting key list.")
    cli := keyvault.NewKeysClient(subscriptionID)

    if cli.Authorizer, err = azureAD.Authorizer(cred.TenantID, cred.ClientID, cred.ClientSecret); err != nil {
        logger.Error("can not get authorizer for resources, err : ", err.Error())
        return nil, err
    }
    keyList, err := cli.List(context.Background(), resourceGp, "key-vault-zap-auth-scan2")
    if err != nil {
        logger.Error("can not get resources list , error : ", err.Error())
        return nil, err
    }
    for _, key := range keyList.Values() {

        res = append(res, *key.Name)
    }
    return res, nil
}

如您所知,我们有不同的对象要存储在 azure key-vault 中,例如:密钥、机密和证书

我无法使用 SDK 获取机密列表,因为它没有机密客户端。

我该如何解决这个问题?

对于秘密,有一个名为 azure-keyvault-secrets 的单独包。

要列出机密,您要调用的方法是 ListSecrets。这是取自 here:

的相同示例
cred, err := azidentity.NewDefaultAzureCredential(nil)
client, err := azsecrets.NewClient("https://my-key-vault.vault.azure.net/", cred, nil)

pager := client.ListSecrets(nil)
for pager.NextPage(context.Background()) {
    resp := pager.PageResponse()
    for _, secret := range resp.Secrets {
        fmt.Printf("Secret ID: %s", *secret.ID)
    }
}

Gaurav 提供的答案工作得很好..但前提是你使用的包达到版本 v0.5.0https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets?tab=versions

从版本 v0.6.0 开始,方法 pager.NextPage() returns 2 个值 (ListSecretsPageResponse, error) 因此不能在 for 循环中使用——你会命中类似于 The non-bool value 'pager.NextPage(context.TODO())' (type (ListSecretsPageResponse, error)) used as a condition.

的错误

相反,您应该使用方法 pager.More() 循环浏览秘密页面。

大致如下:

    pager := client.ListSecrets(nil)
    for pager.More() {
        page, err := pager.NextPage(context.TODO())
        if err != nil {
            panic(err)
        }
        for _, v := range page.Secrets {
            fmt.Printf("Secret Name: %s\n", *v.ID)
        }
    }

希望这对您有所帮助。干杯