轮换签名密钥
在本文中,我们将查看轮换 Microsoft Entra 验证 ID 签名密钥的步骤。
先决条件
- 手动加入已验证 ID 颁发机构,签名密钥位于你自己的 Azure Key Vault 实例中。 快速设置使用 Microsoft 管理的共享签名密钥,你无法自行轮换该密钥。
- 执行密钥轮换的管理员用户必须对密钥保管库中的密钥拥有权限。
轮换签名密钥
分散式标识 (DID) 文档中为任何需要验证颁发者所生成的签名的人员提供了公钥。 对于使用 did:web
方法的颁发机构,DID 文档可从 https://contoso.com/.well-known/did.json
上获得(其中的 contoso.com 仅为示例)。
在 Web 服务器上公开提供更新版本之前,已验证 ID 不应使用新密钥开始签名。 如果你正在使用多区域部署(也许是使用内容分发网络),则部署过程可能需要花费一段时间才能使更新的 did.json
准备就绪。
为了帮助管理员在不造成任何服务中断的情况下执行签名密钥轮换,轮换过程将遵循以下步骤:
调用 signingKeys/rotate API 在密钥保管库中创建新的签名密钥。 调用中的访问令牌必须适用于有权访问密钥保管库中密钥的管理员用户。 此操作在密钥保管库中设置新的“当前”密钥。 上一个密钥移至旧密钥,但仍可以启用。 响应是颁发机构 JSON 对象,其属性
didDocumentStatus
的值为outOfSync
,指示密钥保管库与公开提供的did.json
文档之间存在差异。在“已验证的 ID”门户中转到“设置”。 选择“注册分散式 ID”,然后复制或下载更新的
did.json
文件。 该文件现在包含新密钥和旧密钥。在
did.json
文件先前部署到的所有 Web 服务器上替换该文件。 如果你手动编辑了该文件,请使用https://jsonformatter.org/
之类的工具来确保它仍然采用有效的 JSON 语法。 在继续操作之前,请确保可以使用浏览器从 Internet 检索新的did.json
文档。调用 synchronizeWithDidDocument API 开始使用新的签名密钥。 此 API 调用将验证密钥保管库和公共
did.json
文档是否匹配。 如果两者匹配,则已验证 ID 颁发机构将使用密钥保管库中的新密钥开始签名。 返回的颁发机构 JSON 对象中didDocumentStatus
的值为published
。 如果该值仍为outOfSync
,则表示密钥保管库和did.json
文档之间存在差异,并且仍在使用先前的密钥进行签名。
是否需要在已验证 ID 中轮换密钥?
从技术上讲,如果你使用自己的密钥保管库实例,则无需在已验证 ID 中轮换签名密钥。 当前的签名密钥不会过期。 与任何公钥/私钥解决方案一样,最佳做法是定期轮换密钥。
轮换签名密钥时会发生什么情况?
成功执行步骤 1-4 后,已验证 ID 将获得新的签名密钥,并且从此刻起,要签名的任何 JSON Web 令牌都将使用新密钥进行签名。 这意味着,颁发和呈现请求以及颁发的凭据都将使用新密钥进行签名。
由旧密钥签名的凭据会发生什么情况?
如果公钥已在公共 did.json
文档中提供,并且密钥未在密钥保管库中禁用或删除,由不再是当前密钥的密钥所签名的已验证 ID 已颁发凭据就会继续有效。
当旧签名密钥不再可用时会发生什么情况?
如果用于为已验证 ID 已颁发凭据签名的密钥未在公共 did.json
文档中提供,则任何验证尝试都会失败,因为验证程序无法解析用作签名的公钥。 下面是需要注意的两种情况。
第一:已验证 ID 限制为在内部可最多使用 10 个密钥, 即一个当前密钥和九个先前密钥。 如果密钥保管库包含 12 个密钥,则已验证 ID 只会加载并使用前 10 个。 你无法手动编辑 did.json
文档来添加旧密钥,因为这会导致已验证 ID 加载的内容与 did.json
文档保存的内容不匹配。 在这种情况下,尝试调用 synchronizeWithDidDocument 会导致 didDocumentStatus
返回 outOfSync
。
例如,假定密钥保管库中有 12 个密钥,而你希望已验证 ID 不加载密钥列表中的密钥 8 和 9。 你必须在密钥保管库中禁用密钥 8 和 9,然后执行步骤 2-4。
第二:在此例中,如果轮换了密钥 12 次,则已验证 ID 不再加载两个最旧的密钥。 使用这两个密钥颁发的任何已验证 ID 凭据不再可以验证。
注意
密钥轮换策略需要与颁发的已验证 ID 凭据的生存期相协调,以便在旧密钥停用之前续订或重新颁发凭据。 例如,一种无效的解决方案是颁发过期日期超过 12 个月的已验证 ID 凭据,同时创建一个每月轮换密钥的密钥轮换策略。 这种解决方案在当年的最后两个月会遇到麻烦,因为旧密钥不再可用。
是否可以直接在密钥保管库中轮换密钥,而不是调用已验证 ID API?
不应在密钥保管库的管理门户中使用轮换功能。 已验证 ID 在调用 /signingKeys/rotate API 时执行的任务不仅仅是在密钥保管库中轮换密钥。