选项
首页首页 Skill 安全 azure-keyvault-py

azure-keyvault-py

microsoft/skills microsoft/skills

使用 Python SDK 在 Azure Key Vault 中管理密钥、加密密钥和证书。

...展开全部
9
更新时间 2026-09-12

Azure Key Vault Python SDK

用于机密、加密密钥和证书的存储与管理的安全方案。

安装

# 机密
pip install azure-keyvault-secrets azure-identity

# 密钥(加密操作)
pip install azure-keyvault-keys azure-identity

# 证书
pip install azure-keyvault-certificates azure-identity

# 全部组件
pip install azure-keyvault-secrets azure-keyvault-keys azure-keyvault-certificates azure-identity

环境变量

AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net/  # 所有认证方式均必需
AZURE_TOKEN_CREDENTIALS=prod # 仅在生产环境中使用 DefaultAzureCredential 时必需
</vault-name>

认证与生命周期管理

🔑 以下所有代码示例均遵循两条规则:

  1. 优先使用 DefaultAzureCredential 它在本地环境(Azure CLI / VS Code / Developer CLI)和 Azure 环境(托管标识、工作负载标识)中均能正常工作,且无需更改代码。请避免使用连接字符串、账户/API 密钥——它们会绕过 Entra 审计和密钥轮换机制。
    • 本地开发:DefaultAzureCredential 可直接使用。
    • 生产环境:设置 AZURE_TOKEN_CREDENTIALS=prod(或 AZURE_TOKEN_CREDENTIALS=<specific_credential></specific_credential>),将凭据链限制为生产环境安全的凭据。
  2. 使用上下文管理器包装每个客户端,以便确定性地释放 HTTP 传输层、套接字和令牌缓存:
    • 同步模式:with <client>(...) as client:</client>
    • 异步模式:async with <client>(...) as client:</client> 以及 async with DefaultAzureCredential() as credential:(来自 azure.identity.aio

代码片段可能会简化此设置,但生产环境代码必须始终遵循这两条规则。

机密(Secrets)

SecretClient 设置

from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.keyvault.secrets import SecretClient

# 本地开发:使用 DefaultAzureCredential。生产环境:设置 AZURE_TOKEN_CREDENTIALS=prod 或 AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# 或者在生产环境中直接使用特定的凭据:
# 请参阅 https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
vault_url = "https://<vault-name>.vault.azure.net/"

with SecretClient(vault_url=vault_url, credential=credential) as client:
    # 所有机密操作均在此代码块内执行(见下方示例)
    ...
</vault-name></specific_credential>

机密操作

# 设置机密
secret = client.set_secret("database-password", "super-secret-value")
print(f"已创建: {secret.name}, 版本: {secret.properties.version}")

# 获取机密
secret = client.get_secret("database-password")
print(f"值: {secret.value}")

# 获取特定版本
secret = client.get_secret("database-password", version="abc123")

# 列出机密(仅名称,不含值)
for secret_properties in client.list_properties_of_secrets():
    print(f"机密: {secret_properties.name}")

# 列出版本
for version in client.list_properties_of_secret_versions("database-password"):
    print(f"版本: {version.version}, 创建时间: {version.created_on}")

# 删除机密(软删除)
poller = client.begin_delete_secret("database-password")
deleted_secret = poller.result()

# 清除(永久删除,若启用了软删除)
client.purge_deleted_secret("database-password")

# 恢复已删除的机密
client.begin_recover_deleted_secret("database-password").result()

密钥(Keys)

KeyClient 设置

from azure.identity import DefaultAzureCredential
from azure.keyvault.keys import KeyClient

credential = DefaultAzureCredential()
vault_url = "https://<vault-name>.vault.azure.net/"

with KeyClient(vault_url=vault_url, credential=credential) as client:
    # 所有密钥操作均在此代码块内执行(见下方示例)
    ...
</vault-name>

密钥操作

from azure.keyvault.keys import KeyType

# 创建 RSA 密钥
rsa_key = client.create_rsa_key("rsa-key", size=2048)

# 创建 EC 密钥
ec_key = client.create_ec_key("ec-key", curve="P-256")

# 获取密钥
key = client.get_key("rsa-key")
print(f"密钥类型: {key.key_type}")

# 列出密钥
for key_properties in client.list_properties_of_keys():
    print(f"密钥: {key_properties.name}")

# 删除密钥
poller = client.begin_delete_key("rsa-key")
deleted_key = poller.result()

加密操作

from azure.keyvault.keys.crypto import CryptographyClient, EncryptionAlgorithm

# 获取特定密钥的加密客户端
# crypto_client = CryptographyClient(key, credential=credential)
# 或者从密钥 ID 获取
with CryptographyClient(
    "https://<vault>.vault.azure.net/keys/<key-name>/<version>",
    credential=credential
) as crypto_client:
    # 加密
    plaintext = b"Hello, Key Vault!"
    result = crypto_client.encrypt(EncryptionAlgorithm.rsa_oaep, plaintext)
    ciphertext = result.ciphertext

    # 解密
    result = crypto_client.decrypt(EncryptionAlgorithm.rsa_oaep, ciphertext)
    decrypted = result.plaintext

    # 签名
    from azure.keyvault.keys.crypto import SignatureAlgorithm
    import hashlib

    digest = hashlib.sha256(b"data to sign").digest()
    result = crypto_client.sign(SignatureAlgorithm.rs256, digest)
    signature = result.signature

    # 验证
    result = crypto_client.verify(SignatureAlgorithm.rs256, digest, signature)
    print(f"有效: {result.is_valid}")
</version></key-name></vault>

证书(Certificates)

CertificateClient 设置

from azure.identity import DefaultAzureCredential
from azure.keyvault.certificates import CertificateClient, CertificatePolicy

credential = DefaultAzureCredential()
vault_url = "https://<vault-name>.vault.azure.net/"

with CertificateClient(vault_url=vault_url, credential=credential) as client:
    # 所有证书操作均在此代码块内执行(见下方示例)
    ...
</vault-name>

证书操作

# 创建自签名证书
policy = CertificatePolicy.get_default()
poller = client.begin_create_certificate("my-cert", policy=policy)
certificate = poller.result()

# 获取证书
certificate = client.get_certificate("my-cert")
print(f"指纹: {certificate.properties.x509_thumbprint.hex()}")

# 获取包含私钥的证书(作为机密)
from azure.keyvault.secrets import SecretClient
with SecretClient(vault_url=vault_url, credential=credential) as secret_client:
    cert_secret = secret_client.get_secret("my-cert")
    # cert_secret.value 包含 PEM 或 PKCS12 格式数据

# 列出证书
for cert in client.list_properties_of_certificates():
    print(f"证书: {cert.name}")

# 删除证书
poller = client.begin_delete_certificate("my-cert")
deleted = poller.result()

客户端类型表

客户端用途
`SecretClient``azure-keyvault-secrets`存储/检索机密
`KeyClient``azure-keyvault-keys`管理加密密钥
`CryptographyClient``azure-keyvault-keys`加密/解密/签名/验证
`CertificateClient``azure-keyvault-certificates`管理证书

异步客户端

from azure.identity.aio import DefaultAzureCredential
from azure.keyvault.secrets.aio import SecretClient

async def get_secret():
    async with DefaultAzureCredential() as credential:
        async with SecretClient(vault_url=vault_url, credential=credential) as client:
            secret = await client.get_secret("my-secret")
            print(secret.value)

import asyncio
asyncio.run(get_secret())

错误处理

from azure.core.exceptions import ResourceNotFoundError, HttpResponseError

try:
    secret = client.get_secret("nonexistent")
except ResourceNotFoundError:
    print("未找到机密")
except HttpResponseError as e:
    if e.status_code == 403:
        print("访问被拒绝 - 请检查 RBAC 权限")
    raise

最佳实践

  1. 选择同步或异步模式并保持一致。 不要在同一调用路径中混合使用 azure.xxx 同步客户端和 azure.xxx.aio 异步客户端。每个模块应选择一种模式。
  2. 始终为客户端和异步凭据使用上下文管理器。 将每个客户端包装在 with Client(...) as client:(同步)或 async with Client(...) as client:(异步)中。对于来自 azure.identity.aio 的异步 DefaultAzureCredential,也请使用 async with credential:,以便清理令牌和传输层。
  3. 在本地运行的代码中使用 DefaultAzureCredential 在 Azure 中运行的代码请使用特定的令牌凭据。
  4. 在 Azure 托管的应用程序中使用托管标识
  5. 启用软删除 以便进行恢复(默认启用)
  6. 使用基于角色的访问控制(RBAC) 替代访问策略,以实现更细粒度的控制
  7. 定期使用版本控制轮换机密
  8. 在应用服务/函数配置中使用 Key Vault 引用
  9. 适当缓存机密 以减少 API 调用次数
  10. 在高吞吐量场景中使用异步客户端
在 GitHub 上查看
---
name: azure-keyvault-py
description: Manage secrets, cryptographic keys, and certificates in Azure Key Vault using the Python SDK.
license: MIT
---

# Azure Key Vault SDK for Python

Secure storage and management for secrets, cryptographic keys, and certificates.

## Installation

```bash
# Secrets
pip install azure-keyvault-secrets azure-identity

# Keys (cryptographic operations)
pip install azure-keyvault-keys azure-identity

# Certificates
pip install azure-keyvault-certificates azure-identity

# All
pip install azure-keyvault-secrets azure-keyvault-keys azure-keyvault-certificates azure-identity
```

## Environment Variables

```bash
AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net/  # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```

## Authentication & Lifecycle

> **🔑 Two rules apply to every code sample below:**
>
> 1. **Prefer `DefaultAzureCredential`.** It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
>    - Local dev: `DefaultAzureCredential` works as-is.
>    - Production: set `AZURE_TOKEN_CREDENTIALS=prod` (or `AZURE_TOKEN_CREDENTIALS=<specific_credential>`) to constrain the credential chain to production-safe credentials.
> 2. **Wrap every client in a context manager** so HTTP transports, sockets, and token caches are released deterministically:
>    - Sync: `with <Client>(...) as client:`
>    - Async: `async with <Client>(...) as client:` **and** `async with DefaultAzureCredential() as credential:` (from `azure.identity.aio`)
>
> Snippets may abbreviate this setup, but production code should always follow both rules.

## Secrets

### SecretClient Setup

```python
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.keyvault.secrets import SecretClient

# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
vault_url = "https://<vault-name>.vault.azure.net/"

with SecretClient(vault_url=vault_url, credential=credential) as client:
    # All secret operations go inside this block (see examples below)
    ...
```

### Secret Operations

```python
# Set secret
secret = client.set_secret("database-password", "super-secret-value")
print(f"Created: {secret.name}, version: {secret.properties.version}")

# Get secret
secret = client.get_secret("database-password")
print(f"Value: {secret.value}")

# Get specific version
secret = client.get_secret("database-password", version="abc123")

# List secrets (names only, not values)
for secret_properties in client.list_properties_of_secrets():
    print(f"Secret: {secret_properties.name}")

# List versions
for version in client.list_properties_of_secret_versions("database-password"):
    print(f"Version: {version.version}, Created: {version.created_on}")

# Delete secret (soft delete)
poller = client.begin_delete_secret("database-password")
deleted_secret = poller.result()

# Purge (permanent delete, if soft-delete enabled)
client.purge_deleted_secret("database-password")

# Recover deleted secret
client.begin_recover_deleted_secret("database-password").result()
```

## Keys

### KeyClient Setup

```python
from azure.identity import DefaultAzureCredential
from azure.keyvault.keys import KeyClient

credential = DefaultAzureCredential()
vault_url = "https://<vault-name>.vault.azure.net/"

with KeyClient(vault_url=vault_url, credential=credential) as client:
    # All key operations go inside this block (see examples below)
    ...
```

### Key Operations

```python
from azure.keyvault.keys import KeyType

# Create RSA key
rsa_key = client.create_rsa_key("rsa-key", size=2048)

# Create EC key
ec_key = client.create_ec_key("ec-key", curve="P-256")

# Get key
key = client.get_key("rsa-key")
print(f"Key type: {key.key_type}")

# List keys
for key_properties in client.list_properties_of_keys():
    print(f"Key: {key_properties.name}")

# Delete key
poller = client.begin_delete_key("rsa-key")
deleted_key = poller.result()
```

### Cryptographic Operations

```python
from azure.keyvault.keys.crypto import CryptographyClient, EncryptionAlgorithm

# Get crypto client for a specific key
# crypto_client = CryptographyClient(key, credential=credential)
# Or from key ID
with CryptographyClient(
    "https://<vault>.vault.azure.net/keys/<key-name>/<version>",
    credential=credential
) as crypto_client:
    # Encrypt
    plaintext = b"Hello, Key Vault!"
    result = crypto_client.encrypt(EncryptionAlgorithm.rsa_oaep, plaintext)
    ciphertext = result.ciphertext

    # Decrypt
    result = crypto_client.decrypt(EncryptionAlgorithm.rsa_oaep, ciphertext)
    decrypted = result.plaintext

    # Sign
    from azure.keyvault.keys.crypto import SignatureAlgorithm
    import hashlib

    digest = hashlib.sha256(b"data to sign").digest()
    result = crypto_client.sign(SignatureAlgorithm.rs256, digest)
    signature = result.signature

    # Verify
    result = crypto_client.verify(SignatureAlgorithm.rs256, digest, signature)
    print(f"Valid: {result.is_valid}")
```

## Certificates

### CertificateClient Setup

```python
from azure.identity import DefaultAzureCredential
from azure.keyvault.certificates import CertificateClient, CertificatePolicy

credential = DefaultAzureCredential()
vault_url = "https://<vault-name>.vault.azure.net/"

with CertificateClient(vault_url=vault_url, credential=credential) as client:
    # All certificate operations go inside this block (see examples below)
    ...
```

### Certificate Operations

```python
# Create self-signed certificate
policy = CertificatePolicy.get_default()
poller = client.begin_create_certificate("my-cert", policy=policy)
certificate = poller.result()

# Get certificate
certificate = client.get_certificate("my-cert")
print(f"Thumbprint: {certificate.properties.x509_thumbprint.hex()}")

# Get certificate with private key (as secret)
from azure.keyvault.secrets import SecretClient
with SecretClient(vault_url=vault_url, credential=credential) as secret_client:
    cert_secret = secret_client.get_secret("my-cert")
    # cert_secret.value contains PEM or PKCS12

# List certificates
for cert in client.list_properties_of_certificates():
    print(f"Certificate: {cert.name}")

# Delete certificate
poller = client.begin_delete_certificate("my-cert")
deleted = poller.result()
```

## Client Types Table

| Client | Package | Purpose |
|--------|---------|---------|
| `SecretClient` | `azure-keyvault-secrets` | Store/retrieve secrets |
| `KeyClient` | `azure-keyvault-keys` | Manage cryptographic keys |
| `CryptographyClient` | `azure-keyvault-keys` | Encrypt/decrypt/sign/verify |
| `CertificateClient` | `azure-keyvault-certificates` | Manage certificates |

## Async Clients

```python
from azure.identity.aio import DefaultAzureCredential
from azure.keyvault.secrets.aio import SecretClient

async def get_secret():
    async with DefaultAzureCredential() as credential:
        async with SecretClient(vault_url=vault_url, credential=credential) as client:
            secret = await client.get_secret("my-secret")
            print(secret.value)

import asyncio
asyncio.run(get_secret())
```

## Error Handling

```python
from azure.core.exceptions import ResourceNotFoundError, HttpResponseError

try:
    secret = client.get_secret("nonexistent")
except ResourceNotFoundError:
    print("Secret not found")
except HttpResponseError as e:
    if e.status_code == 403:
        print("Access denied - check RBAC permissions")
    raise
```

## Best Practices

1. **Pick sync OR async and stay consistent.** Do not mix `azure.xxx` sync clients with `azure.xxx.aio` async clients in the same call path. Choose one mode per module.
2. **Always use context managers for clients and async credentials.** Wrap every client in `with Client(...) as client:` (sync) or `async with Client(...) as client:` (async). For async `DefaultAzureCredential` from `azure.identity.aio`, also use `async with credential:` so tokens and transports are cleaned up.
3. **Use `DefaultAzureCredential`** for code that runs locally. Use a specific token credential for code that runs in Azure.
4. **Use managed identity** in Azure-hosted applications
5. **Enable soft-delete** for recovery (enabled by default)
6. **Use RBAC** over access policies for fine-grained control
7. **Rotate secrets** regularly using versioning
8. **Use Key Vault references** in App Service/Functions config
9. **Cache secrets** appropriately to reduce API calls
10. **Use async clients** for high-throughput scenarios

所有文件

0 个文件

安装 azure-keyvault-py

将技能文件下载并解压至你的 .claude/skills/ 目录。

下载ZIP

克隆仓库并复制技能文件到您的项目中。

git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-python/skills/azure-keyvault-py # Copy SKILL.md to your .claude/skills/ directory

复制 复制
快速设置: 将技能文件夹复制到 .claude/skills/ 目录。Claude 将自动检测并使用该技能。

相关技能

gmgn-portfolio
更新时间 2026-07-01
zeroize-audit
更新时间 2026-07-01
device-integrity
更新时间 2026-06-29
flutter-use-http-package
更新时间 2026-06-30
OR