)
Agentic Skills 实战用 TypeScript 在 Azure Key Vault 中安全管理密钥azure-keyvault-secrets-ts【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,400 agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/gh_mirrors/an/agentic-awesome-skills导读在 agentic-awesome-skills 项目的技能库中azure-keyvault-secrets-ts/SKILL.md 是一份面向 JavaScript/TypeScript 开发者的 Azure Key Vault Secrets SDK 操作指南。它告诉你如何在 Node.js 应用中集中存储与读取密钥、如何用DefaultAzureCredential完成免配置认证、如何对密钥执行增删改查与版本管理以及如何配套使用 Key Vault Keys 完成加密、签名、密钥包装与备份恢复。读完本文你将能够在 TypeScript 项目中直接落地一套「凭据入 Vault、应用按需取」的密钥管理方案并理解这份技能在 AAS 技能目录中的定位与使用边界。技能定位AAS 目录中的云安全技能在 data/catalog.json 的目录记录中azure-keyvault-secrets-ts被标注为category: cloud——归类于云平台技能risk: critical——该技能涉及密钥与凭据的高危操作使用前必须明确权限边界source: community——来源于社区贡献tags: [azure, keyvault, secrets, ts]——便于 Agent 与搜索引擎按主题检索。技能文件本身SKILL.md通过 YAML frontmatter 声明了name、description、risk与date_added等元数据正文则以「安装 → 认证 → 操作 → 最佳实践 → 限制」的顺序组织。这与仓库中 docs/contributors/skill-anatomy.md 描述的技能结构规范一致一份合格的技能必须同时给出触发条件、可执行步骤和明确的安全边界。同主题技能还包括 azure-keyvault-keys-ts/SKILL.md密钥管理、azure-keyvault-py/SKILL.mdPython 版以及 azure-keyvault/SKILL.md含 CLI 的完整运维手册。本技能聚焦「Secrets SDK for JavaScript」是其中最小的、面向应用内嵌代码的切片。安装与依赖在 Node.js 项目中使用本技能需要安装两个包npm install azure/keyvault-secrets azure/identityazure/keyvault-secretsSecrets 客户端 SDK提供SecretClient及全部密钥操作azure/identity认证库提供DefaultAzureCredential等凭据类型。注意技能文档明确声明这些 SDK 仅支持 Node.js不支持浏览器环境见 SKILL.md 的 Best Practices 第 6 条。如果你的代码运行在浏览器端需要通过后端代理服务转发请求切勿在前端直接引入该 SDK。环境变量与 Vault 地址解析技能支持两种环境变量写法二选一即可KEY_VAULT_URLhttps://vault-name.vault.azure.net # 或 AZURE_KEYVAULT_NAMEvault-name两种方式在代码中的区别在于使用AZURE_KEYVAULT_NAME时需要自行拼接出完整的 Vault URL见下节认证代码。建议在.env或部署平台的配置中心统一管理该变量不要在代码中硬编码 Vault 名称。认证DefaultAzureCredential 的链路import { DefaultAzureCredential } from azure/identity; import { SecretClient } from azure/keyvault-secrets; const credential new DefaultAzureCredential(); const vaultUrl https://${process.env.AZURE_KEYVAULT_NAME}.vault.azure.net; const secretClient new SecretClient(vaultUrl, credential);DefaultAzureCredential是技能文档推荐的首选认证方式Best Practices 第 1 条它的价值在于一条代码同时覆盖开发与生产环境在本地开发时它会依次尝试环境变量、Azure CLI 登录态、Visual Studio 凭据等来源部署到 Azure如 App Service、AKS、Functions后会自动切换到托管身份Managed Identity。因此你无需在代码中维护多套认证分支。注意原技能示例中出现了KeyClient的引用但它属于azure/keyvault-keys包本节仅导入azure/keyvault-secrets时KeyClient并不存在。若只需管理密钥请忽略该行若同时需要密钥操作请一并安装azure/keyvault-keys并参考 azure-keyvault-keys-ts/SKILL.md。密钥Secret操作全解写入密钥// 最简写入 const secret await secretClient.setSecret(MySecret, secret-value); // 带属性的写入 const secretWithAttrs await secretClient.setSecret(MySecret, value, { enabled: true, expiresOn: new Date(2025-12-31), contentType: application/json, tags: { environment: production } });setSecret的第三个参数是SetSecretOptions其中enabled是否立即启用false表示写入但不激活expiresOn过期时间过期后读取会失败配合 Best Practices 第 3 条「为密钥设置过期时间」contentType便于标记 JSON、证书等类型tags任意键值对可用于环境、团队、用途等维度检索。读取密钥// 获取最新版本 const secret await secretClient.getSecret(MySecret); console.log(secret.value); // 获取指定版本 const specificSecret await secretClient.getSecret(MySecret, { version: secret.properties.version });Key Vault 的密钥天然具备版本化能力每次setSecret都会产生一个新版本。默认getSecret返回最新版本如需回滚或审计某个历史版本可以显式传入version版本号可从secret.properties.version或列出版本时取得。列出密钥与版本for await (const secretProperties of secretClient.listPropertiesOfSecrets()) { console.log(secretProperties.name); } // 列出某密钥的全部版本 for await (const version of secretClient.listPropertiesOfSecretVersions(MySecret)) { console.log(version.version); }两个迭代器都是异步生成器for await...of返回的是属性SecretProperties而非密钥值本身——这符合最小权限原则仅遍历名称与元数据时不会拉取敏感明文。删除、恢复与永久清除// 软删除进入回收站 const deletePoller await secretClient.beginDeleteSecret(MySecret); await deletePoller.pollUntilDone(); // 永久清除不可恢复 await secretClient.purgeDeletedSecret(MySecret); // 恢复被软删除的密钥 const recoverPoller await secretClient.beginRecoverDeletedSecret(MySecret); await recoverPoller.pollUntilDone();删除操作全部采用Long-Running OperationLRO轮询模式begin*返回轮询器PollerpollUntilDone()会阻塞直至操作完成。这与 azure-keyvault/SKILL.md 中 CLI 的az keyvault secret delete / recover / purge一一对应beginDeleteSecret↔az keyvault secret delete软删除beginRecoverDeletedSecret↔az keyvault secret recoverpurgeDeletedSecret↔az keyvault secret purge需关闭清除保护。技能文档的 Best Practices 第 2 条要求生产环境 Vault必须开启软删除soft-delete因此在生产环境中purgeDeletedSecret通常会被拒绝或需要二次确认。配套密钥Key与密码学操作技能在 Keys Operations 一节还覆盖了azure/keyvault-keys的能力该技能目录同样收录于 azure-keyvault-keys-ts/SKILL.md典型场景是把密钥Secret之外的加密密钥一并托管。创建密钥const keyClient new KeyClient(vaultUrl, credential); // 通用 RSA 密钥 const key await keyClient.createKey(MyKey, RSA); // 指定位数的 RSA const rsaKey await keyClient.createRsaKey(MyRsaKey, { keySize: 2048 }); // 椭圆曲线密钥 const ecKey await keyClient.createEcKey(MyEcKey, { curve: P-256 }); // 带属性与操作许可 const keyWithAttrs await keyClient.createKey(MyKey, RSA, { enabled: true, expiresOn: new Date(2025-12-31), tags: { purpose: encryption }, keyOps: [encrypt, decrypt, sign, verify] });keyOps用于限定密钥允许的操作——这正是 Best Practices 第 5 条「限制密钥操作」的实现方式只授予业务实际需要的操作如仅encrypt/decrypt或仅sign/verify降低密钥泄露后的危害半径。密钥轮换// 手动轮换 const rotatedKey await keyClient.rotateKey(MyKey); // 设置自动轮换策略 await keyClient.updateKeyRotationPolicy(MyKey, { lifetimeActions: [{ action: Rotate, timeBeforeExpiry: P30D }], expiresIn: P90D });轮换策略中的时间单位使用 ISO 8601 时长P30D 30 天。含义是在密钥到期前 30 天触发一次轮换新密钥有效期为 90 天。对应 CLI 中的az keyvault key rotate与az keyvault key rotation-policy update详见 azure-keyvault/SKILL.md。加密 / 解密import { CryptographyClient } from azure/keyvault-keys; // 从密钥对象或密钥 ID 构建密码学客户端 const cryptoClient new CryptographyClient(key, credential); // 或 const cryptoClient new CryptographyClient(key.id!, credential); // 加密 const encryptResult await cryptoClient.encrypt({ algorithm: RSA-OAEP, plaintext: Buffer.from(My secret message) }); // 解密 const decryptResult await cryptoClient.decrypt({ algorithm: RSA-OAEP, ciphertext: encryptResult.result }); console.log(decryptResult.result.toString());CryptographyClient的加密/解密在服务端完成私钥从不离开 HSM 或 Vault 边界应用只提交密文/明文并获得结果。RSA-OAEP是 RSA 加密的标准填充方案在 azure-keyvault/SKILL.md 的 CLI 示例中还出现了更强的RSA-OAEP-256SHA-256 变体可根据合规要求选用。签名 / 验签import { createHash } from node:crypto; // 生成消息摘要 const hash createHash(sha256).update(My message).digest(); // 签名 const signResult await cryptoClient.sign(RS256, hash); // 验签 const verifyResult await cryptoClient.verify(RS256, hash, signResult.result); console.log(Valid:, verifyResult.result);签名流程遵循「先摘要、后签名」的标准做法先在本地用node:crypto的createHash(sha256)计算摘要再把摘要交给CryptographyClient.sign。RS256即 RSA SHA-256 签名算法verify返回布尔值表示签名是否有效。密钥包装 / 解包// 包装加密一段密钥材料以便安全存储 const wrapResult await cryptoClient.wrapKey(RSA-OAEP, Buffer.from(key-material)); // 解包 const unwrapResult await cryptoClient.unwrapKey(RSA-OAEP, wrapResult.result);Wrap/Unwrap 常用于信封加密Envelope Encryption用 Vault 中的主密钥加密数据密钥DEK数据密钥再加密业务数据。这样即使 DEK 泄露没有主密钥也无法解开且主密钥可独立轮换。备份与恢复const keyBackup await keyClient.backupKey(MyKey); const secretBackup await secretClient.backupSecret(MySecret); // 恢复可以恢复到不同的 Vault const restoredKey await keyClient.restoreKeyBackup(keyBackup!); const restoredSecret await secretClient.restoreSecretBackup(secretBackup!);备份返回的是二进制 blob可用于跨 Vault 迁移或灾备恢复。技能文档特别注明「可以恢复到不同 Vault」——这是把密钥在订阅/区域之间搬运的官方途径之一对应 CLI 的az keyvault secret backup/restore。请把备份 blob 视为敏感数据妥善保管。类型体系速查技能文档给出了一份可直接使用的类型导入清单便于在 TS 项目中声明变量类型import { KeyClient, KeyVaultKey, KeyProperties, DeletedKey, CryptographyClient, KnownEncryptionAlgorithms, KnownSignatureAlgorithms } from azure/keyvault-keys; import { SecretClient, KeyVaultSecret, SecretProperties, DeletedSecret } from azure/keyvault-secrets;KeyVaultSecret/KeyVaultKey读取到的完整对象含value、propertiesSecretProperties/KeyProperties元数据名称、版本、启用状态、过期时间、标签等DeletedKey/DeletedSecret软删除后的对象可用于恢复前的信息核对KnownEncryptionAlgorithms/KnownSignatureAlgorithmsSDK 导出的算法常量集合避免手写字符串拼错。错误处理try { const secret await secretClient.getSecret(NonExistent); } catch (error: any) { if (error.code SecretNotFound) { console.log(Secret does not exist); } else { throw error; } }Key Vault 的错误对象带有code字段。技能文档示范了基于SecretNotFound的判断分支——这是最常见的「密钥不存在」场景此外还应关注Forbidden权限不足、Conflict并发冲突、KeyVaultError服务端通用错误等码位。合理的错误处理策略是只捕获并处理预期错误其余一律向上抛出避免吞掉真正需要排查的异常。最佳实践汇总技能文档Best Practices 一节给出了六条可直接落地的准则使用 DefaultAzureCredential——一条代码覆盖开发与生产无需多套认证分支开启软删除soft-delete——生产 Vault 的强制要求防止误删不可恢复为密钥和加密密钥都设置过期时间——让临时凭据自动失效使用密钥轮换策略——把人工轮换升级为自动轮换updateKeyRotationPolicy限制密钥操作keyOps——只授予encrypt、sign等实际需要的操作浏览器不支持——azure/keyvault-secrets系列 SDK 仅限 Node.js前端必须经后端代理。结合 azure-keyvault/SKILL.md 的运维手册还有几条组织级实践值得补充优先使用RBAC 授权而非传统访问策略如Key Vault Secrets User角色只读、Key Vault Administrator全量管理生产 Vault 建议--enable-purge-protection true防止清除保护被关闭对 Vault 启用诊断日志AuditEvent 类别以便审计每次密钥访问。适用场景与边界何时使用本技能技能的 frontmatter 与正文明确当你需要在 TypeScript/JavaScript 应用中存储与读取应用密钥或配置值时本技能适用。典型场景包括数据库连接串、第三方 API Key、JWT 签名密钥等凭据的统一托管与按需读取。使用限制仅在任务明确匹配上述范围时使用本技能Limitations 第 1 条技能输出不能替代环境专属的验证、测试或专家评审Limitations 第 2 条若输入、权限、安全边界或成功标准缺失应停下来请求澄清Limitations 第 3 条risk: critical意味着执行删除、清除等破坏性操作前必须确认拥有授权范围并优先在非生产环境演练这一点在 azure-keyvault/SKILL.md 中同样被强调。延伸阅读azure-keyvault-secrets-ts/SKILL.md —— 本文主体完整代码示例azure-keyvault-keys-ts/SKILL.md —— 密钥Key与密码学操作的完整版azure-keyvault-py/SKILL.md —— Python 版 SDK 对应技能azure-keyvault/SKILL.md —— 含 Vault 创建、RBAC、AKS 集成Secrets Store CSI Driver的完整运维手册data/catalog.json —— 技能目录记录category / risk / tags 元数据来源docs/contributors/skill-anatomy.md —— AAS 技能结构规范【免费下载链接】agentic-awesome-skillsAAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and planning, backed by 2,400 agentic skills. Includes CLI, local MCP, catalog, plugins, and Workbench.项目地址: https://gitcode.com/gh_mirrors/an/agentic-awesome-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考