Azure Security Keyvault Secrets Java

作者 microsoft354361d83247MIT收錄於 2026年10月8日更新於 2026年10月8日

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.

AI 產生的概覽

指導 Java 開發人員使用 Azure Key Vault Secrets SDK 儲存、擷取、更新和刪除祕密。

功能
本技能提供 Azure Key Vault Secrets SDK 的 Java 程式碼模式,涵蓋使用 Azure Identity 認證建立用戶端、設定和取得祕密、更新屬性、列出祕密及版本、軟刪除、復原、清除、備份與還原以及非同步作業。也包含載入多個祕密和輪替祕密的設定模式,以及錯誤處理和最佳做法。交付項目是 Java 應用程式中祕密管理的參考指引和程式碼片段。
適用情境
在建置或維護需要在 Azure Key Vault 中儲存、擷取或管理密碼、API 金鑰或連接字串等敏感性設定的 Java 應用程式時使用本技能。在實作祕密輪替、軟刪除復原或備份還原工作流程時也適用。
執行需求
需要 Java 和 com.azure:azure-security-keyvault-secrets Maven 相依性,以及用於驗證的 Azure Identity 程式庫。需要 Azure Key Vault 執行個體和適當的認證(例如 DefaultAzureCredential 或 ManagedIdentityCredential),並具備對 Azure 的網路存取。不包含指令碼,僅為指示文件。

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"

來源與署名

來源:microsoft/skills位於.github/plugins/azure-sdk-java/skills/azure-security-keyvault-secrets-java提交354361d

授權條款: MIT

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架