azure-keyvault-py
microsoft/skills
Gestiona secretos, claves criptográficas y certificados en Azure Key Vault utilizando el SDK de Python.
...Expandir todoSDK de Azure Key Vault para Python
Almacenamiento seguro y gestión de secretos, claves criptográficas y certificados.
Instalación
# Secretos
pip install azure-keyvault-secrets azure-identity
# Claves (operaciones criptográficas)
pip install azure-keyvault-keys azure-identity
# Certificados
pip install azure-keyvault-certificates azure-identity
# Todos
pip install azure-keyvault-secrets azure-keyvault-keys azure-keyvault-certificates azure-identity
Variables de entorno
AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net/ # Obligatorio para todos los métodos de autenticación
AZURE_TOKEN_CREDENTIALS=prod # Obligatorio solo si se usa DefaultAzureCredential en producción
</vault-name>Autenticación y ciclo de vida
🔑 Dos reglas se aplican a cada ejemplo de código a continuación:
- Preferir
DefaultAzureCredential. Funciona localmente (Azure CLI / VS Code / Developer CLI) y en Azure (identidad administrada, identidad de carga de trabajo) sin cambios en el código. Evite las cadenas de conexión, claves de cuenta/API: estas omiten la auditoría y rotación de Entra.
- Desarrollo local:
DefaultAzureCredentialfunciona tal cual.- Producción: establezca
AZURE_TOKEN_CREDENTIALS=prod(oAZURE_TOKEN_CREDENTIALS=<specific_credential></specific_credential>) para restringir la cadena de credenciales a credenciales seguras para producción.- Envolver cada cliente en un gestor de contexto para que las transferencias HTTP, los sockets y las cachés de tokens se liberen de forma determinista:
- Síncrono:
with <client>(...) as client:</client>- Asíncrono:
async with <client>(...) as client:</client>yasync with DefaultAzureCredential() as credential:(deazure.identity.aio)Los fragmentos de código pueden abreviar esta configuración, pero el código de producción debe seguir siempre ambas reglas.
Secretos
Configuración de SecretClient
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.keyvault.secrets import SecretClient
# Desarrollo local: DefaultAzureCredential. Producción: establezca AZURE_TOKEN_CREDENTIALS=prod o AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# O use una credencial específica directamente en producción:
# Consulte 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:
# Todas las operaciones de secretos van dentro de este bloque (ver ejemplos a continuación)
...
</vault-name></specific_credential>Operaciones con secretos
# Establecer secreto
secret = client.set_secret("database-password", "super-secret-value")
print(f"Creado: {secret.name}, versión: {secret.properties.version}")
# Obtener secreto
secret = client.get_secret("database-password")
print(f"Valor: {secret.value}")
# Obtener versión específica
secret = client.get_secret("database-password", version="abc123")
# Listar secretos (solo nombres, no valores)
for secret_properties in client.list_properties_of_secrets():
print(f"Secreto: {secret_properties.name}")
# Listar versiones
for version in client.list_properties_of_secret_versions("database-password"):
print(f"Versión: {version.version}, Creado: {version.created_on}")
# Eliminar secreto (eliminación suave)
poller = client.begin_delete_secret("database-password")
deleted_secret = poller.result()
# Purgar (eliminación permanente, si la eliminación suave está habilitada)
client.purge_deleted_secret("database-password")
# Recuperar secreto eliminado
client.begin_recover_deleted_secret("database-password").result()
Claves
Configuración de 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:
# Todas las operaciones de claves van dentro de este bloque (ver ejemplos a continuación)
...
</vault-name>Operaciones con claves
from azure.keyvault.keys import KeyType
# Crear clave RSA
rsa_key = client.create_rsa_key("rsa-key", size=2048)
# Crear clave EC
ec_key = client.create_ec_key("ec-key", curve="P-256")
# Obtener clave
key = client.get_key("rsa-key")
print(f"Tipo de clave: {key.key_type}")
# Listar claves
for key_properties in client.list_properties_of_keys():
print(f"Clave: {key_properties.name}")
# Eliminar clave
poller = client.begin_delete_key("rsa-key")
deleted_key = poller.result()
Operaciones criptográficas
from azure.keyvault.keys.crypto import CryptographyClient, EncryptionAlgorithm
# Obtener cliente criptográfico para una clave específica
# crypto_client = CryptographyClient(key, credential=credential)
# O desde el identificador de clave
with CryptographyClient(
"https://<vault>.vault.azure.net/keys/<key-name>/<version>",
credential=credential
) as crypto_client:
# Cifrar
plaintext = b"Hello, Key Vault!"
result = crypto_client.encrypt(EncryptionAlgorithm.rsa_oaep, plaintext)
ciphertext = result.ciphertext
# Descifrar
result = crypto_client.decrypt(EncryptionAlgorithm.rsa_oaep, ciphertext)
decrypted = result.plaintext
# Firmar
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
# Verificar
result = crypto_client.verify(SignatureAlgorithm.rs256, digest, signature)
print(f"Válido: {result.is_valid}")
</version></key-name></vault>Certificados
Configuración de 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:
# Todas las operaciones de certificados van dentro de este bloque (ver ejemplos a continuación)
...
</vault-name>Operaciones con certificados
# Crear certificado autofirmado
policy = CertificatePolicy.get_default()
poller = client.begin_create_certificate("my-cert", policy=policy)
certificate = poller.result()
# Obtener certificado
certificate = client.get_certificate("my-cert")
print(f"Huella digital: {certificate.properties.x509_thumbprint.hex()}")
# Obtener certificado con clave privada (como secreto)
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 contiene PEM o PKCS12
# Listar certificados
for cert in client.list_properties_of_certificates():
print(f"Certificado: {cert.name}")
# Eliminar certificado
poller = client.begin_delete_certificate("my-cert")
deleted = poller.result()
Tabla de tipos de cliente
| Cliente | Paquete | Propósito |
|---|---|---|
| `SecretClient` | `azure-keyvault-secrets` | Almacenar/recuperar secretos |
| `KeyClient` | `azure-keyvault-keys` | Gestionar claves criptográficas |
| `CryptographyClient` | `azure-keyvault-keys` | Cifrar/descifrar/firmar/verificar |
| `CertificateClient` | `azure-keyvault-certificates` | Gestionar certificados |
Clientes asíncronos
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())
Manejo de errores
from azure.core.exceptions import ResourceNotFoundError, HttpResponseError
try:
secret = client.get_secret("nonexistent")
except ResourceNotFoundError:
print("Secreto no encontrado")
except HttpResponseError as e:
if e.status_code == 403:
print("Acceso denegado: compruebe los permisos de RBAC")
raise
Mejores prácticas
- Elegir síncrono O asíncrono y mantener la coherencia. No mezcle clientes síncronos
azure.xxxcon clientes asíncronosazure.xxx.aioen la misma ruta de llamada. Elija un modo por módulo. - Usar siempre gestores de contexto para clientes y credenciales asíncronas. Envolver cada cliente en
with Client(...) as client:(síncrono) oasync with Client(...) as client:(asíncrono). ParaDefaultAzureCredentialasíncrono deazure.identity.aio, también usarasync with credential:para que los tokens y las transferencias se limpien correctamente. - Usar
DefaultAzureCredentialpara código que se ejecuta localmente. Usar una credencial de token específica para código que se ejecuta en Azure. - Usar identidad administrada en aplicaciones alojadas en Azure
- Habilitar la eliminación suave para la recuperación (habilitada por defecto)
- Usar RBAC en lugar de políticas de acceso para un control fino
- Rotar secretos regularmente usando versionado
- Usar referencias de Key Vault en la configuración de App Service/Functions
- Almacenar en caché los secretos de manera adecuada para reducir las llamadas a la API
- Usar clientes asíncronos para escenarios de alto rendimiento
---
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
Todos los archivos
0 archivosInstalar azure-keyvault-py
Descarga y extrae los archivos de habilidades en tu directorio .claude/skills/.
Descargar ZIPClona el repositorio y copia los archivos de la habilidad a tu proyecto.
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
Copiar





Hogar
