在 Functions 中签名 JWT,无需管理私钥

在 Functions 中签名 JWT,无需管理私钥

💡 原文英文,约400词,阅读约需2分钟。
📝

内容提要

Vercel KMS 允许在 Vercel Functions 中安全签名 JWT 和消息,私钥托管于 KMS,不进入代码或环境变量。支持创建和轮换 RSA、ECDSA、EdDSA 密钥,按环境授权项目,并限制声明。令牌可通过公开的 OIDC 和 JWKS 端点在任何地方验证。提供 CLI 和仪表盘管理,建议每个项目和环境使用独立签发者,便于隔离和轮换。目前处于测试阶段,适用于所有计划。

🔎

延伸解读

私钥托管与验证分离

Vercel KMS 的核心设计是将私钥托管在云端,函数通过 OIDC 令牌认证后签名,私钥不进入代码或环境变量。验证方只需通过公开的 JWKS 端点获取公钥,即可用标准 JOSE 库验证令牌,无需依赖 Vercel 特定代码。这种分离降低了私钥泄露风险,同时保持了验证的通用性。

按环境授权与声明限制

KMS 允许按环境(生产、预览、开发等)授权项目签名,并可限制项目可请求的声明,甚至用 JSON Schema 校验令牌声明。这有助于实施最小权限原则,防止某个环境或项目越权生成任意令牌,增强了安全边界。

独立签发者便于隔离与轮换

官方建议每个项目和环境使用独立的签发者,这样每个令牌的受众(audience)清晰,签名权限仅限特定项目和环境,且轮换或撤销密钥时不会影响其他签发者。这种隔离策略简化了密钥管理,降低了因单一密钥泄露导致的大范围影响。

Q&A

Vercel KMS 是什么?它如何帮助在 Vercel Functions 中签名 JWT?

Vercel KMS 是一项密钥管理服务,允许你在 Vercel Functions 中使用托管的不对称签名密钥来签名 JWT 和任意消息。私钥永远不会出现在代码或环境变量中,而是安全地存储在 Vercel 的密钥管理服务中。你的函数通过 Vercel OIDC 令牌进行身份验证,验证者只需使用公钥即可。

如何在 Vercel Functions 中使用 @vercel/kms 包签名 JWT?

首先安装 @vercel/kms 包,然后在函数中导入 signToken 函数,传入 issuerId、claims 和 ttl 等参数即可签名 JWT。例如:const token = await signToken({ issuerId: '123e4567-e89b-42d3-a456-426614174000', claims: { sub: 'user_123', scope: 'read:data' }, ttl: 300 });

Vercel KMS 支持哪些签名算法?

Vercel KMS 支持 RSA、ECDSA 和 EdDSA 算法。你可以从 CLI 或仪表盘创建和轮换这些类型的密钥。

如何验证由 Vercel KMS 签名的令牌?

每个签发者都会发布公开的 OpenID Connect Discovery 文档和 JWK 集合,地址分别为 https://kms.vercel.com/<issuerId>/.well-known/openid-configuration 和 https://kms.vercel.com/<issuerId>/jwks.json。你可以使用任何标准的 OIDC 或 JOSE 库,通过获取 JWKS 并验证令牌签名来验证令牌,无需 Vercel 特定代码。

如何通过 CLI 创建签发者并授予项目访问权限?

使用命令 `vercel kms add my-issuer --algorithm ES256` 创建签发者,然后使用 `vercel kms add-grant 123e4567-e89b-42d3-a456-426614174000 --project my-app --environment production` 授予项目在特定环境下的签名访问权限。注意需要 Vercel CLI 59.1.0 或更高版本。

使用 Vercel KMS 时,为什么建议每个项目和环境使用独立的签发者?

为每个项目和环境创建独立的签发者可以隔离令牌受众,确保签名访问权限仅限一个项目和环境,并且可以独立轮换或撤销密钥,而不影响其他项目或环境。这有助于提高安全性和管理灵活性。

Vercel KMS 目前处于什么阶段?是否对所有计划开放?

Vercel KMS 目前处于测试阶段,适用于所有计划。功能和行为可能会在正式发布前发生变化,使用需遵守 Beta 协议。

🏷️

标签

➡️

继续阅读