azure-security-keyvault-keys-java について
azure-security-keyvault-keys-javaは、Azure Key VaultとManaged HSMで暗号鍵を管理し、暗号処理を行うJava SDKスキルです。鍵のライフサイクルに加え、暗号化、署名、鍵のラップを扱います。
主な機能
- 01RSA、EC、対称鍵の作成とインポート
- 02鍵の取得、一覧表示、更新、削除
- 03データの暗号化、復号、署名、検証
- 04鍵のラップとアンラップ
- 05鍵のバックアップ、復元、ローテーション
活用シーン
- 01Azure Key Vaultでのアプリケーション鍵管理
- 02暗号化や署名処理の実行
- 03鍵のローテーションとポリシー設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill azure-security-keyvault-keys-javaインストール後、Claude Code で/azure-security-keyvault-keys-javaを入力して読み込まれたか確認します。
詳細
Azure Key Vault Keys(Java)
Azure Key Vault と Managed HSM で暗号鍵を管理し、暗号操作を実行します。
インストール
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-security-keyvault-keys</artifactId>
<version>4.9.0</version>
</dependency>
クライアントの作成
import com.azure.security.keyvault.keys.KeyClient;
import com.azure.security.keyvault.keys.KeyClientBuilder;
import com.azure.security.keyvault.keys.cryptography.CryptographyClient;
import com.azure.security.keyvault.keys.cryptography.CryptographyClientBuilder;
import com.azure.identity.DefaultAzureCredentialBuilder;
// Key management client
KeyClient keyClient = new KeyClientBuilder()
.vaultUrl("https://<vault-name>.vault.azure.net")
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
// Async client
KeyAsyncClient keyAsyncClient = new KeyClientBuilder()
.vaultUrl("https://<vault-name>.vault.azure.net")
.credential(new DefaultAzureCredentialBuilder().build())
.buildAsyncClient();
// Cryptography client (for encrypt/decrypt/sign/verify)
CryptographyClient cryptoClient = new CryptographyClientBuilder()
.keyIdentifier("https://<vault-name>.vault.azure.net/keys/<key-name>/<key-version>")
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
鍵の種類
| 種類 | 説明 |
|---|---|
RSA | RSA 鍵(2048、3072、4096 ビット) |
RSA_HSM | HSM 内の RSA 鍵 |
EC | 楕円曲線鍵 |
EC_HSM | HSM 内の楕円曲線鍵 |
OCT | 対称鍵(Managed HSM のみ) |
OCT_HSM | HSM 内の対称鍵 |
鍵の作成
RSA 鍵の作成
import com.azure.security.keyvault.keys.models.*;
// Simple RSA key
KeyVaultKey rsaKey = keyClient.createRsaKey(new CreateRsaKeyOptions("my-rsa-key")
.setKeySize(2048));
System.out.println("Key name: " + rsaKey.getName());
System.out.println("Key ID: " + rsaKey.getId());
System.out.println("Key type: " + rsaKey.getKeyType());
// RSA key with options
KeyVaultKey rsaKeyWithOptions = keyClient.createRsaKey(new CreateRsaKeyOptions("my-rsa-key-2")
.setKeySize(4096)
.setExpiresOn(OffsetDateTime.now().plusYears(1))
.setNotBefore(OffsetDateTime.now())
.setEnabled(true)
.setKeyOperations(KeyOperation.ENCRYPT, KeyOperation.DECRYPT,
KeyOperation.WRAP_KEY, KeyOperation.UNWRAP_KEY)
.setTags(Map.of("environment", "production")));
// HSM-backed RSA key
KeyVaultKey hsmKey = keyClient.createRsaKey(new CreateRsaKeyOptions("my-hsm-key")
.setKeySize(2048)
.setHardwareProtected(true));
EC 鍵の作成
// EC key with P-256 curve
KeyVaultKey ecKey = keyClient.createEcKey(new CreateEcKeyOptions("my-ec-key")
.setCurveName(KeyCurveName.P_256));
// EC key with other curves
KeyVaultKey ecKey384 = keyClient.createEcKey(new CreateEcKeyOptions("my-ec-key-384")
.setCurveName(KeyCurveName.P_384));
KeyVaultKey ecKey521 = keyClient.createEcKey(new CreateEcKeyOptions("my-ec-key-521")
.setCurveName(KeyCurveName.P_521));
// HSM-backed EC key
KeyVaultKey ecHsmKey = keyClient.createEcKey(new CreateEcKeyOptions("my-ec-hsm-key")
.setCurveName(KeyCurveName.P_256)
.setHardwareProtected(true));
対称鍵の作成(Managed HSM のみ)
KeyVaultKey octKey = keyClient.createOctKey(new CreateOctKeyOptions("my-symmetric-key")
.setKeySize(256)
.setHardwareProtected(true));
鍵の取得
// Get latest version
KeyVaultKey key = keyClient.getKey("my-key");
// Get specific version
KeyVaultKey keyVersion = keyClient.getKey("my-key", "<version-id>");
// Get only key properties (no key material)
KeyProperties keyProps = keyClient.getKey("my-key").getProperties();
鍵のプロパティの更新
KeyVaultKey key = keyClient.getKey("my-key");
// Update properties
key.getProperties()
.setEnabled(false)
.setExpiresOn(OffsetDateTime.now().plusMonths(6))
.setTags(Map.of("status", "archived"));
KeyVaultKey updatedKey = keyClient.updateKeyProperties(key.getProperties(),
KeyOperation.ENCRYPT, KeyOperation.DECRYPT);
鍵の一覧表示
import com.azure.core.util.paging.PagedIterable;
// List all keys
for (KeyProperties keyProps : keyClient.listPropertiesOfKeys()) {
System.out.println("Key: " + keyProps.getName());
System.out.println(" Enabled: " + keyProps.isEnabled());
System.out.println(" Created: " + keyProps.getCreatedOn());
}
// List key versions
for (KeyProperties version : keyClient.listPropertiesOfKeyVersions("my-key")) {
System.out.println("Version: " + version.getVersion());
System.out.println("Created: " + version.getCreatedOn());
}
鍵の削除
import com.azure.core.util.polling.SyncPoller;
// Begin delete (soft-delete enabled vaults)
SyncPoller<DeletedKey, Void> deletePoller = keyClient.beginDeleteKey("my-key");
// Wait for deletion
DeletedKey deletedKey = deletePoller.poll().getValue();
System.out.println("Deleted: " + deletedKey.getDeletedOn());
deletePoller.waitForCompletion();
// Recovery is an ALTERNATIVE to purge: a purged key cannot be recovered.
// Purge requires separate explicit authorization and may be blocked by purge protection.
// Recover the soft-deleted key
SyncPoller<KeyVaultKey, Void> recoverPoller = keyClient.beginRecoverDeletedKey("my-key");
recoverPoller.waitForCompletion();
暗号操作
最初に、Vault/テナント、鍵の操作、およびリソースの認可を確認してください。無効化、削除、消去などの破壊的な操作により、依存するデータが利用できなくなることがあります。書き込みを行う前に、利用者を洗い出し、復旧方法を確認してください。ローテーション後に復号/検証できるよう、返されたバージョン付きの鍵 ID を暗号文/署名とともに使用してください。復号した本番環境の平文や、インポートした秘密鍵の構成要素をログに記録しないでください。バックアップ BLOB は復元に制限のある機密性の高い暗号化データであり、一般的なエクスポートではありません。既存のバックアップを上書きせず、承認済みのプライベートストレージに書き込んでください。Java SDK のバージョンを固定し、選択した Vault/HSM およびアルゴリズムでメソッドがサポートされていることを確認してください。
暗号化/復号
import com.azure.security.keyvault.keys.cryptography.models.*;
CryptographyClient cryptoClient = new CryptographyClientBuilder()
.keyIdentifier("https://<vault>.vault.azure.net/keys/<key-name>")
.credential(new DefaultAzureCredentialBuilder().build())
.buildClient();
byte[] plaintext = "Hello, World!".getBytes(StandardCharsets.UTF_8);
// Encrypt
EncryptResult encryptResult = cryptoClient.encrypt(EncryptionAlgorithm.RSA_OAEP, plaintext);
byte[] ciphertext = encryptResult.getCipherText();
System.out.println("Ciphertext length: " + ciphertext.length);
// Decrypt
DecryptResult decryptResult = cryptoClient.decrypt(EncryptionAlgorithm.RSA_OAEP, ciphertext);
String decrypted = new String(decryptResult.getPlainText(), StandardCharsets.UTF_8);
System.out.println("Decrypted: " + decrypted);
署名/検証
import java.security.MessageDigest;
// Create digest of data
byte[] data = "Data to sign".getBytes(StandardCharsets.UTF_8);
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] digest = md.digest(data);
// Sign
SignResult signResult = cryptoClient.sign(SignatureAlgorithm.RS256, digest);
byte[] signature = signResult.getSignature();
// Verify
VerifyResult verifyResult = cryptoClient.verify(SignatureAlgorithm.RS256, digest, signature);
System.out.println("Valid signature: " + verifyResult.isValid());
鍵のラップ/アンラップ
// Key to wrap (e.g., AES key)
byte[] keyToWrap = new byte[32]; // 256-bit key
new SecureRandom().nextBytes(keyToWrap);
// Wrap
WrapResult wrapResult = cryptoClient.wrapKey(KeyWrapAlgorithm.RSA_OAEP, keyToWrap);
byte[] wrappedKey = wrapResult.getEncryptedKey();
// Unwrap
UnwrapResult unwrapResult = cryptoClient.unwrapKey(KeyWrapAlgorithm.RSA_OAEP, wrappedKey);
byte[] unwrappedKey = unwrapResult.getKey();
バックアップと復元
// Backup
byte[] backup = keyClient.backupKey("my-key");
// Save backup to file
Files.write(Paths.get("key-backup.blob"), backup);
// Restore
byte[] backupData = Files.readAllBytes(Paths.get("key-backup.blob"));
KeyVaultKey restoredKey = keyClient.restoreKeyBackup(backupData);
鍵のローテーション
// Rotate to new version
KeyVaultKey rotatedKey = keyClient.rotateKey("my-key");
System.out.println("New version: " + rotatedKey.getProperties().getVersion());
// Set rotation policy
KeyRotationPolicy policy = new KeyRotationPolicy()
.setExpiresIn("P90D") // Expire after 90 days
.setLifetimeActions(Arrays.asList(
new KeyRotationLifetimeAction(KeyRotationPolicyAction.ROTATE)
.setTimeBeforeExpiry("P30D"))); // Rotate 30 days before expiry
keyClient.updateKeyRotationPolicy("my-key", policy);
// Get rotation policy
KeyRotationPolicy currentPolicy = keyClient.getKeyRotationPolicy("my-key");
鍵のインポート
import com.azure.security.keyvault.keys.models.ImportKeyOptions;
import com.azure.security.keyvault.keys.models.JsonWebKey;
// Import existing key material
JsonWebKey jsonWebKey = new JsonWebKey()
.setKeyType(KeyType.RSA)
.setN(modulus)
.setE(exponent)
.setD(privateExponent)
// ... other RSA components
;
ImportKeyOptions importOptions = new ImportKeyOptions("imported-key", jsonWebKey)
.setHardwareProtected(false);
KeyVaultKey importedKey = keyClient.importKey(importOptions);
暗号化アルゴリズム
| アルゴリズム | 鍵の種類 | 説明 |
|---|---|---|
RSA1_5 | RSA | RSAES-PKCS1-v1_5 |
RSA_OAEP | RSA | OAEP を使用する RSAES(推奨) |
RSA_OAEP_256 | RSA | SHA-256 を使用する OAEP による RSAES |
A128GCM | OCT | AES-GCM 128 ビット |
A256GCM | OCT | AES-GCM 256 ビット |
A128CBC | OCT | AES-CBC 128 ビット |
A256CBC | OCT | AES-CBC 256 ビット |
署名アルゴリズム
| アルゴリズム | 鍵の種類 | ハッシュ |
|---|---|---|
RS256 | RSA | SHA-256 |
RS384 | RSA | SHA-384 |
RS512 | RSA | SHA-512 |
PS256 | RSA | SHA-256(PSS) |
ES256 | EC P-256 | SHA-256 |
ES384 | EC P-384 | SHA-384 |
ES512 | EC P-521 | SHA-512 |
エラー処理
import com.azure.core.exception.HttpResponseException;
import com.azure.core.exception.ResourceNotFoundException;
try {
KeyVaultKey key = keyClient.getKey("non-existent-key");
} catch (ResourceNotFoundException e) {
System.out.println("Key not found: " + e.getMessage());
} catch (HttpResponseException e) {
System.out.println("HTTP error " + e.getResponse().getStatusCode());
System.out.println("Message: " + e.getMessage());
}
環境変数
AZURE_KEYVAULT_URL=https://<vault-name>.vault.azure.net
ベストプラクティス
- 本番環境では HSM 鍵を使用する - 機密性の高い鍵には
setHardwareProtected(true)を設定します - 論理削除を有効にする - 誤削除から保護します
- 鍵のローテーション - 自動ローテーションポリシーを設定します
- 最小権限 - 操作ごとに別々の鍵を使用します
- 可能な場合はローカルで暗号処理を行う - ローカルの鍵素材とともに
CryptographyClientを使用して、往復通信を減らします
トリガーフレーズ
- 「Key Vault keys Java」、「cryptographic keys Java」
- 「encrypt decrypt Java」、「sign verify Java」
- 「RSA key」、「EC key」、「HSM key」
- 「key rotation」、「wrap unwrap key」
使用する場面
このスキルは、概要で説明されているワークフローまたはアクションを実行する場合に適用できます。
制限事項
- このスキルは、タスクが上記の説明の範囲に明確に該当する場合にのみ使用してください。
- 出力を、環境固有の検証、テスト、または専門家によるレビューの代わりとして扱わないでください。
- 必要な入力、権限、安全上の境界、または成功基準が不足している場合は、作業を中断して確認してください。
コメント
Markdown 対応