Azure Key Vault Python SDK
Azure Key Vault Python SDK
用于机密、加密密钥和证书的安全存储与管理。
安装
# 机密 (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环境变量
AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net/机密 (Secrets)
SecretClient 配置
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)
机密操作
# 设置机密
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 配置
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)
密钥操作
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()加密操作
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.plaintextfrom 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 设置
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)
证书操作
# 创建自签名证书
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)
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())
错误处理
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. 在高吞吐量场景下使用 异步客户端。
适用场景
本技能适用于执行概述中描述的工作流或操作。局限性
- 仅在任务与上述范围明确匹配时使用此技能。
- 不要将输出结果视为针对特定环境的验证、测试或专家评审的替代方案。
- 如果需要进一步明确,请停止并请求澄清。