Skip to main content
 首页 » 编程设计

python之无法使用 python 访问 azure key vault secret

2025年05月04日9qq号

我已经能够通过我的外部网络应用程序使用 oauth rest api 访问 azure key vault,但由于某种原因我无法从 key 中检索 secret 。经过长时间的研究,我发现可以使用 powershell 和 c# 执行此操作,但仍未找到任何使用 python 的解决方案。 任何人都知道 python 是否可行,或者有没有办法模拟 powershell 正在做的事情? 这是检索 secret 的代码:

def getSecret(vault_name, secret_name, secret_version = ''): 
    #Get acess token to azure account 
    data = { "grant_type" : "client_credentials",  
            "client_id" : 'appidxx',  
            "client_secret" : 'appsecretxx',  
            "resource" : "https://vault.azure.net" 
        } 
    headers = { "Content-Type" : "application/x-www-form-urlencoded" } 
    r = requests.post("https://login.windows.net/{}/oauth2/token".format('my tenant id'), data=data, headers=headers) 
    access_token = r.json()['access_token'] 
    #Get secret from KeyVault 
    headers = {"Authorization":"Bearer {}".format(access_token) } 
    r = requests.get('https://{}.vault.azure.net/secrets/{}/{}?api-version=2015-06-01'.format(vault_name, secret_name, secret_version), headers=headers) 
    result = r.json() 
    if 'value' in result.keys(): 
        return result["value"] 
    else:  
        return 'Secret Not Found' 
 
def searchSecret(secret_name, secret_version = ''): 
subscription_id = 'subscription id'     
credentials = ServicePrincipalCredentials( 
        client_id= 'appidxx', 
        secret= 'appsecretxx', 
        tenant= 'tenantidxx' 
    ) 
 
    kvm_client = KeyVaultManagementClient(credentials,  subscription_id ) 
    for vault in kvm_client.vaults.list(): 
        #return when secret found in vault 
        secret = getSecret(vault.name, secret_name, secret_version = '') 
        if (secret != 'Secret Not Found'): 
            return secret 
    return 'Secret Not Found' 

此外,我已经在 Azure 门户中注册了我的应用程序并授予了对我的 key 和 secret 的权限,但是我注意到,当通过访问策略授予对我的应用程序的访问权限时,“授权应用程序”选项被锁定,我无法添加我的应用程序,这可能是我问题的根本原因? screenshot

请您参考如下方法:

如果您想使用 Azure SDK 更轻松地访问 secret ,可以使用 Python 中的 Key Vault 替代 azure-keyvault 的新包:

azure-identity也是应该与这些一起用于身份验证的包。

可以在 azure-sdk-for-python GitHub repository 上找到有关使用 secret 库的文档,下面是一个用于检索 secret 的示例:

from azure.identity import DefaultAzureCredential 
from azure.keyvault.secrets import SecretClient 
from azure.mgmt.keyvault import KeyVaultManagementClient 
 
credential = DefaultAzureCredential() 
subscription_id = "subscription id" 
 
def getSecret(vault_url, secret_name, secret_version=None): 
    client = SecretClient(vault_url, credential) 
    # list the secrets in the vault 
    secret_properties = client.list_properties_of_secrets() 
    for secret_property in secret_properties: 
        if secret_property.name == secret_name: 
            # get secret from Key Vault 
            return client.get_secret(secret_name, secret_version) 
    return "Secret Not Found" 
 
def searchSecret(secret_name, secret_version=None): 
    kvm_client = KeyVaultManagementClient(credential, subscription_id) 
    for vault in kvm_client.vaults.list(): 
        # return when secret found in vault 
        secret = getSecret(vault.properties.vault_uri, secret_name, secret_version) 
        if secret != "Secret Not Found": 
            return secret 
    return "Secret Not Found" 

您可以通过设置与 client_id、secret 和 相对应的环境变量来提供用于 ServicePrincipalCredentials 的相同凭据租户:

export AZURE_CLIENT_ID="appidxx" 
export AZURE_CLIENT_SECRET="appsecretxx" 
export AZURE_TENANT_ID="tenantidxx" 

(我使用 Python 开发 Azure SDK)