Azure Key Vault Secrets Java SDK for secret management. Use when storing, retrieving, or managing passwords, API keys, connection strings, or other sensitive configuration data.
npx mdskills install sickn33/azure-security-keyvault-secrets-java@sickn33? Sign in with GitHub to claim this listing.Comprehensive Java SDK reference with extensive examples but lacks AI agent workflow instructions
1---2name: azure-security-keyvault-secrets-java3description: Azure Key Vault Secrets Java SDK for secret management. Use when storing, retrieving, or managing passwords, API keys, connection strings, or other sensitive configuration data.4package: com.azure:azure-security-keyvault-secrets5---67# Azure Key Vault Secrets (Java)89Securely store and manage secrets like passwords, API keys, and connection strings.1011## Installation1213```xml14<dependency>15 <groupId>com.azure</groupId>16 <artifactId>azure-security-keyvault-secrets</artifactId>17 <version>4.9.0</version>18</dependency>19```2021## Client Creation2223```java24import com.azure.security.keyvault.secrets.SecretClient;25import com.azure.security.keyvault.secrets.SecretClientBuilder;26import com.azure.identity.DefaultAzureCredentialBuilder;2728// Sync client29SecretClient secretClient = new SecretClientBuilder()30 .vaultUrl("https://<vault-name>.vault.azure.net")31 .credential(new DefaultAzureCredentialBuilder().build())32 .buildClient();3334// Async client35SecretAsyncClient secretAsyncClient = new SecretClientBuilder()36 .vaultUrl("https://<vault-name>.vault.azure.net")37 .credential(new DefaultAzureCredentialBuilder().build())38 .buildAsyncClient();39```4041## Create/Set Secret4243```java44import com.azure.security.keyvault.secrets.models.KeyVaultSecret;4546// Simple secret47KeyVaultSecret secret = secretClient.setSecret("database-password", "P@ssw0rd123!");48System.out.println("Secret name: " + secret.getName());49System.out.println("Secret ID: " + secret.getId());5051// Secret with options52KeyVaultSecret secretWithOptions = secretClient.setSecret(53 new KeyVaultSecret("api-key", "sk_live_abc123xyz")54 .setProperties(new SecretProperties()55 .setContentType("application/json")56 .setExpiresOn(OffsetDateTime.now().plusYears(1))57 .setNotBefore(OffsetDateTime.now())58 .setEnabled(true)59 .setTags(Map.of(60 "environment", "production",61 "service", "payment-api"62 ))63 )64);65```6667## Get Secret6869```java70// Get latest version71KeyVaultSecret secret = secretClient.getSecret("database-password");72String value = secret.getValue();73System.out.println("Secret value: " + value);7475// Get specific version76KeyVaultSecret specificVersion = secretClient.getSecret("database-password", "<version-id>");7778// Get only properties (no value)79SecretProperties props = secretClient.getSecret("database-password").getProperties();80System.out.println("Enabled: " + props.isEnabled());81System.out.println("Created: " + props.getCreatedOn());82```8384## Update Secret Properties8586```java87// Get secret88KeyVaultSecret secret = secretClient.getSecret("api-key");8990// Update properties (cannot update value - create new version instead)91secret.getProperties()92 .setEnabled(false)93 .setExpiresOn(OffsetDateTime.now().plusMonths(6))94 .setTags(Map.of("status", "rotating"));9596SecretProperties updated = secretClient.updateSecretProperties(secret.getProperties());97System.out.println("Updated: " + updated.getUpdatedOn());98```99100## List Secrets101102```java103import com.azure.core.util.paging.PagedIterable;104import com.azure.security.keyvault.secrets.models.SecretProperties;105106// List all secrets (properties only, no values)107for (SecretProperties secretProps : secretClient.listPropertiesOfSecrets()) {108 System.out.println("Secret: " + secretProps.getName());109 System.out.println(" Enabled: " + secretProps.isEnabled());110 System.out.println(" Created: " + secretProps.getCreatedOn());111 System.out.println(" Content-Type: " + secretProps.getContentType());112113 // Get value if needed114 if (secretProps.isEnabled()) {115 KeyVaultSecret fullSecret = secretClient.getSecret(secretProps.getName());116 System.out.println(" Value: " + fullSecret.getValue().substring(0, 5) + "...");117 }118}119120// List versions of a secret121for (SecretProperties version : secretClient.listPropertiesOfSecretVersions("database-password")) {122 System.out.println("Version: " + version.getVersion());123 System.out.println("Created: " + version.getCreatedOn());124 System.out.println("Enabled: " + version.isEnabled());125}126```127128## Delete Secret129130```java131import com.azure.core.util.polling.SyncPoller;132import com.azure.security.keyvault.secrets.models.DeletedSecret;133134// Begin delete (returns poller for soft-delete enabled vaults)135SyncPoller<DeletedSecret, Void> deletePoller = secretClient.beginDeleteSecret("old-secret");136137// Wait for deletion138DeletedSecret deletedSecret = deletePoller.poll().getValue();139System.out.println("Deleted on: " + deletedSecret.getDeletedOn());140System.out.println("Scheduled purge: " + deletedSecret.getScheduledPurgeDate());141142deletePoller.waitForCompletion();143```144145## Recover Deleted Secret146147```java148// List deleted secrets149for (DeletedSecret deleted : secretClient.listDeletedSecrets()) {150 System.out.println("Deleted: " + deleted.getName());151 System.out.println("Deletion date: " + deleted.getDeletedOn());152}153154// Recover deleted secret155SyncPoller<KeyVaultSecret, Void> recoverPoller = secretClient.beginRecoverDeletedSecret("old-secret");156recoverPoller.waitForCompletion();157158KeyVaultSecret recovered = recoverPoller.getFinalResult();159System.out.println("Recovered: " + recovered.getName());160```161162## Purge Deleted Secret163164```java165// Permanently delete (cannot be recovered)166secretClient.purgeDeletedSecret("old-secret");167168// Get deleted secret info first169DeletedSecret deleted = secretClient.getDeletedSecret("old-secret");170System.out.println("Will purge: " + deleted.getName());171secretClient.purgeDeletedSecret("old-secret");172```173174## Backup and Restore175176```java177// Backup secret (all versions)178byte[] backup = secretClient.backupSecret("important-secret");179180// Save to file181Files.write(Paths.get("secret-backup.blob"), backup);182183// Restore from backup184byte[] backupData = Files.readAllBytes(Paths.get("secret-backup.blob"));185KeyVaultSecret restored = secretClient.restoreSecretBackup(backupData);186System.out.println("Restored: " + restored.getName());187```188189## Async Operations190191```java192SecretAsyncClient asyncClient = new SecretClientBuilder()193 .vaultUrl("https://<vault>.vault.azure.net")194 .credential(new DefaultAzureCredentialBuilder().build())195 .buildAsyncClient();196197// Set secret async198asyncClient.setSecret("async-secret", "async-value")199 .subscribe(200 secret -> System.out.println("Created: " + secret.getName()),201 error -> System.out.println("Error: " + error.getMessage())202 );203204// Get secret async205asyncClient.getSecret("async-secret")206 .subscribe(secret -> System.out.println("Value: " + secret.getValue()));207208// List secrets async209asyncClient.listPropertiesOfSecrets()210 .doOnNext(props -> System.out.println("Found: " + props.getName()))211 .subscribe();212```213214## Configuration Patterns215216### Load Multiple Secrets217218```java219public class ConfigLoader {220 private final SecretClient client;221222 public ConfigLoader(String vaultUrl) {223 this.client = new SecretClientBuilder()224 .vaultUrl(vaultUrl)225 .credential(new DefaultAzureCredentialBuilder().build())226 .buildClient();227 }228229 public Map<String, String> loadSecrets(List<String> secretNames) {230 Map<String, String> secrets = new HashMap<>();231 for (String name : secretNames) {232 try {233 KeyVaultSecret secret = client.getSecret(name);234 secrets.put(name, secret.getValue());235 } catch (ResourceNotFoundException e) {236 System.out.println("Secret not found: " + name);237 }238 }239 return secrets;240 }241}242243// Usage244ConfigLoader loader = new ConfigLoader("https://my-vault.vault.azure.net");245Map<String, String> config = loader.loadSecrets(246 Arrays.asList("db-connection-string", "api-key", "jwt-secret")247);248```249250### Secret Rotation Pattern251252```java253public void rotateSecret(String secretName, String newValue) {254 // Get current secret255 KeyVaultSecret current = secretClient.getSecret(secretName);256257 // Disable old version258 current.getProperties().setEnabled(false);259 secretClient.updateSecretProperties(current.getProperties());260261 // Create new version with new value262 KeyVaultSecret newSecret = secretClient.setSecret(secretName, newValue);263 System.out.println("Rotated to version: " + newSecret.getProperties().getVersion());264}265```266267## Error Handling268269```java270import com.azure.core.exception.HttpResponseException;271import com.azure.core.exception.ResourceNotFoundException;272273try {274 KeyVaultSecret secret = secretClient.getSecret("my-secret");275 System.out.println("Value: " + secret.getValue());276} catch (ResourceNotFoundException e) {277 System.out.println("Secret not found");278} catch (HttpResponseException e) {279 int status = e.getResponse().getStatusCode();280 if (status == 403) {281 System.out.println("Access denied - check permissions");282 } else if (status == 429) {283 System.out.println("Rate limited - retry later");284 } else {285 System.out.println("HTTP error: " + status);286 }287}288```289290## Secret Properties291292| Property | Description |293|----------|-------------|294| `name` | Secret name |295| `value` | Secret value (string) |296| `id` | Full identifier URL |297| `contentType` | MIME type hint |298| `enabled` | Whether secret can be retrieved |299| `notBefore` | Activation time |300| `expiresOn` | Expiration time |301| `createdOn` | Creation timestamp |302| `updatedOn` | Last update timestamp |303| `recoveryLevel` | Soft-delete recovery level |304| `tags` | User-defined metadata |305306## Environment Variables307308```bash309AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net310```311312## Best Practices3133141. **Enable Soft Delete** - Protects against accidental deletion3152. **Use Tags** - Tag secrets with environment, service, owner3163. **Set Expiration** - Use `setExpiresOn()` for credentials that should rotate3174. **Content Type** - Set `contentType` to indicate format (e.g., `application/json`)3185. **Version Management** - Don't delete old versions immediately during rotation3196. **Access Logging** - Enable diagnostic logging on Key Vault3207. **Least Privilege** - Use separate vaults for different environments321322## Common Secret Types323324```java325// Database connection string326secretClient.setSecret(new KeyVaultSecret("db-connection",327 "Server=myserver.database.windows.net;Database=mydb;...")328 .setProperties(new SecretProperties()329 .setContentType("text/plain")330 .setTags(Map.of("type", "connection-string"))));331332// API key333secretClient.setSecret(new KeyVaultSecret("stripe-api-key", "sk_live_...")334 .setProperties(new SecretProperties()335 .setContentType("text/plain")336 .setExpiresOn(OffsetDateTime.now().plusYears(1))));337338// JSON configuration339secretClient.setSecret(new KeyVaultSecret("app-config",340 "{\"endpoint\":\"https://...\",\"key\":\"...\"}")341 .setProperties(new SecretProperties()342 .setContentType("application/json")));343344// Certificate password345secretClient.setSecret(new KeyVaultSecret("cert-password", "CertP@ss!")346 .setProperties(new SecretProperties()347 .setContentType("text/plain")348 .setTags(Map.of("certificate", "my-cert"))));349```350351## Trigger Phrases352353- "Key Vault secrets Java", "secret management Java"354- "store password", "store API key", "connection string"355- "retrieve secret", "rotate secret"356- "Azure secrets", "vault secrets"357
Full transparency — inspect the skill content before installing.