使用托管身份在 Azure Key Vault 上设置机密

Setting secret on Azure Keyvault using Managed Identites

我有一个使用 Java Springboot 的应用程序,并且我已经授予从我的托管身份到 KeyVault 的访问权限。

当我尝试使用 java 代码设置新密码时,出现以下错误:

"message":"Failed to set secret - secret-name \nStatus code 401, "{"error":{"code":"Unauthorized","message":"AKV10032: Invalid issuer. Expected one of

public void setAzureTokens() {
    try{
        SecretClient secretClient = new SecretClientBuilder()
                .vaultUrl(keyVaultUri)
                .credential(new DefaultAzureCredentialBuilder().build())
                .buildClient();

        secretClient.setSecret(new KeyVaultSecret(key, value));

    }
    catch (Exception e){
        LOG.error("Error during during token update", e);
    }
}

我是否需要在 Application.properties 上设置有关租户、clientId 或我的托管身份的任何信息?

正如@Alex 所说,这是一个 cross-tenant 问题,即;当访问 Key Vault 端点的库无法决定使用哪些凭据对您进行身份验证时,就会出现此问题。

解决方案是告诉 DefaultCredentialProvider 使用哪个租户,并且可以使用您可以在 DefaultAzureCredentialOptions() 中传递的选项来完成。

var o = new DefaultAzureCredentialOptions();
o.VisualStudioTenantId = preConfig["AzureTenantId"];
configurationBuilder.AddAzureKeyVault(new Uri(preConfig["KeyVaultName"]), new DefaultAzureCredential(o));

Reference

(或)

您可以将 AZURE_TENANT_ID 设置为环境变量,可以像这里一样使用 > Azure Key Vault Secret client library for Java | Microsoft Docs