mcpField
A
azure-keyvault-secrets-ts

azure-keyvault-secrets-ts

github.com/sickn33安全48.7k64 次安装今天更新
代码仓库

关于 azure-keyvault-secrets-ts

用于管理 Azure Key Vault 中机密和密钥的 TypeScript SDK,涵盖机密与密钥生命周期操作,也支持加密、签名和密钥封装等密码学操作。

主要功能

  1. 01创建、获取、列出和删除机密
  2. 02创建、列出、轮换和删除密钥
  3. 03加密、解密、签名和验证
  4. 04封装与解封密钥
  5. 05备份和恢复机密及密钥

适用场景

  1. 01管理 Key Vault 中的应用机密
  2. 02设置密钥轮换策略
  3. 03使用保管库密钥执行密码学操作
  4. 04备份和恢复保管库对象

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sickn33/agentic-awesome-skills --skill azure-keyvault-secrets-ts

安装后在 Claude Code 中输入/azure-keyvault-secrets-ts确认已加载。

详细介绍

适用于 TypeScript 的 Azure Key Vault Secrets SDK

使用 Azure Key Vault 管理机密。

安装

# Secrets SDK
npm install @azure/keyvault-secrets @azure/keyvault-keys @azure/identity

环境变量

KEY_VAULT_URL=https://<vault-name>.vault.azure.net
# Or
AZURE_KEYVAULT_NAME=<vault-name>

身份验证

import { DefaultAzureCredential } from "@azure/identity";
import { SecretClient } from "@azure/keyvault-secrets";
import { KeyClient } from "@azure/keyvault-keys";

const credential = new DefaultAzureCredential();
const vaultUrl = `https://${process.env.AZURE_KEYVAULT_NAME}.vault.azure.net`;

const keyClient = new KeyClient(vaultUrl, credential);
const secretClient = new SecretClient(vaultUrl, credential);

执行边界

示例是相互独立的片段,且会重复使用名称;请勿将它们拼接成一个脚本。请使用经批准的测试保管库和最小权限身份。清除操作不可撤销,且可能会被清除保护阻止;删除或轮换密钥可能导致依赖它的工作负载中断。执行变更前,请确认具体的保管库、对象和版本,以及恢复计划。示例中的到期日期已过,不建议在实际环境中使用。

机密操作

创建/设置机密
const secret = await secretClient.setSecret("MySecret", "secret-value");

// With attributes
const secretWithAttrs = await secretClient.setSecret("MySecret", "value", {
  enabled: true,
  expiresOn: new Date("2025-12-31"),
  contentType: "application/json",
  tags: { environment: "production" }
});
获取机密
// Get latest version
const secret = await secretClient.getSecret("MySecret");
console.log(secret.name); // Never log secret values.

// Get specific version
const specificSecret = await secretClient.getSecret("MySecret", {
  version: secret.properties.version
});
列出机密
for await (const secretProperties of secretClient.listPropertiesOfSecrets()) {
  console.log(secretProperties.name);
}

// List versions
for await (const version of secretClient.listPropertiesOfSecretVersions("MySecret")) {
  console.log(version.version);
}
删除机密
// Soft delete
const deletePoller = await secretClient.beginDeleteSecret("MySecret");
await deletePoller.pollUntilDone();

// Purge (permanent)
await secretClient.purgeDeletedSecret("MySecret");

// Recover
const recoverPoller = await secretClient.beginRecoverDeletedSecret("MySecret");
await recoverPoller.pollUntilDone();

密钥操作

创建密钥
// Generic key
const key = await keyClient.createKey("MyKey", "RSA");

// RSA key with size
const rsaKey = await keyClient.createRsaKey("MyRsaKey", { keySize: 2048 });

// Elliptic Curve key
const ecKey = await keyClient.createEcKey("MyEcKey", { curve: "P-256" });

// With attributes
const keyWithAttrs = await keyClient.createKey("MyKey", "RSA", {
  enabled: true,
  expiresOn: new Date("2025-12-31"),
  tags: { purpose: "encryption" },
  keyOps: ["encrypt", "decrypt", "sign", "verify"]
});
获取密钥
const key = await keyClient.getKey("MyKey");
console.log(key.name, key.keyType);
列出密钥
for await (const keyProperties of keyClient.listPropertiesOfKeys()) {
  console.log(keyProperties.name);
}
轮换密钥
// Manual rotation
const rotatedKey = await keyClient.rotateKey("MyKey");

// Set rotation policy
await keyClient.updateKeyRotationPolicy("MyKey", {
  lifetimeActions: [{ action: "Rotate", timeBeforeExpiry: "P30D" }],
  expiresIn: "P90D"
});
删除密钥
const deletePoller = await keyClient.beginDeleteKey("MyKey");
await deletePoller.pollUntilDone();

// Purge
await keyClient.purgeDeletedKey("MyKey");

加密操作

创建 CryptographyClient
import { CryptographyClient } from "@azure/keyvault-keys";

// From key object
const cryptoClient = new CryptographyClient(key, credential);

// From key ID
const cryptoClient = new CryptographyClient(key.id!, credential);
加密/解密
// Encrypt
const encryptResult = await cryptoClient.encrypt({
  algorithm: "RSA-OAEP",
  plaintext: Buffer.from("My secret message")
});

// Decrypt
const decryptResult = await cryptoClient.decrypt({
  algorithm: "RSA-OAEP",
  ciphertext: encryptResult.result
});

// Use decrypted bytes only in the authorized application; do not log them.
签名/验证
import { createHash } from "node:crypto";

// Create digest
const hash = createHash("sha256").update("My message").digest();

// Sign
const signResult = await cryptoClient.sign("RS256", hash);

// Verify
const verifyResult = await cryptoClient.verify("RS256", hash, signResult.result);
console.log("Valid:", verifyResult.result);
包装/解包密钥
// Wrap a key (encrypt it for storage)
const wrapResult = await cryptoClient.wrapKey("RSA-OAEP", Buffer.from("key-material"));

// Unwrap
const unwrapResult = await cryptoClient.unwrapKey("RSA-OAEP", wrapResult.result);

备份与还原

// Backup
const keyBackup = await keyClient.backupKey("MyKey");
const secretBackup = await secretClient.backupSecret("MySecret");

// Restore only within the same subscription and Azure geography.
const restoredKey = await keyClient.restoreKeyBackup(keyBackup!);
const restoredSecret = await secretClient.restoreSecretBackup(secretBackup!);

密钥类型

import {
  KeyClient,
  KeyVaultKey,
  KeyProperties,
  DeletedKey,
  CryptographyClient,
  KnownEncryptionAlgorithms,
  KnownSignatureAlgorithms
} from "@azure/keyvault-keys";

import {
  SecretClient,
  KeyVaultSecret,
  SecretProperties,
  DeletedSecret
} from "@azure/keyvault-secrets";

错误处理

try {
  const secret = await secretClient.getSecret("NonExistent");
} catch (error: any) {
  if (error.code === "SecretNotFound") {
    console.log("Secret does not exist");
  } else {
    throw error;
  }
}

最佳实践

  1. 使用 DefaultAzureCredential —— 可用于开发和生产环境
  2. 启用软删除 —— 生产保管库必须启用
  3. 设置到期日期 —— 同时为密钥和机密设置
  4. 使用密钥轮换策略 —— 自动轮换密钥
  5. 限制密钥操作 —— 仅授予所需的操作权限(加密、签名等)
  6. 不支持浏览器 —— 这些 SDK 仅适用于 Node.js

适用场景

当需要执行概述中所述的工作流或操作时,可使用此技能。

限制

  • 仅当任务明确符合上述范围时,才使用此技能。
  • 不要将输出视为针对特定环境进行验证、测试或专家审核的替代品。
  • 如果缺少必要输入、权限、安全边界或成功标准,请停止并请求澄清。

评论

支持 Markdown