azure-security-keyvault-secrets-java
microsoft/skills
Stockez, récupérez et gérez des informations confidentielles telles que les mots de passe, les clés API et les chaînes de connexion à l'aide d'Azure Key Vault et du SDK Java.
...Développer toutSecrets d'Azure Key Vault (Java)
Stockez et gérez en toute sécurité des secrets tels que des mots de passe, des clés API et des chaînes de connexion.
Installation
com.azure
azure-security-keyvault-secrets
4.9.0
Création d'un client
import com.azure.core.credential.TokenCredential;
import com.azure.identity.AzureIdentityEnvVars;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.identity.ManagedIdentityCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
// Développement local : DefaultAzureCredential. Production : définissez AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=
TokenCredential credential = new DefaultAzureCredentialBuilder()
.requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
.build();
// Ou utilisez directement des informations d'identification spécifiques en production :
// Voir https://learn.microsoft.com/java/api/overview/azure/identity-readme?view=azure-java-stable#credential-classes
// TokenCredential credential = new ManagedIdentityCredentialBuilder().build();
// Client Sync
SecretClient secretClient = new SecretClientBuilder()
.vaultUrl("https://.vault.azure.net")
.credential(credential)
.buildClient();
// Client asynchrone
SecretAsyncClient secretAsyncClient = new SecretClientBuilder()
.vaultUrl("https://.vault.azure.net")
.credential(credential)
.buildAsyncClient();
Créer/définir un secret
import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
// Secret simple
KeyVaultSecret secret = secretClient.setSecret("database-password", "P@ssw0rd123!");
System.out.println("Nom du secret : " + secret.getName());
System.out.println("ID du secret : " + secret.getId());
// Secret avec options
KeyVaultSecret secretWithOptions = secretClient.setSecret(
new KeyVaultSecret("api-key", "sk_live_abc123xyz")
.setProperties(new SecretProperties()
.setContentType("application/json")
.setExpiresOn(OffsetDateTime.now().plusYears(1))
.setNotBefore(OffsetDateTime.now())
.setEnabled(true)
.setTags(Map.of(
"environment", "production",
"service", "payment-api"
))
)
);
Récupérer un secret
// Récupérer la dernière version
KeyVaultSecret secret = secretClient.getSecret("database-password");
String value = secret.getValue();
System.out.println("Valeur du secret : " + value);
// Récupérer une version spécifique
KeyVaultSecret specificVersion = secretClient.getSecret("database-password", "");
// Récupérer uniquement les propriétés (sans valeur)
SecretProperties props = secretClient.getSecret("database-password").getProperties();
System.out.println("Activé : " + props.isEnabled());
System.out.println("Créé le : " + props.getCreatedOn());
Mettre à jour les propriétés d’un secret
// Récupérer un secret
KeyVaultSecret secret = secretClient.getSecret("api-key");
// Mettre à jour les propriétés (impossible de mettre à jour la valeur – créer une nouvelle version à la place)
secret.getProperties()
.setEnabled(false)
.setExpiresOn(OffsetDateTime.now().plusMonths(6))
.setTags(Map.of("status", "rotating"));
SecretProperties updated = secretClient.updateSecretProperties(secret.getProperties());
System.out.println("Mis à jour : " + updated.getUpdatedOn());
Liste des secrets
import com.azure.core.util.paging.PagedIterable;
import com.azure.security.keyvault.secrets.models.SecretProperties;
// Lister tous les secrets (propriétés uniquement, pas de valeurs)
for (SecretProperties secretProps : secretClient.listPropertiesOfSecrets()) {
System.out.println("Secret : " + secretProps.getName());
System.out.println(" Activé : " + secretProps.isEnabled());
System.out.println(" Créé le : " + secretProps.getCreatedOn());
System.out.println(" Type de contenu : " + secretProps.getContentType());
// Récupérer la valeur si nécessaire
if (secretProps.isEnabled()) {
KeyVaultSecret fullSecret = secretClient.getSecret(secretProps.getName());
System.out.println(" Valeur : " + fullSecret.getValue().substring(0, 5) + "...");
}
}
// Lister les versions d'un secret
for (SecretProperties version : secretClient.listPropertiesOfSecretVersions("database-password")) {
System.out.println("Version : " + version.getVersion());
System.out.println("Créée le : " + version.getCreatedOn());
System.out.println("Activée : " + version.isEnabled());
}
Supprimer un secret
import com.azure.core.util.polling.SyncPoller;
import com.azure.security.keyvault.secrets.models.DeletedSecret;
// Lancer la suppression (renvoie un poller pour les coffres-forts où la suppression provisoire est activée)
SyncPoller deletePoller = secretClient.beginDeleteSecret("old-secret");
// Attente de la suppression
DeletedSecret deletedSecret = deletePoller.poll().getValue();
System.out.println("Supprimé le : " + deletedSecret.getDeletedOn());
System.out.println("Purge programmée : " + deletedSecret.getScheduledPurgeDate());
deletePoller.waitForCompletion();
Récupérer un secret supprimé
// Liste des secrets supprimés
for (DeletedSecret deleted : secretClient.listDeletedSecrets()) {
System.out.println("Supprimé : " + deleted.getName());
System.out.println("Date de suppression : " + deleted.getDeletedOn());
}
// Récupérer un secret supprimé
SyncPoller recoverPoller = secretClient.beginRecoverDeletedSecret("old-secret");
recoverPoller.waitForCompletion();
KeyVaultSecret recovered = recoverPoller.getFinalResult();
System.out.println("Récupéré : " + recovered.getName());
Supprimer définitivement un secret supprimé
// Supprimer définitivement (ne peut pas être récupéré)
secretClient.purgeDeletedSecret("old-secret");
// Récupérer d'abord les informations sur le secret supprimé
DeletedSecret deleted = secretClient.getDeletedSecret("old-secret");
System.out.println("Va purger : " + deleted.getName());
secretClient.purgeDeletedSecret("old-secret");
Sauvegarde et restauration
// Sauvegarder le secret (toutes les versions)
byte[] backup = secretClient.backupSecret("important-secret");
// Enregistrer dans un fichier
Files.write(Paths.get("secret-backup.blob"), backup);
// Restaurer à partir de la sauvegarde
byte[] backupData = Files.readAllBytes(Paths.get("secret-backup.blob"));
KeyVaultSecret restored = secretClient.restoreSecretBackup(backupData);
System.out.println("Restauré : " + restored.getName());
Opérations asynchrones
SecretAsyncClient asyncClient = new SecretClientBuilder()
.vaultUrl("https://.vault.azure.net")
.credential(new DefaultAzureCredentialBuilder().build())
.buildAsyncClient();
// Définir un secret asynchrone
asyncClient.setSecret("async-secret", "async-value")
.subscribe(
secret -> System.out.println("Créé : " + secret.getName()),
error -> System.out.println("Erreur : " + error.getMessage())
);
// Récupérer un secret de manière asynchrone
asyncClient.getSecret("async-secret")
.subscribe(secret -> System.out.println("Valeur : " + secret.getValue()));
// Lister les secrets de manière asynchrone
asyncClient.listPropertiesOfSecrets()
.doOnNext(props -> System.out.println("Trouvé : " + props.getName()))
.subscribe();
Modèles de configuration
Chargement de plusieurs secrets
public class ConfigLoader {
private final SecretClient client;
public ConfigLoader(String vaultUrl) {
this.client = new SecretClientBuilder()
.vaultUrl(vaultUrl)
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
}
public Map loadSecrets(List secretNames) {
Map secrets = new HashMap<>();
for (String name : secretNames) {
try {
KeyVaultSecret secret = client.getSecret(name);
secrets.put(name, secret.getValue());
} catch (ResourceNotFoundException e) {
System.out.println("Secret introuvable : " + name);
}
}
return secrets;
}
}
// Utilisation
ConfigLoader loader = new ConfigLoader("https://my-vault.vault.azure.net");
Map config = loader.loadSecrets(
Arrays.asList("db-connection-string", "api-key", "jwt-secret")
);
Modèle de rotation des secrets
public void rotateSecret(String secretName, String newValue) {
// Récupérer le secret actuel
KeyVaultSecret current = secretClient.getSecret(secretName);
// Désactiver l'ancienne version
current.getProperties().setEnabled(false);
secretClient.updateSecretProperties(current.getProperties());
// Créer la nouvelle version avec la nouvelle valeur
KeyVaultSecret newSecret = secretClient.setSecret(secretName, newValue);
System.out.println("Rotation effectuée vers la version : " + newSecret.getProperties().getVersion());
}
Gestion des erreurs
import com.azure.core.exception.HttpResponseException;
import com.azure.core.exception.ResourceNotFoundException;
try {
KeyVaultSecret secret = secretClient.getSecret("my-secret");
System.out.println("Valeur : " + secret.getValue());
} catch (ResourceNotFoundException e) {
System.out.println("Secret introuvable");
} catch (HttpResponseException e) {
int status = e.getResponse().getStatusCode();
if (status == 403) {
System.out.println("Accès refusé - vérifiez les autorisations");
} else if (status == 429) {
System.out.println("Limite de débit atteinte - réessayez plus tard");
} else {
System.out.println("Erreur HTTP : " + status);
}
}
Propriétés secrètes
| Propriété | Description |
|---|---|
nom |
Nom du secret |
valeur |
Valeur secrète (chaîne de caractères) |
id |
Identifiant complet URL |
contentType |
Indication du type MIME |
activé |
Indique si le secret peut être récupéré |
notBefore |
Heure d'activation |
expiresOn |
Date d'expiration |
createdOn |
Horodatage de création |
updatedOn |
Horodatage de la dernière mise à jour |
recoveryLevel |
Niveau de récupération après suppression temporaire |
balises |
Métadonnées définies par l'utilisateur |
Variables d’environnement
AZURE_KEYVAULT_URL=https://.vault.azure.net # Obligatoire pour l'URL du coffre-fort
AZURE_TOKEN_CREDENTIALS=prod # Obligatoire uniquement si DefaultAzureCredential est utilisé en production
Meilleures pratiques
- Activer la suppression temporaire - Protège contre les suppressions accidentelles
- Utilisez des balises: balisez les secrets en fonction de l’environnement, du service et du propriétaire
- Définir une date d’expiration – Utilisez
setExpiresOn()pour les informations d’identification devant faire l’objet d’une rotation - Type de contenu – Définissez
contentTypepour indiquer le format (par exemple,application/json) - Gestion des versions: ne supprimez pas immédiatement les anciennes versions lors de la rotation
- Journalisation des accès: activez la journalisation de diagnostic sur Key Vault
- Principe du moindre privilège - Utilisez des coffres distincts pour les différents environnements
Types de secrets courants
// Chaîne de connexion à la base de données
secretClient.setSecret(new KeyVaultSecret("db-connection",
"Server=myserver.database.windows.net;Database=mydb;...")
.setProperties(new SecretProperties()
.setContentType("text/plain")
.setTags(Map.of("type", "connection-string"))));
// Clé API
secretClient.setSecret(new KeyVaultSecret("stripe-api-key", "sk_live_...")
.setProperties(new SecretProperties()
.setContentType("text/plain")
.setExpiresOn(OffsetDateTime.now().plusYears(1))));
// Configuration JSON
secretClient.setSecret(new KeyVaultSecret("app-config",
"{\"endpoint\":\"https://...\",\"key\":\"...\"}")
.setProperties(new SecretProperties()
.setContentType("application/json")));
// Mot de passe du certificat
secretClient.setSecret(new KeyVaultSecret("cert-password", "CertP@ss!")
.setProperties(new SecretProperties()
.setContentType("text/plain")
.setTags(Map.of("certificate", "my-cert"))));
Expressions déclencheuses
- « Secrets Key Vault Java », « gestion des secrets Java »
- « stocker un mot de passe », « stocker une clé API », « chaîne de connexion »
- « récupérer un secret », « renouveler un secret »
- « secrets Azure », « secrets du coffre-fort »
---
name: azure-security-keyvault-secrets-java
description: Store, retrieve, and manage secrets like passwords, API keys, and connection strings using Azure Key Vault with the Java SDK.
license: MIT
---
# Azure Key Vault Secrets (Java)
Securely store and manage secrets like passwords, API keys, and connection strings.
## Installation
```xml
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-security-keyvault-secrets</artifactId>
<version>4.9.0</version>
</dependency>
```
## Client Creation
```java
import com.azure.core.credential.TokenCredential;
import com.azure.identity.AzureIdentityEnvVars;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.identity.ManagedIdentityCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
TokenCredential credential = new DefaultAzureCredentialBuilder()
.requireEnvVars(AzureIdentityEnvVars.AZURE_TOKEN_CREDENTIALS)
.build();
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/java/api/overview/azure/identity-readme?view=azure-java-stable#credential-classes
// TokenCredential credential = new ManagedIdentityCredentialBuilder().build();
// Sync client
SecretClient secretClient = new SecretClientBuilder()
.vaultUrl("https://<vault-name>.vault.azure.net")
.credential(credential)
.buildClient();
// Async client
SecretAsyncClient secretAsyncClient = new SecretClientBuilder()
.vaultUrl("https://<vault-name>.vault.azure.net")
.credential(credential)
.buildAsyncClient();
```
## Create/Set Secret
```java
import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
// Simple secret
KeyVaultSecret secret = secretClient.setSecret("database-password", "P@ssw0rd123!");
System.out.println("Secret name: " + secret.getName());
System.out.println("Secret ID: " + secret.getId());
// Secret with options
KeyVaultSecret secretWithOptions = secretClient.setSecret(
new KeyVaultSecret("api-key", "sk_live_abc123xyz")
.setProperties(new SecretProperties()
.setContentType("application/json")
.setExpiresOn(OffsetDateTime.now().plusYears(1))
.setNotBefore(OffsetDateTime.now())
.setEnabled(true)
.setTags(Map.of(
"environment", "production",
"service", "payment-api"
))
)
);
```
## Get Secret
```java
// Get latest version
KeyVaultSecret secret = secretClient.getSecret("database-password");
String value = secret.getValue();
System.out.println("Secret value: " + value);
// Get specific version
KeyVaultSecret specificVersion = secretClient.getSecret("database-password", "<version-id>");
// Get only properties (no value)
SecretProperties props = secretClient.getSecret("database-password").getProperties();
System.out.println("Enabled: " + props.isEnabled());
System.out.println("Created: " + props.getCreatedOn());
```
## Update Secret Properties
```java
// Get secret
KeyVaultSecret secret = secretClient.getSecret("api-key");
// Update properties (cannot update value - create new version instead)
secret.getProperties()
.setEnabled(false)
.setExpiresOn(OffsetDateTime.now().plusMonths(6))
.setTags(Map.of("status", "rotating"));
SecretProperties updated = secretClient.updateSecretProperties(secret.getProperties());
System.out.println("Updated: " + updated.getUpdatedOn());
```
## List Secrets
```java
import com.azure.core.util.paging.PagedIterable;
import com.azure.security.keyvault.secrets.models.SecretProperties;
// List all secrets (properties only, no values)
for (SecretProperties secretProps : secretClient.listPropertiesOfSecrets()) {
System.out.println("Secret: " + secretProps.getName());
System.out.println(" Enabled: " + secretProps.isEnabled());
System.out.println(" Created: " + secretProps.getCreatedOn());
System.out.println(" Content-Type: " + secretProps.getContentType());
// Get value if needed
if (secretProps.isEnabled()) {
KeyVaultSecret fullSecret = secretClient.getSecret(secretProps.getName());
System.out.println(" Value: " + fullSecret.getValue().substring(0, 5) + "...");
}
}
// List versions of a secret
for (SecretProperties version : secretClient.listPropertiesOfSecretVersions("database-password")) {
System.out.println("Version: " + version.getVersion());
System.out.println("Created: " + version.getCreatedOn());
System.out.println("Enabled: " + version.isEnabled());
}
```
## Delete Secret
```java
import com.azure.core.util.polling.SyncPoller;
import com.azure.security.keyvault.secrets.models.DeletedSecret;
// Begin delete (returns poller for soft-delete enabled vaults)
SyncPoller<DeletedSecret, Void> deletePoller = secretClient.beginDeleteSecret("old-secret");
// Wait for deletion
DeletedSecret deletedSecret = deletePoller.poll().getValue();
System.out.println("Deleted on: " + deletedSecret.getDeletedOn());
System.out.println("Scheduled purge: " + deletedSecret.getScheduledPurgeDate());
deletePoller.waitForCompletion();
```
## Recover Deleted Secret
```java
// List deleted secrets
for (DeletedSecret deleted : secretClient.listDeletedSecrets()) {
System.out.println("Deleted: " + deleted.getName());
System.out.println("Deletion date: " + deleted.getDeletedOn());
}
// Recover deleted secret
SyncPoller<KeyVaultSecret, Void> recoverPoller = secretClient.beginRecoverDeletedSecret("old-secret");
recoverPoller.waitForCompletion();
KeyVaultSecret recovered = recoverPoller.getFinalResult();
System.out.println("Recovered: " + recovered.getName());
```
## Purge Deleted Secret
```java
// Permanently delete (cannot be recovered)
secretClient.purgeDeletedSecret("old-secret");
// Get deleted secret info first
DeletedSecret deleted = secretClient.getDeletedSecret("old-secret");
System.out.println("Will purge: " + deleted.getName());
secretClient.purgeDeletedSecret("old-secret");
```
## Backup and Restore
```java
// Backup secret (all versions)
byte[] backup = secretClient.backupSecret("important-secret");
// Save to file
Files.write(Paths.get("secret-backup.blob"), backup);
// Restore from backup
byte[] backupData = Files.readAllBytes(Paths.get("secret-backup.blob"));
KeyVaultSecret restored = secretClient.restoreSecretBackup(backupData);
System.out.println("Restored: " + restored.getName());
```
## Async Operations
```java
SecretAsyncClient asyncClient = new SecretClientBuilder()
.vaultUrl("https://<vault>.vault.azure.net")
.credential(new DefaultAzureCredentialBuilder().build())
.buildAsyncClient();
// Set secret async
asyncClient.setSecret("async-secret", "async-value")
.subscribe(
secret -> System.out.println("Created: " + secret.getName()),
error -> System.out.println("Error: " + error.getMessage())
);
// Get secret async
asyncClient.getSecret("async-secret")
.subscribe(secret -> System.out.println("Value: " + secret.getValue()));
// List secrets async
asyncClient.listPropertiesOfSecrets()
.doOnNext(props -> System.out.println("Found: " + props.getName()))
.subscribe();
```
## Configuration Patterns
### Load Multiple Secrets
```java
public class ConfigLoader {
private final SecretClient client;
public ConfigLoader(String vaultUrl) {
this.client = new SecretClientBuilder()
.vaultUrl(vaultUrl)
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
}
public Map<String, String> loadSecrets(List<String> secretNames) {
Map<String, String> secrets = new HashMap<>();
for (String name : secretNames) {
try {
KeyVaultSecret secret = client.getSecret(name);
secrets.put(name, secret.getValue());
} catch (ResourceNotFoundException e) {
System.out.println("Secret not found: " + name);
}
}
return secrets;
}
}
// Usage
ConfigLoader loader = new ConfigLoader("https://my-vault.vault.azure.net");
Map<String, String> config = loader.loadSecrets(
Arrays.asList("db-connection-string", "api-key", "jwt-secret")
);
```
### Secret Rotation Pattern
```java
public void rotateSecret(String secretName, String newValue) {
// Get current secret
KeyVaultSecret current = secretClient.getSecret(secretName);
// Disable old version
current.getProperties().setEnabled(false);
secretClient.updateSecretProperties(current.getProperties());
// Create new version with new value
KeyVaultSecret newSecret = secretClient.setSecret(secretName, newValue);
System.out.println("Rotated to version: " + newSecret.getProperties().getVersion());
}
```
## Error Handling
```java
import com.azure.core.exception.HttpResponseException;
import com.azure.core.exception.ResourceNotFoundException;
try {
KeyVaultSecret secret = secretClient.getSecret("my-secret");
System.out.println("Value: " + secret.getValue());
} catch (ResourceNotFoundException e) {
System.out.println("Secret not found");
} catch (HttpResponseException e) {
int status = e.getResponse().getStatusCode();
if (status == 403) {
System.out.println("Access denied - check permissions");
} else if (status == 429) {
System.out.println("Rate limited - retry later");
} else {
System.out.println("HTTP error: " + status);
}
}
```
## Secret Properties
| Property | Description |
|----------|-------------|
| `name` | Secret name |
| `value` | Secret value (string) |
| `id` | Full identifier URL |
| `contentType` | MIME type hint |
| `enabled` | Whether secret can be retrieved |
| `notBefore` | Activation time |
| `expiresOn` | Expiration time |
| `createdOn` | Creation timestamp |
| `updatedOn` | Last update timestamp |
| `recoveryLevel` | Soft-delete recovery level |
| `tags` | User-defined metadata |
## Environment Variables
```bash
AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net # Required for vault URL
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```
## Best Practices
1. **Enable Soft Delete** - Protects against accidental deletion
2. **Use Tags** - Tag secrets with environment, service, owner
3. **Set Expiration** - Use `setExpiresOn()` for credentials that should rotate
4. **Content Type** - Set `contentType` to indicate format (e.g., `application/json`)
5. **Version Management** - Don't delete old versions immediately during rotation
6. **Access Logging** - Enable diagnostic logging on Key Vault
7. **Least Privilege** - Use separate vaults for different environments
## Common Secret Types
```java
// Database connection string
secretClient.setSecret(new KeyVaultSecret("db-connection",
"Server=myserver.database.windows.net;Database=mydb;...")
.setProperties(new SecretProperties()
.setContentType("text/plain")
.setTags(Map.of("type", "connection-string"))));
// API key
secretClient.setSecret(new KeyVaultSecret("stripe-api-key", "sk_live_...")
.setProperties(new SecretProperties()
.setContentType("text/plain")
.setExpiresOn(OffsetDateTime.now().plusYears(1))));
// JSON configuration
secretClient.setSecret(new KeyVaultSecret("app-config",
"{\"endpoint\":\"https://...\",\"key\":\"...\"}")
.setProperties(new SecretProperties()
.setContentType("application/json")));
// Certificate password
secretClient.setSecret(new KeyVaultSecret("cert-password", "CertP@ss!")
.setProperties(new SecretProperties()
.setContentType("text/plain")
.setTags(Map.of("certificate", "my-cert"))));
```
## Trigger Phrases
- "Key Vault secrets Java", "secret management Java"
- "store password", "store API key", "connection string"
- "retrieve secret", "rotate secret"
- "Azure secrets", "vault secrets"
Tous les fichiers
0 fichiersInstaller azure-security-keyvault-secrets-java
Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-java/skills/azure-security-keyvault-secrets-java # Copy SKILL.md to your .claude/skills/ directory
Copier





Maison
