[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EXQXZ7GR78Z2330GD6F8SA":3,"skill-same:01M6EXQXZ7GR78Z2330GD6F8SA":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":45,"ownerHtmlUrl":46,"ownerBlogUrl":6,"ownerDescription":47,"updatedAt":48,"install":49,"resources":62},"01M6EXQXZ7GR78Z2330GD6F8SA","azure-security-keyvault-secrets-java",null,"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.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fsickn33\u002Fazure-security-keyvault-secrets-java\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"security","azure","azure security keyvault secrets java","java","secrets","azure security","sdk","data","vault","api","azure-security","management","use","configuration","azure key vault","2026-11-10 10:12:30",false,"---\nname: azure-security-keyvault-secrets-java\ndescription: 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.\npackage: com.azure:azure-security-keyvault-secrets\n---\n\n# Azure Key Vault Secrets (Java)\n\nSecurely store and manage secrets like passwords, API keys, and connection strings.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-security-keyvault-secrets\u003C\u002FartifactId>\n    \u003Cversion>4.9.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Client Creation\n\n```java\nimport com.azure.security.keyvault.secrets.SecretClient;\nimport com.azure.security.keyvault.secrets.SecretClientBuilder;\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\n\u002F\u002F Sync client\nSecretClient secretClient = new SecretClientBuilder()\n    .vaultUrl(\"https:\u002F\u002F\u003Cvault-name>.vault.azure.net\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildClient();\n\n\u002F\u002F Async client\nSecretAsyncClient secretAsyncClient = new SecretClientBuilder()\n    .vaultUrl(\"https:\u002F\u002F\u003Cvault-name>.vault.azure.net\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildAsyncClient();\n```\n\n## Create\u002FSet Secret\n\n```java\nimport com.azure.security.keyvault.secrets.models.KeyVaultSecret;\n\n\u002F\u002F Simple secret\nKeyVaultSecret secret = secretClient.setSecret(\"database-password\", \"P@ssw0rd123!\");\nSystem.out.println(\"Secret name: \" + secret.getName());\nSystem.out.println(\"Secret ID: \" + secret.getId());\n\n\u002F\u002F Secret with options\nKeyVaultSecret secretWithOptions = secretClient.setSecret(\n    new KeyVaultSecret(\"api-key\", \"sk_live_abc123xyz\")\n        .setProperties(new SecretProperties()\n            .setContentType(\"application\u002Fjson\")\n            .setExpiresOn(OffsetDateTime.now().plusYears(1))\n            .setNotBefore(OffsetDateTime.now())\n            .setEnabled(true)\n            .setTags(Map.of(\n                \"environment\", \"production\",\n                \"service\", \"payment-api\"\n            ))\n        )\n);\n```\n\n## Get Secret\n\n```java\n\u002F\u002F Get latest version\nKeyVaultSecret secret = secretClient.getSecret(\"database-password\");\nString value = secret.getValue();\nSystem.out.println(\"Secret value: \" + value);\n\n\u002F\u002F Get specific version\nKeyVaultSecret specificVersion = secretClient.getSecret(\"database-password\", \"\u003Cversion-id>\");\n\n\u002F\u002F Get only properties (no value)\nSecretProperties props = secretClient.getSecret(\"database-password\").getProperties();\nSystem.out.println(\"Enabled: \" + props.isEnabled());\nSystem.out.println(\"Created: \" + props.getCreatedOn());\n```\n\n## Update Secret Properties\n\n```java\n\u002F\u002F Get secret\nKeyVaultSecret secret = secretClient.getSecret(\"api-key\");\n\n\u002F\u002F Update properties (cannot update value - create new version instead)\nsecret.getProperties()\n    .setEnabled(false)\n    .setExpiresOn(OffsetDateTime.now().plusMonths(6))\n    .setTags(Map.of(\"status\", \"rotating\"));\n\nSecretProperties updated = secretClient.updateSecretProperties(secret.getProperties());\nSystem.out.println(\"Updated: \" + updated.getUpdatedOn());\n```\n\n## List Secrets\n\n```java\nimport com.azure.core.util.paging.PagedIterable;\nimport com.azure.security.keyvault.secrets.models.SecretProperties;\n\n\u002F\u002F List all secrets (properties only, no values)\nfor (SecretProperties secretProps : secretClient.listPropertiesOfSecrets()) {\n    System.out.println(\"Secret: \" + secretProps.getName());\n    System.out.println(\"  Enabled: \" + secretProps.isEnabled());\n    System.out.println(\"  Created: \" + secretProps.getCreatedOn());\n    System.out.println(\"  Content-Type: \" + secretProps.getContentType());\n    \n    \u002F\u002F Get value if needed\n    if (secretProps.isEnabled()) {\n        KeyVaultSecret fullSecret = secretClient.getSecret(secretProps.getName());\n        System.out.println(\"  Value: \" + fullSecret.getValue().substring(0, 5) + \"...\");\n    }\n}\n\n\u002F\u002F List versions of a secret\nfor (SecretProperties version : secretClient.listPropertiesOfSecretVersions(\"database-password\")) {\n    System.out.println(\"Version: \" + version.getVersion());\n    System.out.println(\"Created: \" + version.getCreatedOn());\n    System.out.println(\"Enabled: \" + version.isEnabled());\n}\n```\n\n## Delete Secret\n\n```java\nimport com.azure.core.util.polling.SyncPoller;\nimport com.azure.security.keyvault.secrets.models.DeletedSecret;\n\n\u002F\u002F Begin delete (returns poller for soft-delete enabled vaults)\nSyncPoller\u003CDeletedSecret, Void> deletePoller = secretClient.beginDeleteSecret(\"old-secret\");\n\n\u002F\u002F Wait for deletion\nDeletedSecret deletedSecret = deletePoller.poll().getValue();\nSystem.out.println(\"Deleted on: \" + deletedSecret.getDeletedOn());\nSystem.out.println(\"Scheduled purge: \" + deletedSecret.getScheduledPurgeDate());\n\ndeletePoller.waitForCompletion();\n```\n\n## Recover Deleted Secret\n\n```java\n\u002F\u002F List deleted secrets\nfor (DeletedSecret deleted : secretClient.listDeletedSecrets()) {\n    System.out.println(\"Deleted: \" + deleted.getName());\n    System.out.println(\"Deletion date: \" + deleted.getDeletedOn());\n}\n\n\u002F\u002F Recover deleted secret\nSyncPoller\u003CKeyVaultSecret, Void> recoverPoller = secretClient.beginRecoverDeletedSecret(\"old-secret\");\nrecoverPoller.waitForCompletion();\n\nKeyVaultSecret recovered = recoverPoller.getFinalResult();\nSystem.out.println(\"Recovered: \" + recovered.getName());\n```\n\n## Purge Deleted Secret\n\n```java\n\u002F\u002F Permanently delete (cannot be recovered)\nsecretClient.purgeDeletedSecret(\"old-secret\");\n\n\u002F\u002F Get deleted secret info first\nDeletedSecret deleted = secretClient.getDeletedSecret(\"old-secret\");\nSystem.out.println(\"Will purge: \" + deleted.getName());\nsecretClient.purgeDeletedSecret(\"old-secret\");\n```\n\n## Backup and Restore\n\n```java\n\u002F\u002F Backup secret (all versions)\nbyte[] backup = secretClient.backupSecret(\"important-secret\");\n\n\u002F\u002F Save to file\nFiles.write(Paths.get(\"secret-backup.blob\"), backup);\n\n\u002F\u002F Restore from backup\nbyte[] backupData = Files.readAllBytes(Paths.get(\"secret-backup.blob\"));\nKeyVaultSecret restored = secretClient.restoreSecretBackup(backupData);\nSystem.out.println(\"Restored: \" + restored.getName());\n```\n\n## Async Operations\n\n```java\nSecretAsyncClient asyncClient = new SecretClientBuilder()\n    .vaultUrl(\"https:\u002F\u002F\u003Cvault>.vault.azure.net\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildAsyncClient();\n\n\u002F\u002F Set secret async\nasyncClient.setSecret(\"async-secret\", \"async-value\")\n    .subscribe(\n        secret -> System.out.println(\"Created: \" + secret.getName()),\n        error -> System.out.println(\"Error: \" + error.getMessage())\n    );\n\n\u002F\u002F Get secret async\nasyncClient.getSecret(\"async-secret\")\n    .subscribe(secret -> System.out.println(\"Value: \" + secret.getValue()));\n\n\u002F\u002F List secrets async\nasyncClient.listPropertiesOfSecrets()\n    .doOnNext(props -> System.out.println(\"Found: \" + props.getName()))\n    .subscribe();\n```\n\n## Configuration Patterns\n\n### Load Multiple Secrets\n\n```java\npublic class ConfigLoader {\n    private final SecretClient client;\n    \n    public ConfigLoader(String vaultUrl) {\n        this.client = new SecretClientBuilder()\n            .vaultUrl(vaultUrl)\n            .credential(new DefaultAzureCredentialBuilder().build())\n            .buildClient();\n    }\n    \n    public Map\u003CString, String> loadSecrets(List\u003CString> secretNames) {\n        Map\u003CString, String> secrets = new HashMap\u003C>();\n        for (String name : secretNames) {\n            try {\n                KeyVaultSecret secret = client.getSecret(name);\n                secrets.put(name, secret.getValue());\n            } catch (ResourceNotFoundException e) {\n                System.out.println(\"Secret not found: \" + name);\n            }\n        }\n        return secrets;\n    }\n}\n\n\u002F\u002F Usage\nConfigLoader loader = new ConfigLoader(\"https:\u002F\u002Fmy-vault.vault.azure.net\");\nMap\u003CString, String> config = loader.loadSecrets(\n    Arrays.asList(\"db-connection-string\", \"api-key\", \"jwt-secret\")\n);\n```\n\n### Secret Rotation Pattern\n\n```java\npublic void rotateSecret(String secretName, String newValue) {\n    \u002F\u002F Get current secret\n    KeyVaultSecret current = secretClient.getSecret(secretName);\n    \n    \u002F\u002F Disable old version\n    current.getProperties().setEnabled(false);\n    secretClient.updateSecretProperties(current.getProperties());\n    \n    \u002F\u002F Create new version with new value\n    KeyVaultSecret newSecret = secretClient.setSecret(secretName, newValue);\n    System.out.println(\"Rotated to version: \" + newSecret.getProperties().getVersion());\n}\n```\n\n## Error Handling\n\n```java\nimport com.azure.core.exception.HttpResponseException;\nimport com.azure.core.exception.ResourceNotFoundException;\n\ntry {\n    KeyVaultSecret secret = secretClient.getSecret(\"my-secret\");\n    System.out.println(\"Value: \" + secret.getValue());\n} catch (ResourceNotFoundException e) {\n    System.out.println(\"Secret not found\");\n} catch (HttpResponseException e) {\n    int status = e.getResponse().getStatusCode();\n    if (status == 403) {\n        System.out.println(\"Access denied - check permissions\");\n    } else if (status == 429) {\n        System.out.println(\"Rate limited - retry later\");\n    } else {\n        System.out.println(\"HTTP error: \" + status);\n    }\n}\n```\n\n## Secret Properties\n\n| Property | Description |\n|----------|-------------|\n| `name` | Secret name |\n| `value` | Secret value (string) |\n| `id` | Full identifier URL |\n| `contentType` | MIME type hint |\n| `enabled` | Whether secret can be retrieved |\n| `notBefore` | Activation time |\n| `expiresOn` | Expiration time |\n| `createdOn` | Creation timestamp |\n| `updatedOn` | Last update timestamp |\n| `recoveryLevel` | Soft-delete recovery level |\n| `tags` | User-defined metadata |\n\n## Environment Variables\n\n```bash\nAZURE_KEYVAULT_URL=https:\u002F\u002F\u003Cvault-name>.vault.azure.net\n```\n\n## Best Practices\n\n1. **Enable Soft Delete** - Protects against accidental deletion\n2. **Use Tags** - Tag secrets with environment, service, owner\n3. **Set Expiration** - Use `setExpiresOn()` for credentials that should rotate\n4. **Content Type** - Set `contentType` to indicate format (e.g., `application\u002Fjson`)\n5. **Version Management** - Don't delete old versions immediately during rotation\n6. **Access Logging** - Enable diagnostic logging on Key Vault\n7. **Least Privilege** - Use separate vaults for different environments\n\n## Common Secret Types\n\n```java\n\u002F\u002F Database connection string\nsecretClient.setSecret(new KeyVaultSecret(\"db-connection\", \n    \"Server=myserver.database.windows.net;Database=mydb;...\")\n    .setProperties(new SecretProperties()\n        .setContentType(\"text\u002Fplain\")\n        .setTags(Map.of(\"type\", \"connection-string\"))));\n\n\u002F\u002F API key\nsecretClient.setSecret(new KeyVaultSecret(\"stripe-api-key\", \"sk_live_...\")\n    .setProperties(new SecretProperties()\n        .setContentType(\"text\u002Fplain\")\n        .setExpiresOn(OffsetDateTime.now().plusYears(1))));\n\n\u002F\u002F JSON configuration\nsecretClient.setSecret(new KeyVaultSecret(\"app-config\", \n    \"{\\\"endpoint\\\":\\\"https:\u002F\u002F...\\\",\\\"key\\\":\\\"...\\\"}\")\n    .setProperties(new SecretProperties()\n        .setContentType(\"application\u002Fjson\")));\n\n\u002F\u002F Certificate password\nsecretClient.setSecret(new KeyVaultSecret(\"cert-password\", \"CertP@ss!\")\n    .setProperties(new SecretProperties()\n        .setContentType(\"text\u002Fplain\")\n        .setTags(Map.of(\"certificate\", \"my-cert\"))));\n```\n\n## Trigger Phrases\n\n- \"Key Vault secrets Java\", \"secret management Java\"\n- \"store password\", \"store API key\", \"connection string\"\n- \"retrieve secret\", \"rotate secret\"\n- \"Azure secrets\", \"vault secrets\"\n","# Azure Key Vault Secrets (Java)\n\nSecurely store and manage secrets like passwords, API keys, and connection strings.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-security-keyvault-secrets\u003C\u002FartifactId>\n    \u003Cversion>4.9.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Client Creation\n\n```java\nimport com.azure.security.keyvault.secrets.SecretClient;\nimport com.azure.security.keyvault.secrets.SecretClientBuilder;\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\n\u002F\u002F Sync client\nSecretClient secretClient = new SecretClientBuilder()\n    .vaultUrl(\"https:\u002F\u002F\u003Cvault-name>.vault.azure.net\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildClient();\n\n\u002F\u002F Async client\nSecretAsyncClient secretAsyncClient = new SecretClientBuilder()\n    .vaultUrl(\"https:\u002F\u002F\u003Cvault-name>.vault.azure.net\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildAsyncClient();\n```\n\n## Create\u002FSet Secret\n\n```java\nimport com.azure.security.keyvault.secrets.models.KeyVaultSecret;\n\n\u002F\u002F Simple secret\nKeyVaultSecret secret = secretClient.setSecret(\"database-password\", \"P@ssw0rd123!\");\nSystem.out.println(\"Secret name: \" + secret.getName());\nSystem.out.println(\"Secret ID: \" + secret.getId());\n\n\u002F\u002F Secret with options\nKeyVaultSecret secretWithOptions = secretClient.setSecret(\n    new KeyVaultSecret(\"api-key\", \"sk_live_abc123xyz\")\n        .setProperties(new SecretProperties()\n            .setContentType(\"application\u002Fjson\")\n            .setExpiresOn(OffsetDateTime.now().plusYears(1))\n            .setNotBefore(OffsetDateTime.now())\n            .setEnabled(true)\n            .setTags(Map.of(\n                \"environment\", \"production\",\n                \"service\", \"payment-api\"\n            ))\n        )\n);\n```\n\n## Get Secret\n\n```java\n\u002F\u002F Get latest version\nKeyVaultSecret secret = secretClient.getSecret(\"database-password\");\nString value = secret.getValue();\nSystem.out.println(\"Secret value: \" + value);\n\n\u002F\u002F Get specific version\nKeyVaultSecret specificVersion = secretClient.getSecret(\"database-password\", \"\u003Cversion-id>\");\n\n\u002F\u002F Get only properties (no value)\nSecretProperties props = secretClient.getSecret(\"database-password\").getProperties();\nSystem.out.println(\"Enabled: \" + props.isEnabled());\nSystem.out.println(\"Created: \" + props.getCreatedOn());\n```\n\n## Update Secret Properties\n\n```java\n\u002F\u002F Get secret\nKeyVaultSecret secret = secretClient.getSecret(\"api-key\");\n\n\u002F\u002F Update properties (cannot update value - create new version instead)\nsecret.getProperties()\n    .setEnabled(false)\n    .setExpiresOn(OffsetDateTime.now().plusMonths(6))\n    .setTags(Map.of(\"status\", \"rotating\"));\n\nSecretProperties updated = secretClient.updateSecretProperties(secret.getProperties());\nSystem.out.println(\"Updated: \" + updated.getUpdatedOn());\n```\n\n## List Secrets\n\n```java\nimport com.azure.core.util.paging.PagedIterable;\nimport com.azure.security.keyvault.secrets.models.SecretProperties;\n\n\u002F\u002F List all secrets (properties only, no values)\nfor (SecretProperties secretProps : secretClient.listPropertiesOfSecrets()) {\n    System.out.println(\"Secret: \" + secretProps.getName());\n    System.out.println(\"  Enabled: \" + secretProps.isEnabled());\n    System.out.println(\"  Created: \" + secretProps.getCreatedOn());\n    System.out.println(\"  Content-Type: \" + secretProps.getContentType());\n    \n    \u002F\u002F Get value if needed\n    if (secretProps.isEnabled()) {\n        KeyVaultSecret fullSecret = secretClient.getSecret(secretProps.getName());\n        System.out.println(\"  Value: \" + fullSecret.getValue().substring(0, 5) + \"...\");\n    }\n}\n\n\u002F\u002F List versions of a secret\nfor (SecretProperties version : secretClient.listPropertiesOfSecretVersions(\"database-password\")) {\n    System.out.println(\"Version: \" + version.getVersion());\n    System.out.println(\"Created: \" + version.getCreatedOn());\n    System.out.println(\"Enabled: \" + version.isEnabled());\n}\n```\n\n## Delete Secret\n\n```java\nimport com.azure.core.util.polling.SyncPoller;\nimport com.azure.security.keyvault.secrets.models.DeletedSecret;\n\n\u002F\u002F Begin delete (returns poller for soft-delete enabled vaults)\nSyncPoller\u003CDeletedSecret, Void> deletePoller = secretClient.beginDeleteSecret(\"old-secret\");\n\n\u002F\u002F Wait for deletion\nDeletedSecret deletedSecret = deletePoller.poll().getValue();\nSystem.out.println(\"Deleted on: \" + deletedSecret.getDeletedOn());\nSystem.out.println(\"Scheduled purge: \" + deletedSecret.getScheduledPurgeDate());\n\ndeletePoller.waitForCompletion();\n```\n\n## Recover Deleted Secret\n\n```java\n\u002F\u002F List deleted secrets\nfor (DeletedSecret deleted : secretClient.listDeletedSecrets()) {\n    System.out.println(\"Deleted: \" + deleted.getName());\n    System.out.println(\"Deletion date: \" + deleted.getDeletedOn());\n}\n\n\u002F\u002F Recover deleted secret\nSyncPoller\u003CKeyVaultSecret, Void> recoverPoller = secretClient.beginRecoverDeletedSecret(\"old-secret\");\nrecoverPoller.waitForCompletion();\n\nKeyVaultSecret recovered = recoverPoller.getFinalResult();\nSystem.out.println(\"Recovered: \" + recovered.getName());\n```\n\n## Purge Deleted Secret\n\n```java\n\u002F\u002F Permanently delete (cannot be recovered)\nsecretClient.purgeDeletedSecret(\"old-secret\");\n\n\u002F\u002F Get deleted secret info first\nDeletedSecret deleted = secretClient.getDeletedSecret(\"old-secret\");\nSystem.out.println(\"Will purge: \" + deleted.getName());\nsecretClient.purgeDeletedSecret(\"old-secret\");\n```\n\n## Backup and Restore\n\n```java\n\u002F\u002F Backup secret (all versions)\nbyte[] backup = secretClient.backupSecret(\"important-secret\");\n\n\u002F\u002F Save to file\nFiles.write(Paths.get(\"secret-backup.blob\"), backup);\n\n\u002F\u002F Restore from backup\nbyte[] backupData = Files.readAllBytes(Paths.get(\"secret-backup.blob\"));\nKeyVaultSecret restored = secretClient.restoreSecretBackup(backupData);\nSystem.out.println(\"Restored: \" + restored.getName());\n```\n\n## Async Operations\n\n```java\nSecretAsyncClient asyncClient = new SecretClientBuilder()\n    .vaultUrl(\"https:\u002F\u002F\u003Cvault>.vault.azure.net\")\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .buildAsyncClient();\n\n\u002F\u002F Set secret async\nasyncClient.setSecret(\"async-secret\", \"async-value\")\n    .subscribe(\n        secret -> System.out.println(\"Created: \" + secret.getName()),\n        error -> System.out.println(\"Error: \" + error.getMessage())\n    );\n\n\u002F\u002F Get secret async\nasyncClient.getSecret(\"async-secret\")\n    .subscribe(secret -> System.out.println(\"Value: \" + secret.getValue()));\n\n\u002F\u002F List secrets async\nasyncClient.listPropertiesOfSecrets()\n    .doOnNext(props -> System.out.println(\"Found: \" + props.getName()))\n    .subscribe();\n```\n\n## Configuration Patterns\n\n### Load Multiple Secrets\n\n```java\npublic class ConfigLoader {\n    private final SecretClient client;\n    \n    public ConfigLoader(String vaultUrl) {\n        this.client = new SecretClientBuilder()\n            .vaultUrl(vaultUrl)\n            .credential(new DefaultAzureCredentialBuilder().build())\n            .buildClient();\n    }\n    \n    public Map\u003CString, String> loadSecrets(List\u003CString> secretNames) {\n        Map\u003CString, String> secrets = new HashMap\u003C>();\n        for (String name : secretNames) {\n            try {\n                KeyVaultSecret secret = client.getSecret(name);\n                secrets.put(name, secret.getValue());\n            } catch (ResourceNotFoundException e) {\n                System.out.println(\"Secret not found: \" + name);\n            }\n        }\n        return secrets;\n    }\n}\n\n\u002F\u002F Usage\nConfigLoader loader = new ConfigLoader(\"https:\u002F\u002Fmy-vault.vault.azure.net\");\nMap\u003CString, String> config = loader.loadSecrets(\n    Arrays.asList(\"db-connection-string\", \"api-key\", \"jwt-secret\")\n);\n```\n\n### Secret Rotation Pattern\n\n```java\npublic void rotateSecret(String secretName, String newValue) {\n    \u002F\u002F Get current secret\n    KeyVaultSecret current = secretClient.getSecret(secretName);\n    \n    \u002F\u002F Disable old version\n    current.getProperties().setEnabled(false);\n    secretClient.updateSecretProperties(current.getProperties());\n    \n    \u002F\u002F Create new version with new value\n    KeyVaultSecret newSecret = secretClient.setSecret(secretName, newValue);\n    System.out.println(\"Rotated to version: \" + newSecret.getProperties().getVersion());\n}\n```\n\n## Error Handling\n\n```java\nimport com.azure.core.exception.HttpResponseException;\nimport com.azure.core.exception.ResourceNotFoundException;\n\ntry {\n    KeyVaultSecret secret = secretClient.getSecret(\"my-secret\");\n    System.out.println(\"Value: \" + secret.getValue());\n} catch (ResourceNotFoundException e) {\n    System.out.println(\"Secret not found\");\n} catch (HttpResponseException e) {\n    int status = e.getResponse().getStatusCode();\n    if (status == 403) {\n        System.out.println(\"Access denied - check permissions\");\n    } else if (status == 429) {\n        System.out.println(\"Rate limited - retry later\");\n    } else {\n        System.out.println(\"HTTP error: \" + status);\n    }\n}\n```\n\n## Secret Properties\n\n| Property | Description |\n|----------|-------------|\n| `name` | Secret name |\n| `value` | Secret value (string) |\n| `id` | Full identifier URL |\n| `contentType` | MIME type hint |\n| `enabled` | Whether secret can be retrieved |\n| `notBefore` | Activation time |\n| `expiresOn` | Expiration time |\n| `createdOn` | Creation timestamp |\n| `updatedOn` | Last update timestamp |\n| `recoveryLevel` | Soft-delete recovery level |\n| `tags` | User-defined metadata |\n\n## Environment Variables\n\n```bash\nAZURE_KEYVAULT_URL=https:\u002F\u002F\u003Cvault-name>.vault.azure.net\n```\n\n## Best Practices\n\n1. **Enable Soft Delete** - Protects against accidental deletion\n2. **Use Tags** - Tag secrets with environment, service, owner\n3. **Set Expiration** - Use `setExpiresOn()` for credentials that should rotate\n4. **Content Type** - Set `contentType` to indicate format (e.g., `application\u002Fjson`)\n5. **Version Management** - Don't delete old versions immediately during rotation\n6. **Access Logging** - Enable diagnostic logging on Key Vault\n7. **Least Privilege** - Use separate vaults for different environments\n\n## Common Secret Types\n\n```java\n\u002F\u002F Database connection string\nsecretClient.setSecret(new KeyVaultSecret(\"db-connection\", \n    \"Server=myserver.database.windows.net;Database=mydb;...\")\n    .setProperties(new SecretProperties()\n        .setContentType(\"text\u002Fplain\")\n        .setTags(Map.of(\"type\", \"connection-string\"))));\n\n\u002F\u002F API key\nsecretClient.setSecret(new KeyVaultSecret(\"stripe-api-key\", \"sk_live_...\")\n    .setProperties(new SecretProperties()\n        .setContentType(\"text\u002Fplain\")\n        .setExpiresOn(OffsetDateTime.now().plusYears(1))));\n\n\u002F\u002F JSON configuration\nsecretClient.setSecret(new KeyVaultSecret(\"app-config\", \n    \"{\\\"endpoint\\\":\\\"https:\u002F\u002F...\\\",\\\"key\\\":\\\"...\\\"}\")\n    .setProperties(new SecretProperties()\n        .setContentType(\"application\u002Fjson\")));\n\n\u002F\u002F Certificate password\nsecretClient.setSecret(new KeyVaultSecret(\"cert-password\", \"CertP@ss!\")\n    .setProperties(new SecretProperties()\n        .setContentType(\"text\u002Fplain\")\n        .setTags(Map.of(\"certificate\", \"my-cert\"))));\n```\n\n## Trigger Phrases\n\n- \"Key Vault secrets Java\", \"secret management Java\"\n- \"store password\", \"store API key\", \"connection string\"\n- \"retrieve secret\", \"rotate secret\"\n- \"Azure secrets\", \"vault secrets\"\n",{"name":5,"package":39,"description":7},"com.azure:azure-security-keyvault-secrets","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fsickn33\u002Fazure-security-keyvault-secrets-java",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill azure-security-keyvault-secrets-java",{"tool":55,"command":56},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill azure-security-keyvault-secrets-java",{"tool":58,"command":59},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill azure-security-keyvault-secrets-java","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fsickn33\u002Fazure-security-keyvault-secrets-java\u002FSKILL.md",true,[63],{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"skill-report.json","REFERENCE","参考文档",9482,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fsickn33\u002Fazure-security-keyvault-secrets-java\u002Fskill-report.json",[70,84,94,102,108,115],{"skillNo":71,"name":72,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":80,"publishedAt":34},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[75],{"categoryNo":76,"categoryName":77,"taxonomyType":78,"taxonomyTypeDesc":79},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[81,82,83],"model","model hierarchy","model hierarchy skill",{"skillNo":85,"name":86,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":90,"publishedAt":34},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[89],{"categoryNo":76,"categoryName":77,"taxonomyType":78,"taxonomyTypeDesc":79},[91,92,93],"MCP","zoom","zoom mcp",{"skillNo":95,"name":96,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":34},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[25,100,101,92],"zoom apps sdk","apps",{"skillNo":103,"name":104,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":34},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[104],{"skillNo":109,"name":110,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":114,"publishedAt":34},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[113],{"categoryNo":76,"categoryName":77,"taxonomyType":78,"taxonomyTypeDesc":79},[110],{"skillNo":116,"name":117,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":34},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[117]]