通过


轮换签名密钥

本文介绍轮换 Microsoft Entra 验证的 ID 签名密钥的步骤。

轮换签名密钥

对于需要验证颁发者生成的签名的任何人,可在分散标识符(DID)文档中获取公钥。 对于使用 did:web 方法的权威机构,DID 文档可在 https://contoso.com/.well-known/did.json 访问,其中 contoso.com 是一个示例。

在 Web 服务器上公开发布更新版本之前,验证的 ID 不应使用新密钥开始签名。 如果您使用多区域部署,可能还结合 Azure 内容分发网络,那么部署过程可能需要一些时间才能完成更新 did.json

为了帮助管理员在不造成任何服务中断的情况下执行签名密钥轮换,轮换过程遵循以下步骤:

  1. 调用 signingKeys/rotate API 以在 Key Vault 中创建新的签名密钥。 调用中的访问令牌必须来自有权限访问密钥保管库中密钥的管理员用户。 此操作在密钥保管库中设置新的 当前 密钥。 上一个密钥移动到旧密钥,但仍可以启用。 响应是一个权限 JSON 对象,属性didDocumentStatus具有一个outOfSync值,这表明 Key Vault 与公开可见的did.json文档之间存在差异。

    显示 Key Vault 中新密钥的屏幕截图。

  2. 在“已验证的 ID”门户中转到“设置”。 选择 “注册分散 ID ”,然后复制或下载更新 did.json 的文件。 它现在包含新的和旧的键。

    显示 did.json的屏幕截图。

  3. 在以前部署的所有 Web 服务器上替换 did.json 。 如果手动编辑了它,请确保它仍然具有有效的 JSON 语法,方法是使用类似 https://jsonformatter.org/工具。 在继续之前,请确保可以使用浏览器从 Internet 检索新 did.json 文档。

  4. 调用 synchronizeWithDidDocument API 以开始使用新的签名密钥。 此 API 调用验证 Key Vault 和公共 did.json 文档是否匹配。 如果匹配,则验证的 ID 机构将使用 Key Vault 中的新密钥开始签名。 didDocumentStatus返回的权限 JSON 对象的值为 published. 如果值仍然是 outOfSync,则 Key Vault 与 did.json 文档之间存在差异,而仍然使用上一个密钥进行签名。

是否需要在已验证 ID 中轮换密钥?

从技术上说,如果使用自己的 Key Vault 实例,则无需在已验证 ID 中轮换签名密钥。 当前签名密钥不会过期。 与任何公钥/私钥解决方案一样,最佳做法是定期轮换密钥。

轮换签名密钥时会发生什么情况?

成功执行步骤 1-4 后,验证 ID 具有新的签名密钥,并且从那一刻开始签名的任何 JSON Web 令牌都使用新密钥进行签名。 这意味着使用新密钥对颁发和呈现请求和颁发的凭据进行签名。

旧密钥签名的凭据会发生什么情况?

如果公钥在公共did.json文档中可用,并且密钥未在密钥库中被禁用或删除,则由已失效密钥签名的已验证ID凭据仍然有效。

旧签名密钥不再可用时会发生什么情况?

如果用于对已颁发的验证 ID 凭据进行签名的密钥不在公共 did.json 文档中,则任何验证尝试都失败,因为验证程序无法解析用作签名的公钥。 有两种情况需要注意。

第一: 验证的 ID 限制为 10 个密钥,可在内部使用。 它们包括一个当前键和九个以前的键。 如果 Key Vault 包含 12 个密钥,则验证 ID 仅加载并使用前 10 个密钥。 您不能手动编辑 did.json 文档以添加旧密钥,因为这会导致“验证 ID”加载的内容与 did.json 文档中保留的内容不匹配。 在这种情况下,尝试调用 synchronizeWithDidDocument 会导致 didDocumentStatus 返回 outOfSync

例如,假设 Key Vault 中有 12 个密钥,并且希望在密钥列表中没有加载密钥 8 和 9 的已验证 ID。 必须在 Key Vault 中禁用密钥 8 和 9,然后执行 步骤 2-4

第二: 在此示例中,如果轮换密钥 12 次,则验证 ID 不再加载两个最旧的密钥。 不再可以验证使用这两个密钥颁发的任何已验证 ID 凭据。

注释

密钥轮换策略需要与颁发的已验证 ID 凭据的生存期进行协调,以便在旧密钥停用之前续订或重新颁发凭据。 一个不起作用的解决方案示例是颁发过期日期为 12 个月的已验证 ID 凭据,同时提供密钥轮换策略来轮换每个月的密钥。 这种解决方案在一年的最后两个月遇到麻烦,因为旧密钥不再可用。

是否可以直接在 Key Vault 中轮换密钥,而不是调用已验证的 ID API?

不应在 Key Vault 的管理门户中使用轮换功能。 验证 ID 在调用 /signingKeys/rotate API 时执行的任务多于在 Key Vault 中轮换密钥。

后续步骤