option
MaisonMaison Skill Sécurité azure-security-keyvault-secrets-java

azure-security-keyvault-secrets-java

microsoft/skills 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 tout
2
Heure mise à jour 18 septembre 2026

Secrets 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

  1. Activer la suppression temporaire - Protège contre les suppressions accidentelles
  2. Utilisez des balises: balisez les secrets en fonction de l’environnement, du service et du propriétaire
  3. Définir une date d’expiration – Utilisez setExpiresOn() pour les informations d’identification devant faire l’objet d’une rotation
  4. Type de contenu – Définissez contentType pour indiquer le format (par exemple, application/json)
  5. Gestion des versions: ne supprimez pas immédiatement les anciennes versions lors de la rotation
  6. Journalisation des accès: activez la journalisation de diagnostic sur Key Vault
  7. 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 »
Voir sur GitHub
---
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 fichiers

Installer 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 ZIP

Clonez 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 Copier
Configuration rapide: Copiez le dossier de la compétence dans .claude/skills/ Claude détectera automatiquement la compétence et l'utilisera

Compétences similaires

gmgn-portfolio
Heure mise à jour 1 juillet 2026
zeroize-audit
Heure mise à jour 1 juillet 2026
device-integrity
Heure mise à jour 29 juin 2026
flutter-use-http-package
Heure mise à jour 30 juin 2026
OR