azure-keyvault-py
microsoft/skills
Python SDK를 사용하여 Azure Key Vault에서 비밀, 암호화 키 및 인증서를 관리합니다.
...모든 것을 확장하십시오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.azure.net/ # 모든 인증 방식에 필수
AZURE_TOKEN_CREDENTIALS=prod # 프로덕션 환경에서 DefaultAzureCredential을 사용할 경우에만 필요
</보관소이름>인증 및 수명 주기
🔑 아래 모든 코드 샘플에 적용되는 두 가지 규칙:
DefaultAzureCredential을 선호하십시오. 코드 변경 없이 로컬(Azure CLI / VS Code / Developer CLI) 및 Azure(관리된 ID, 워크로드 ID)에서 작동합니다. 연결 문자열, 계정/API 키는 사용하지 마십시오. 이러한 키는 Entra 감사 및 회전 기능을 우회합니다.
- 로컬 개발:
DefaultAzureCredential은 그대로 작동합니다.- 프로덕션:
AZURE_TOKEN_CREDENTIALS=prod(또는AZURE_TOKEN_CREDENTIALS=<특정_credential></특정_credential>)를 설정하여 인증서 체인을 프로덕션 안전 인증서에 제한하십시오.- 모든 클라이언트를 컨텍스트 관리자로 감싸십시오. 이를 통해 HTTP 전송, 소켓 및 토큰 캐시가 결정적으로 해제됩니다:
- 동기:
with <클라이언트>(...) as client:</클라이언트>- 비동기:
async with <클라이언트>(...) as client:</클라이언트>및async with DefaultAzureCredential() as credential:(azure.identity.aio에서 가져옴)코드 조각은 이 설정을 축약할 수 있지만, 프로덕션 코드는 항상 두 규칙을 따라야 합니다.
비밀번호
SecretClient 설정
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.keyvault.secrets import SecretClient
# 로컬 개발: DefaultAzureCredential. 프로덕션: AZURE_TOKEN_CREDENTIALS=prod 또는 AZURE_TOKEN_CREDENTIALS=<특정_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.azure.net/"
with SecretClient(vault_url=vault_url, credential=credential) as client:
# 모든 비밀번호 작업은 이 블록 내부에서 수행됩니다(아래 예제 참조)
...
</보관소이름></특정_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()
키
KeyClient 설정
from azure.identity import DefaultAzureCredential
from azure.keyvault.keys import KeyClient
credential = DefaultAzureCredential()
vault_url = "https://<보관소이름>.vault.azure.net/"
with KeyClient(vault_url=vault_url, credential=credential) as client:
# 모든 키 작업은 이 블록 내부에서 수행됩니다(아래 예제 참조)
...
</보관소이름>키 작업
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.azure.net/keys/<키이름>/<버전>",
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}")
</버전></키이름></보관소>인증서
CertificateClient 설정
from azure.identity import DefaultAzureCredential
from azure.keyvault.certificates import CertificateClient, CertificatePolicy
credential = DefaultAzureCredential()
vault_url = "https://<보관소이름>.vault.azure.net/"
with CertificateClient(vault_url=vault_url, credential=credential) as client:
# 모든 인증서 작업은 이 블록 내부에서 수행됩니다(아래 예제 참조)
...
</보관소이름>인증서 작업
# 자체 서명 인증서 생성
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
모범 사례
- 동기 또는 비동기 중 하나를 선택하고 일관성을 유지하십시오. 동일한 호출 경로에서
azure.xxx동기 클라이언트와azure.xxx.aio비동기 클라이언트를 혼합하지 마십시오. 모듈당 하나의 모드를 선택하십시오. - 클라이언트 및 비동기 인증서에 항상 컨텍스트 관리자를 사용하십시오. 모든 클라이언트를
with Client(...) as client:(동기) 또는async with Client(...) as client:(비동기)로 감싸십시오.azure.identity.aio의 비동기DefaultAzureCredential의 경우 토큰과 전송을 정리하기 위해async with credential:도 사용하십시오. - 로컬에서 실행되는 코드에는
DefaultAzureCredential을 사용하십시오. Azure에서 실행되는 코드에는 특정 토큰 인증서를 사용하십시오. - Azure 호스팅 애플리케이션에서는 관리된 ID를 사용하십시오.
- 복구를 위해 소프트 삭제를 활성화하십시오(기본값으로 활성화됨).
- 세분화된 제어를 위해 액세스 정책 대신 RBAC를 사용하십시오.
- 버전 관리를 사용하여 비밀번호를 정기적으로 회전하십시오.
- App Service/Functions 구성에서 Key Vault 참조를 사용하십시오.
- API 호출을 줄이기 위해 적절하게 비밀번호를 캐시하십시오.
- 높은 처리량 시나리오에는 비동기 클라이언트를 사용하십시오.
---
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
복사





집
