Azure Key Vault Python SDK

azure-keyvault-py
分类编程
作者Agentic Awesome Skills 社区
许可MIT
评分4.70/5
使用12.0K

Azure Key Vault Python SDK

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

安装

bash
# 机密 (Secrets)
pip install azure-keyvault-secrets azure-identity

密钥 (Keys,用于加密操作)

pip install azure-keyvault-keys azure-identity

证书 (Certificates)

pip install azure-keyvault-certificates azure-identity

安装全部

pip install azure-keyvault-secrets azure-keyvault-keys azure-keyvault-certificates azure-identity

环境变量

bash
AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net/

机密 (Secrets)

SecretClient 配置

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

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

client = SecretClient(vault_url=vault_url, credential=credential)

机密操作

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

获取机密

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

获取特定版本

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

列出机密(仅名称,不含值)

for secret_properties in client.list_properties_of_secrets(): print(f"Secret: {secret_properties.name}")

列出版本

for version in client.list_properties_of_secret_versions("database-password"): print(f"Version: {version.version}, Created: {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 配置

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

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

client = KeyClient(vault_url=vault_url, credential=credential)

密钥操作

python
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 type: {key.key_type}")

列出密钥

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

删除密钥

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

加密操作

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

为特定密钥获取加密客户端

crypto_client = CryptographyClient(key, credential=credential)

或通过密钥 ID 获取

crypto_client = CryptographyClient( "https://<vault>.vault.azure.net/keys/<key-name>/<version>", credential=credential )

加密

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
签名
python
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"Valid: {result.is_valid}")

证书 (Certificates)

CertificateClient 设置

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

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

client = CertificateClient(vault_url=vault_url, credential=credential)

证书操作

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

获取证书

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

获取包含私钥的证书(作为密钥/Secret)

from azure.keyvault.secrets import SecretClient secret_client = SecretClient(vault_url=vault_url, credential=credential) cert_secret = secret_client.get_secret("my-cert")

cert_secret.value 包含 PEM 或 PKCS12 格式

列出证书

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

删除证书

poller = client.begin_delete_certificate("my-cert") deleted = poller.result()

客户端类型对照表

| 客户端 | 软件包 | 用途 |
|--------|---------|---------|
| SecretClient | azure-keyvault-secrets | 存储/检索密钥 (Secrets) |
| KeyClient | azure-keyvault-keys | 管理加密密钥 (Keys) |
| CryptographyClient | azure-keyvault-keys | 加密/解密/签名/验证 |
| CertificateClient | azure-keyvault-certificates | 管理证书 (Certificates) |

异步客户端 (Async Clients)

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

async def get_secret():
credential = DefaultAzureCredential()
client = SecretClient(vault_url=vault_url, credential=credential)

async with client:
secret = await client.get_secret("my-secret")
print(secret.value)

import asyncio
asyncio.run(get_secret())

错误处理

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

最佳实践

1. 使用 DefaultAzureCredential 进行身份验证。
2. 在 Azure 托管的应用中使用 托管标识 (Managed Identity)
3. 启用 软删除 (Soft-delete) 以便恢复(默认已启用)。
4. 优先使用 RBAC 而非访问策略,以实现更细粒度的控制。
5. 利用版本控制定期 轮换密钥 (Rotate secrets)
6. 在 App Service/Functions 配置中使用 Key Vault 引用
7. 合理 缓存密钥 以减少 API 调用次数。
8. 在高吞吐量场景下使用 异步客户端

适用场景

本技能适用于执行概述中描述的工作流或操作。

局限性

  • 仅在任务与上述范围明确匹配时使用此技能。
  • 不要将输出结果视为针对特定环境的验证、测试或专家评审的替代方案。
  • 如果需要进一步明确,请停止并请求澄清。
缺少定义的输入、权限、安全边界或成功标准。