Azure Security Keyvault Secrets Java

by microsoft354361d83247MITListed Oct 8, 2026Updated Oct 8, 2026

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.

FeaturedInstructions onlySoftware DevelopmentSecurity
AI-generated overview

Guides Java developers in using the Azure Key Vault Secrets SDK to store, retrieve, update, and delete secrets.

What it does
This skill provides Java code patterns for the Azure Key Vault Secrets SDK, covering client creation with Azure Identity credentials, setting and getting secrets, updating properties, listing secrets and versions, soft-delete, recovery, purge, backup and restore, and async operations. It also includes configuration patterns for loading multiple secrets and rotating secrets, plus error handling and best practices. The deliverable is reference guidance and code snippets for secret management in Java applications.
When to use it
Use this skill when building or maintaining Java applications that need to store, retrieve, or manage sensitive configuration such as passwords, API keys, or connection strings in Azure Key Vault. It is also relevant when implementing secret rotation, soft-delete recovery, or backup and restore workflows.
Requirements
Requires Java and the com.azure:azure-security-keyvault-secrets Maven dependency, plus Azure Identity libraries for authentication. Needs an Azure Key Vault instance and appropriate credentials (e.g., DefaultAzureCredential or ManagedIdentityCredential) with network access to Azure. No scripts are included; it is instructions only.

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 clientSecretClient secretClient = new SecretClientBuilder()    .vaultUrl("https://<vault-name>.vault.azure.net")    .credential(credential)    .buildClient();
// Async clientSecretAsyncClient 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 secretKeyVaultSecret secret = secretClient.setSecret("database-password", "P@ssw0rd123!");System.out.println("Secret name: " + secret.getName());System.out.println("Secret ID: " + secret.getId());
// Secret with optionsKeyVaultSecret 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 versionKeyVaultSecret secret = secretClient.getSecret("database-password");String value = secret.getValue();System.out.println("Secret value: " + value);
// Get specific versionKeyVaultSecret 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 secretKeyVaultSecret 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 secretfor (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 deletionDeletedSecret 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 secretsfor (DeletedSecret deleted : secretClient.listDeletedSecrets()) {    System.out.println("Deleted: " + deleted.getName());    System.out.println("Deletion date: " + deleted.getDeletedOn());}
// Recover deleted secretSyncPoller<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 firstDeletedSecret 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 fileFiles.write(Paths.get("secret-backup.blob"), backup);
// Restore from backupbyte[] 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 asyncasyncClient.setSecret("async-secret", "async-value")    .subscribe(        secret -> System.out.println("Created: " + secret.getName()),        error -> System.out.println("Error: " + error.getMessage())    );
// Get secret asyncasyncClient.getSecret("async-secret")    .subscribe(secret -> System.out.println("Value: " + secret.getValue()));
// List secrets asyncasyncClient.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;    }}
// UsageConfigLoader 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

PropertyDescription
nameSecret name
valueSecret value (string)
idFull identifier URL
contentTypeMIME type hint
enabledWhether secret can be retrieved
notBeforeActivation time
expiresOnExpiration time
createdOnCreation timestamp
updatedOnLast update timestamp
recoveryLevelSoft-delete recovery level
tagsUser-defined metadata

Environment Variables

bash
AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net  # Required for vault URLAZURE_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 stringsecretClient.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 keysecretClient.setSecret(new KeyVaultSecret("stripe-api-key", "sk_live_...")    .setProperties(new SecretProperties()        .setContentType("text/plain")        .setExpiresOn(OffsetDateTime.now().plusYears(1))));
// JSON configurationsecretClient.setSecret(new KeyVaultSecret("app-config",     "{\"endpoint\":\"https://...\",\"key\":\"...\"}")    .setProperties(new SecretProperties()        .setContentType("application/json")));
// Certificate passwordsecretClient.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"

Source and attribution

Source:microsoft/skillsin.github/plugins/azure-sdk-java/skills/azure-security-keyvault-secrets-javaat commit354361d

License: MIT

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal