数字凭证

W3C 工作草案

关于本文档的更多详细信息
此版本:
https://www.w3.org/TR/2026/WD-digital-credentials-20260904/
最新发布版本:
https://www.w3.org/TR/digital-credentials/
最新编辑草案:
https://w3c-fedid.github.io/digital-credentials/
历史记录:
https://www.w3.org/standards/history/digital-credentials/
提交历史
编辑:
Marcos Caceres (Apple Inc.)
Tim Cappalli (Okta)
Mohamed Amir Yosef (Google Inc.)
前任编辑:
Sam Goto (Google Inc.) - 任职至
反馈:
GitHub w3c-fedid/digital-credentials (拉取请求, 新建议题, 开放议题)

摘要

本文档规定了一个 API,使用户代理 能够对 出示和签发数字 凭证进行中介,例如 驾驶执照、政府签发的身份证件或 其他类型的数字凭证。 该 API 建立在凭证管理第 1 级之上,并且 被设计为与 凭证格式无关。

本文档的状态

本节描述本文档 发布时的状态。当前W3C 出版物列表以及本技术报告的最新修订版可在 W3C 标准和草案 索引中找到。

本文档由联合身份工作 组使用 推荐标准 流程作为工作草案发布。

作为 工作草案发布并不意味着 W3C 及其成员认可本文档。

本文档是一份草案,可能随时被其他 文档更新、替换或废弃。除将本文档引用为 正在进行的工作外,以其他方式引用本文档均不适当。

本文档由一个 根据 W3C 专利 政策运作的工作组编制。 W3C 维护一份 任何专利披露的公开列表, 这些披露与该工作组的交付成果有关; 该页面还包括 披露专利的说明。任何实际 知晓某项专利并认为该专利包含 必要权利要求的个人, 必须按照 W3C 专利政策第 6 节披露相关信息。

本文档受 2025年8月18日 W3C 流程文档约束。

1. 引言

本节为非规范性内容。

本文档定义了一个 API,使网站能够请求数字凭证的出示 和签发。

该 API 与凭证格式无关,并被设计为可扩展 以支持多种出示协议和 签发协议。参见5. 协议。

该 API 旨在支持以下目标:

可以使用此 API 出示和签发多种类型的数字凭证。 这些类型的 示例包括:

2. 使用示例

本节为非规范性内容。

以下示例说明如何使用API 请求和签发数字凭证。

2.1 特性检测

在使用API之前,检查用户 代理是否支持所需特性非常重要。可以使用 以下代码进行检查:

示例 1:检查 API 支持情况
if (typeof DigitalCredential !== "undefined") {
  // 支持该 API
} else {
  // 不支持该 API
}

2.2 检查协议是否被允许

userAgentAllowsProtocol() 静态方法可用于 检查用户代理是否允许将特定协议用于 数字凭证签发或出示。这对于 在进行 API 调用之前检查用户浏览器允许哪些协议很有用。在实现了DigitalCredential 的浏览器中(可通过上面所示的 typeof 检查来检测),随着用户代理逐步采用对协议标识符的支持,这些标识符 会逐步添加到DigitalCredentialProtocol 中,因此使用未知 协议标识符调用此方法会安全地返回 false,而不会 抛出异常。请注意,如果在未定义DigitalCredential 的浏览器中调用此 方法,则会抛出ReferenceError,因此在使用此 方法之前,仍然需要上面所示的 typeof DigitalCredential !== "undefined" 防护检查。

示例 2:使用 userAgentAllowsProtocol() 静态 方法
if (DigitalCredential.userAgentAllowsProtocol("example-protocol")) {
  // 支持 DC API。继续进行签发或出示。
} else {
  // 不支持 DC API。例如,回退到
  // 传统的基于 HTML 表单的方法。
  showHTMLForm();
}

或者,可以检查对多个协议的支持, 并筛除不受支持的协议:

示例 3:使用 userAgentAllowsProtocol() 检查多个协议
const protocols = [
  "example-issuance-protocol",
  "another-issuance-protocol"
];
const supportedProtocols = protocols.filter(DigitalCredential.userAgentAllowsProtocol);
if (supportedProtocols.length > 0) {
  // 至少支持一个协议。继续进行签发。
} else {
  // 不支持任何协议。回退到其他签发方法。
}

由于协议标识符会逐步添加到DigitalCredentialProtocol 中,因此可以使用此方法优先选择较新的协议,同时 在旧版浏览器上平稳回退到较旧的协议:

示例 4:优先选择较新的协议,并回退到 较旧的协议
// 按偏好顺序排列;在实现 DigitalCredential 的浏览器中,
// 未知协议会返回 false,而不是抛出异常。
const protocol = [
  "example-new-protocol",
  "example-legacy-protocol",
].find(DigitalCredential.userAgentAllowsProtocol);

if (protocol) {
  // 使用此浏览器支持的最佳协议。
} else {
  // 未找到支持的协议。回退到其他方法。
}

2.3 请求数字凭证

以下示例展示如何使用 API 请求数字凭证。该 API 的入口点是 navigator.credentials.get() 方法, 该方法 用于从用户代理请求数字凭证。如果 用户代理支持出示,则允许用户通过数字凭证选择器选择数字 凭证:

示例 5:请求数字凭证
<button>验证身份</button>
<script>
  const button = document.querySelector("button");
  button.addEventListener("click", async () => {
    const protocol = "example-request-protocol";
    // 检查 DC API 和协议支持情况
    if (!DigitalCredential.userAgentAllowsProtocol(protocol)) {
      // 浏览器不允许使用此协议。
      // 回退到其他验证方法。
      showTraditionalVerificationForm();
      return;
    }
    try {
      const credential = await navigator.credentials.get({
        digital: {
          requests: [{
            protocol,
            data: { /* 出示请求数据 */ }
          }]
        }
      });

      // 将其发回验证者服务器进行解密和验证
      const response = await fetch("/verify-credential", {
        method: "POST",
        headers: {
          "Content-Type": "application/json"
        },
        body: JSON.stringify(credential)
      });

      // 检查响应
      if (!response.ok) {
        throw new Error("Failed to verify credential");
      }

      // 呈现验证结果
      displayVerificationResult(await response.json());

    } catch (error) {
      console.error("Error requesting digital credential:", error);
    }
  });
</script>

类似地,当站点需要签发一个 数字凭证时,数字凭证 API通过凭证管理器选择器,在站点、用户代理和 持有者的凭证管理器之间协调数字凭证的签发。

2.4 签发数字凭证

以下示例展示如何使用数字 凭证 API请求签发数字 凭证。要签发 数字凭证,网站会调用 navigator.credentials.create() 方法, 如果用户代理支持签发,该方法将启动签发 流程:

示例 6:请求签发数字凭证
<button>请求签发数字凭证</button>
<script>
  const button = document.querySelector("button");
  button.addEventListener("click", async () => {
    const protocol = "example-issuance-protocol";
    // 检查 DC API 和协议支持情况
    if (!DigitalCredential.userAgentAllowsProtocol(protocol)) {
      // 浏览器不允许使用此协议。
      // 回退到其他签发方法。
      showTraditionalIssuanceForm();
      return;
    }
    try {
      const credential = await navigator.credentials.create({
        digital: {
          requests: [{
            protocol,
            data: { /* 签发请求数据 */ }
          }]
        }
      });
    } catch (error) {
      console.error("Error issuing digital credential:", error);
    }
  });
</script>

2.5 跨源请求数字凭证

本规范允许通过 "digital-credentials-get" 策略控制特性,使用该 API 从远程/第三方源出示凭证。这 对于网站希望从托管在不同 源上的验证服务请求数字 凭证的场景很有用。可以在嵌入 希望使用该 API 的网站的 iframe 上设置权限策略。下面是一个 在 iframe 上设置权限策略的示例:

示例 7:跨 源请求数字凭证
<iframe src="https://verifier-service.example.com"
        allow="digital-credentials-get">
</iframe>

2.6 跨源签发数字凭证

类似地,本规范允许通过 "digital-credentials-create" 策略控制特性,使用该 API 从远程/第三方源签发 凭证。这 对于网站希望使用不同源上的签发服务来请求签发 数字凭证的场景很有用。可以在嵌入签发者 界面的 iframe 上设置权限策略。下面是一个示例:

示例 8:跨源签发数字凭证
<iframe src="https://issuer.example.com"
        allow="digital-credentials-create">
</iframe>

3. 范围

本节为非规范性内容。

以下事项属于本规范的范围:

以下事项不在本规范范围内:

4. 术语

注:正在讨论的 定义

本节中定义的目标是复用或建立 各种数字凭证格式 和协议共有的术语。这些定义仍在积极演进中。

凭证管理器选择器
一种由平台提供的用户界面,向用户呈现一个或多个 凭证管理器,允许用户 选择一个 凭证管理器来处理签发请求,或取消 操作。
凭证请求
一个出示请求或一个签发请求。
凭证响应
一个出示响应或一个签发响应。
数字凭证
一种经过密码学签名的数字文档,其中包含一个或多个 声明,这些声明由签发者针对一个或多个主体作出。
注:重点关注 与人员有关的数字凭证

本规范目前重点关注 与人员有关的数字凭证。

数字 凭证选择器
一种由平台提供的用户界面,向用户呈现一个或多个凭证 请求,允许用户选择一个 数字凭证或能够满足该请求的持有者,或者 取消操作。
注: 与凭证选择器的关系
签发协议
一种标准化协议,用于签发者 与持有者在签发数字凭证期间进行通信。该 签发协议由协议标识符标识。参见5. 协议。
签发 请求
签发请求是请求签发一个数字 凭证的请求, 由一些签发请求数据和一个 签发协议组成。
签发请求数据
一种数据结构,签发者或用户 代理通过 签发协议,用于请求由 签发一个数字凭证,该凭证由签发者签发。
签发响应
一种格式,持有者通过签发 协议,使用该格式来响应签发请求,该请求由 签发者发起。
出示协议
一种标准化协议,用于在持有者和验证者之间出示数字 凭证。协议由 协议标识符标识。参见5. 协议。
出示 请求
出示请求是请求一个数字 凭证的请求, 由出示请求数据和一个 出示协议组成。
出示请求数据
一种格式,验证者软件或用户 代理通过 出示协议,使用该格式从数字凭证的持有者处请求该数字凭证。
出示响应
一种格式,持有者的凭证管理器(例如数字 钱包)通过出示协议,使用该格式来 响应出示请求,该请求由 验证者发起。
协议标识符
一个字符串,由一个或多个ASCII 小写字母码 点、零个或多个 U+002D HYPHEN-MINUS 码 点以及零个或 多个ASCII 数字码 点(顺序任意)组成。例如, "123a-protocol"、"abc" 或仅为 "a"。
请求协调器
参见凭证请求协调器。

5. 协议

本规范定义了以下出示协议和 签发协议的使用。

用户代理必须支持受支持出示和签发协议 表中列出的所有出示 协议。用户代理也推荐支持 该表中列出的所有签发协议。

注:要求支持这些 协议的理由
注:检查用户代理允许哪些 协议
受支持的出示和签发协议表
标识符 规范
出示协议
openid4vp-v1-unsigned OpenID 可验证 出示 1.0 § A.3.1. 未签名请求
openid4vp-v1-signed OpenID 可验证 出示 1.0 § A.3.2. 已签名 请求
openid4vp-v1-multisigned OpenID 可验证 出示 1.0 § A.3.2.2. JWS JSON 序列化(多重签名请求)
org-iso-mdoc ISO/IEC 18013-7:2025 符合 ISO 的 驾驶执照,第 7 部分:移动驾驶执照(mDL)附加功能 § 附录 C
签发协议
openid4vci-v1 OpenID 可验证凭证签发 1.0 § 即将推出
议题: API 集成

5.1 转换请求协议

给定一个 DigitalCredentialGetRequest 或DigitalCredentialCreateRequest request,要转换请求协议:

  1. 如果 request 是:
    一个DigitalCredentialGetRequest:
    1. 令 protocolString 为 request 的 protocol。
    2. 如果 protocolString 不等于 DigitalCredentialPresentationProtocol 中的任何枚举值, 返回失败。
    3. 返回值等于 protocolString 的DigitalCredentialPresentationProtocol 枚举值。
    一个DigitalCredentialCreateRequest:
    1. 令 protocolString 为 request 的 protocol。
    2. 如果 protocolString 不等于 DigitalCredentialIssuanceProtocol 中的任何枚举值, 返回失败。
    3. 返回值等于 protocolString 的DigitalCredentialIssuanceProtocol 枚举值。

6. 凭证请求协调器

凭证请求协调器 是由用户代理定义的组件,通过顶级可遍历对象对数字 凭证 交互进行中介。每个顶级可遍历对象都恰好有一个关联的 协调器。该协调器 确保所有子可导航对象中最多只有一个交互处于活动状态,协调出示或 签发的端到端流程,并管理交互状态之间的转换。

凭证请求协调器维护一个活动 promise,用户 代理将其初始化为 null。通过此Promise, 协调器将异步 凭证请求工作流的状态反映给脚本,并在 交互成功完成时以凭证 响应兑现,或者在处理失败、 用户通过 UI 取消请求,或脚本通过AbortSignal中止 操作时拒绝。

凭证请求协调器维护一个中止信号,用户代理 将其初始化为 null。

凭证请求协调器维护一个中止算法,用户 代理将其初始化为 null。

凭证请求协调器:

用户代理可以根据用户或平台策略,将部分或全部协调器职责委托给 外部凭证管理器、平台组件或其他受信任 实体。

注

6.1 交互状态

凭证请求协调器具有一组有限的 交互 状态,用于管理凭证 请求的生命周期:

"空闲":
当前没有凭证请求正在进行。
"请求中":
一个凭证请求正在进行,并且用户 界面已呈现。
"中止中":
活动交互正在因错误、用户 操作或信号中止而被取消;协调器正在 清理,然后返回“空闲”状态。

协调器初始化为空闲交互 状态。

6.2 准备凭证请求

给定一个Window global、一个源 origin、一个 序列,其值为DigitalCredentialGetRequest 或一个序列, 其值为DigitalCredentialCreateRequest requests,以及一个可选的 AbortSignal signal,要准备凭证 请求:

  1. 令 realm 为 global 的相关 realm。
  2. 令 document 为 global 的关联的 Document。
  3. 如果 document 不是完全活动的,则返回一个被拒绝的 promise,其拒绝原因为一个 "InvalidStateError" DOMException,位于 realm 中。
  4. 如果 document 不是一个具有用户关注的顶层可遍历对象的完全 活动后代,则返回以一个 "NotAllowedError" DOMException 拒绝的 promise,该异常位于 realm 中。
  5. 如果 global 没有瞬态激活,则返回以一个 "NotAllowedError" DOMException 拒绝的 promise,该异常位于 realm 中。
  6. 消耗 global 的用户激活。
  7. 令 promise 为 realm 中的一个 新 promise。
  8. 如果凭据请求 协调器不处于 "空闲" 交互状态:
    1. 在DOM 操作任务源上,给定 global,排入一个全局任务,以用一个 "NotAllowedError" DOMException 拒绝 promise。
    2. 返回 promise。
  9. 断言:凭据请求协调器的活动 promise 为 null。
  10. 将凭据请求 协调器的交互状态设置为 "正在请求"。
  11. 将凭据请求 协调器的活动 promise设置为 promise。
  12. 令 validatedRequests 为给定 requests 运行验证凭据请求的结果。如果该操作 抛出一个异常 error,则:
    1. 使用 error 和 promise 拒绝 凭据请求。
    2. 返回 promise。
  13. 如果 validatedRequests 为空,则:
    1. 使用一个新创建的 TypeError 和 promise 拒绝 凭据请求。
    2. 返回 promise。
  14. 如果传入了 signal,则:
    1. 断言:signal 尚未中止。
      注

      预先中止的信号 会在调用此算法之前由请求一个 Credential和创建一个 Credential处理。

    2. 将凭据 请求协调器的中止信号设置为 signal。
    3. 令 abortAlgorithm 为以下算法,其闭包捕获 promise 和 signal:
      1. 如果凭据请求 协调器的活动 promise不是 promise,则返回。
      2. 给定 signal 的中止原因,中止 凭据请求。
    4. 将凭据 请求协调器的中止 算法设置为 abortAlgorithm。
    5. 将 abortAlgorithm 添加到 signal。
  15. 如果 document 不再是完全活动的,则使用一个 "AbortError" DOMException 中止凭据请求。
  16. 令 handled 为给定 promise 和 global 运行处理虚拟钱包行为的结果。
  17. 如果 handled 为 true,则返回 promise。
  18. 使用 document、validatedRequests、promise 和 signal 发起凭据请求。
  19. 返回 promise。

6.3 筛选凭证请求

给定一个由DigitalCredentialGetRequest 或 DigitalCredentialCreateRequest 对象组成的序列 requests,要筛选凭证 请求:

  1. 令 supportedRequests 为一个新的空列表。
  2. 对于 requests 中的每个 request:
    1. 令 protocol 为给定 request 执行转换请求协议的结果。
    2. 如果 protocol 为失败,继续。
    3. 如果给定 protocol 执行用户代理允许 协议返回 false,继续。
    4. 将 request追加到 supportedRequests。
  3. 返回 supportedRequests。
注

筛选发生在消耗用户激活之前,这样协议均不受支持的 请求会以TypeError拒绝,而不会消耗 用户激活。 后续在验证凭证请求中的验证可以安全地 假定所有剩余请求都使用 受支持的协议。

6.4 验证凭证请求

给定一个由DigitalCredentialGetRequest 或 DigitalCredentialCreateRequest 对象组成的序列 requests,要验证凭证 请求:

  1. 令 validatedRequests 为一个新的空列表。
  2. 对于 requests 中的每个 request:
    1. 如果 request 是DigitalCredentialGetRequest, 令 data 为 request 的data; 或者,如果 request 是 DigitalCredentialCreateRequest, 则为 request 的 data。
    2. 将 data序列化 为 JSON 字符串。
    3. 如果序列化产生异常,抛出 该异常。
    4. 根据 request 的出示协议 或签发协议或其他条件,验证 request 的出示请求数据或签发请求数据。

      除协议定义的要求外,用户代理 还可能根据本地策略、 配置或用户的选择应用验证条件。例如,用户代理可能拒绝请求 特定凭证 属性的请求。

      什么构成验证失败由具体协议决定,但 如何将此类失败归类为异常类型则 定义如下:

      注:协议特定的验证细节
      1. 如果验证失败:
        1. 令 error 按如下方式确定:
          用户代理基于 本地策略、配置或用户的选择不 允许该请求:
          一个创建的“NotAllowedError” DOMException。
          注

          “NotAllowedError” 被有意设计为 与用户取消操作时返回的错误无法区分, 这样网站就无法 判断请求是被用户 还是被用户代理拒绝, 也无法推断有关 用户配置或凭证的任何信息。

          由于与用户无关的安全原因, 例如上下文或传输,不允许该请求:
          一个创建的“SecurityError” DOMException。
          请求数据格式错误或无效:
          一个创建的TypeError。
          否则:
          一个创建的“OperationError” DOMException。
        2. 抛出 error。
      2. 否则,将 request追加到 validatedRequests。
  3. 返回 validatedRequests。

6.5 中止凭证请求

给定一个 JavaScript 值 error,要中止 凭证请求:

  1. 如果凭证请求 协调器的活动 promise为 null, 返回。
  2. 令 activePromise 为凭证请求协调器的 活动 promise。
  3. 如果凭证请求 协调器处于“请求中”交互状态:
    1. 将凭证 请求协调器的交互状态设置为“中止中”。
    2. 关闭数字凭证 选择器或凭证管理器选择器。
      注

      关闭操作可能会失败(例如,如果数字凭证选择器 因内存压力而被销毁),但协调器 无论如何都会继续完成凭证请求。

  4. 使用 error 和 activePromise拒绝凭证 请求。

6.6 拒绝凭证请求

给定一个(JavaScript 值)error 和一个 Promise promise,要使用给定错误拒绝 凭证请求:

  1. 断言:凭证请求协调器的活动 promise为 promise。
  2. 在给定 promise 的相关全局对象的DOM 操作任务源上排入一个全局任务,以执行 以下步骤:
    1. 如果凭证 请求协调器的活动 promise不是 promise,则返回。
    2. 令 signal 为凭证请求协调器的 中止信号。
    3. 令 abortAlgorithm 为凭证请求协调器的 中止算法。
    4. 如果 signal 不为 null 且 abortAlgorithm 不为 null:
      1. 从 signal 中移除 abortAlgorithm。
    5. 将凭证 请求协调器的中止信号设置为 null。
    6. 将凭证 请求协调器的中止 算法设置为 null。
    7. 以 error拒绝 promise。
    8. 将凭证 请求协调器的活动 promise设置为 null。
    9. 将凭证 请求协调器的交互状态设置为“空闲”。

6.7 发起凭证请求

给定一个Document document、一个由已验证凭证请求组成的列表 validatedRequests、一个Promise promise,以及一个可选的AbortSignal signal,要发起 凭证请求:

  1. 令 topLevelOrigin 为 document 的顶级可遍历对象的 活动文档的相关设置对象的 源。
  2. 令 requestData 为一个新的请求上下文,其请求为 validatedRequests,且顶级源为 topLevelOrigin。
  3. 并行地:
    1. 使用 requestData 显示一个数字凭证 选择器,并 等待以下结果之一:
      • 用户选择一个能够 满足该请求的数字凭证或持有者。
      • 用户取消操作。
      • 平台遇到错误。

      当用户代理与位于另一设备上的凭证管理器 通信时,用户代理推荐使用客户端 到验证器协议(CTAP)。

    2. 如果 signal 不为 null 且 signal 已中止:
      1. 返回。
        注:中止已处理

        由准备凭证 请求步骤添加到 signal 的中止算法会负责拆除数字凭证 选择器。

    3. 如果用户取消操作或未选择凭证:
      1. 令 error 为一个新创建的“NotAllowedError” DOMException。
      2. 使用 error 和 promise拒绝 凭证请求。
      3. 返回。
    4. 如果平台返回平台特定错误:
      1. 令 error 按如下方式确定:
        用户代理或平台不允许该操作:
        一个新创建的“NotAllowedError” DOMException。
        请求数据格式错误或无效:
        一个新创建的TypeError。
        已有凭证请求正在进行:
        一个新创建的“InvalidStateError” DOMException。
        否则:
        一个新创建的“OperationError” DOMException。
      2. 使用 error 和 promise拒绝 凭证请求。
      3. 返回。
    5. 如果用户选择了数字凭证:
      1. 令 protocol 为数字 凭证选择器为 此交换返回的协议标识符。
        注:协议由平台确定

        数字凭证 选择器或底层平台 确定将 validatedRequests 中的哪一项转发给 持有者,并返回该交换的协议 标识符。用户代理不 一定知道具体选择了哪一项。

      2. 令 responseData 为字符串出示响应或由持有者返回的字符串签发响应。
        注:为什么响应是字符串
      3. 在给定 document 的相关全局对象的DOM 操作任务 源上排入一个全局任务,以执行 以下步骤:
        1. 如果凭证请求 协调器的活动 promise不是 promise,则 返回。
        2. 令 parsedResponseDataOrError 为给定 responseData将 JSON 字符串解析为 JavaScript 值的结果。
        3. 令 abortSignal 为凭证请求 协调器的中止信号。
        4. 令 abortAlgorithm 为凭证请求 协调器的中止算法。
        5. 如果 abortSignal 不为 null 且 abortAlgorithm 不为 null,从 abortSignal 中移除 abortAlgorithm。
        6. 将凭证请求 协调器的中止信号设置为 null。
        7. 将凭证请求 协调器的中止算法设置为 null。
        8. 如果 parsedResponseDataOrError 是异常:
          1. 以 parsedResponseDataOrError拒绝 promise。
        9. 否则,如果 parsedResponseDataOrError 不是 对象:
          1. 以新创建的 TypeError拒绝 promise。
        10. 否则:
          1. 令 credential 为一个新创建的 DigitalCredential 实例,其 data 初始化为 parsedResponseDataOrError,其 protocol 初始化为 protocol。
          2. 以 credential兑现 promise。
        11. 将凭证请求 协调器的活动 promise设置为 null。
        12. 将凭证请求 协调器的交互状态设置为“空闲”。

7. 数字凭证 API

数字凭证 API 利用 凭证管理第 1 级 规范,使用户代理能够 协调签发和出示数字 凭证。

该 API 允许向用户代理请求一个 数字凭证,用户代理随后向用户呈现一个 数字凭证选择器,允许用户 选择一个 数字凭证来满足该请求。这是 通过 网站调用 navigator.credentials.get() 方法实现的,该方法 运行 凭证管理第 1 级的请求一个 Credential算法。 然后,该算法回调本规范的 DigitalCredential 接口的 [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 内部方法。

此外,该 API 还允许请求 签发一个数字凭证,这随后会 向用户呈现一个凭证管理器选择器,允许用户 选择一个凭证管理器来保存该数字凭证。这 是通过调用 navigator.credentials.create() 方法实现的, 该方法 运行凭证管理第 1 级的创建凭证算法。然后,该 算法回调本 规范的DigitalCredential 接口的 [[Create]](origin, options, sameOriginWithAncestors) 内部方法。

通过此 API 进行的数字凭证签发 与数字凭证出示略有不同。 响应数据包含持有者的 凭证管理器根据签发 协议定义返回的协议特定响应,而并不 表示实际签发的数字凭证本身。

有关如何与 凭证管理第 1 级 规范集成的完整细节,请参见凭证管理 集成。

7.1 CredentialRequestOptions 字典的扩展

WebIDLpartial dictionary CredentialRequestOptions {
  DigitalCredentialRequestOptions digital;
};

7.1.1 digital 成员

digital 成员 允许通过选项配置对数字凭证的请求。

7.2 DigitalCredentialRequestOptions 字典

WebIDLdictionary DigitalCredentialRequestOptions {
  required sequence<DigitalCredentialGetRequest> requests;
};

7.2.1 requests 成员

requests 指定一个出示协议和出示请求数据,用户代理 可以将其与 凭证管理器(例如数字钱包)进行匹配。

7.3 DigitalCredentialGetRequest 字典

DigitalCredentialGetRequest 字典表示一个出示请求。它用于 指定一个出示协议和一些出示请求数据,用户代理可以将其与 凭证管理器(例如数字钱包)进行匹配。

WebIDLdictionary DigitalCredentialGetRequest {
  required DOMString protocol;
  required object data;
};

7.3.1 protocol 成员

protocol 成员 表示出示协议。

protocol 成员的值 是 DigitalCredentialPresentationProtocol 中定义的协议标识符之一。

7.3.2 data 成员

data 成员是 要由持有者的凭证管理器(例如数字身份 钱包)处理的出示请求数据。

7.4 CredentialCreationOptions 字典的扩展

WebIDLpartial dictionary CredentialCreationOptions {
  DigitalCredentialCreationOptions digital;
};

7.4.1 digital 成员

digital 成员 允许通过选项配置数字凭证的签发。

7.5 DigitalCredentialCreationOptions 字典

WebIDLdictionary DigitalCredentialCreationOptions {
  required sequence<DigitalCredentialCreateRequest> requests;
};

7.5.1 requests 成员

requests 指定一个签发协议和签发请求数据,用户代理可以将其转发给 持有者。

7.6 DigitalCredentialCreateRequest 字典

DigitalCredentialCreateRequest 字典表示一个签发请求。它用于指定 一个签发协议和一些签发请求数据,以在 签发者和持有者之间传达签发请求。

WebIDLdictionary DigitalCredentialCreateRequest {
  required DOMString protocol;
  required object data;
};

7.6.1 protocol 成员

protocol 成员表示签发协议。

protocol 成员的 值是 DigitalCredentialIssuanceProtocol 中定义的协议标识符之一。

7.6.2 data 成员

data 成员 是要由 持有者的凭证管理器(例如数字身份 钱包)处理的签发请求数据。

7.7 DigitalCredential 接口

DigitalCredential 接口表示一个概念上的 数字凭证。

DigitalCredential 接口要求所有操作都进行用户介入,以确保用户控制和同意。

为了简化开发者使用涉及DigitalCredential 的get() 调用的体验,如果mediation 成员 不存在 或其值不是“required”,用户代理不得抛出 错误。 类似地,在涉及 DigitalCredential 的create() 调用中,如果 mediation 成员 不存在或其值 不是“required”,用户 代理不得抛出错误。 这使 “required” 介入成为该 API 隐含且 不可覆盖的行为。

WebIDLtypedef (DigitalCredentialPresentationProtocol or DigitalCredentialIssuanceProtocol) DigitalCredentialProtocol;

[Exposed=Window, SecureContext]
interface DigitalCredential : Credential {
  [Default] object toJSON();
  readonly attribute DigitalCredentialProtocol protocol;
  [SameObject] readonly attribute object data;
  static boolean userAgentAllowsProtocol(DOMString protocol);
};

DigitalCredential 实例是源绑定的。

7.7.1 protocol 成员

protocol 成员是 用于请求数字凭证的 出示协议,或者是 用于签发数字凭证的签发协议。

7.7.2 data 成员

data 成员是 凭证的响应数据。它包含可由 JSON 解析的 对象类型子集。

7.7.3 userAgentAllowsProtocol() 方法

userAgentAllowsProtocol() 方法允许数字 凭证验证者确定用户代理允许哪些出示协议和签发协议。

注

此方法不传达底层 操作系统/平台对出示协议 或签发协议的支持情况。

用户代理不得根据硬件可用性、软件的存在或配置、 凭证管理器或数字凭证的任何信息, 或用户配置或 偏好来改变响应值。如果响应值发生变化,用户代理会引入 指纹识别风险,并可能静默泄露 有关用户行为或配置的其他细节。响应值应该仅 随用户代理主版本变化,并指示浏览器是否支持 将使用该协议的请求分发到底层平台或 提供方。

给定一个 DOMString protocol, 要检查用户代理是否允许协议, 执行以下步骤:

  1. 如果 protocol 不是 DigitalCredentialProtocol 的枚举值, 返回 false。
  2. 如果用户代理允许 protocol,返回 true,否则返回 false。

调用此方法时,用户代理必须返回给定 protocol 执行用户代理允许协议的结果。

7.8 支持的数据结构

本规范中支持 DigitalCredential 的数据结构,例如枚举。

7.8.1 请求上下文结构体

请求 上下文是一个结构体,具有以下 项:

请求
一个由已验证凭证请求组成的列表。
顶级源
一个环境设置对象的源。

此枚举的值对应于5. 协议中列出的受支持出示协议。

WebIDLenum DigitalCredentialPresentationProtocol {
  "openid4vp-v1-unsigned",
  "openid4vp-v1-signed",
  "openid4vp-v1-multisigned",
  "org-iso-mdoc"
};

此枚举的值对应于5. 协议中列出的受支持签发 协议。

WebIDLenum DigitalCredentialIssuanceProtocol {
  "openid4vci-v1",
};

8. 与凭证管理第 1 级集成

8.1 [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 内部方法

调用时,如果用户代理不 支持出示请求(例如,平台 无法提供数字凭证选择器), [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 内部方法调用 Credential 的 [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 内部方法的默认实现,并传入相同参数。 否则:

  1. 令 requests 为 options 的 digital 的 requests 成员。
  2. 在给定 requests 的情况下,将 requests 设置为过滤凭据请求的结果。
  3. 如果 requests 为空,则返回一个以新创建的 TypeError 拒绝的 promise。
  4. 如果存在,则令 signal 为 options 的 signal。
  5. 令 global 为此对象的相关全局对象。
  6. 返回在给定 global、origin、requests 和 signal 的情况下准备凭据 请求的结果。

8.2 [[Store]](credential, sameOriginWithAncestors) 内部方法

调用时,[[Store]](credential, sameOriginWithAncestors) 必须调用Credential 的 [[Store]](credential, sameOriginWithAncestors) 内部 方法的默认实现,并传入相同参数。

8.3 [[Create]](origin, options, sameOriginWithAncestors) 内部方法

调用时,如果用户代理不 支持签发请求,[[Create]](origin, options, sameOriginWithAncestors) 内部方法调用Credential 的[[Create]](origin, options, sameOriginWithAncestors) 内部方法的默认实现,并传入相同 参数。否则:

  1. 令 requests 为 options 的 digital 的 requests 成员。
  2. 在给定 requests 的情况下,将 requests 设置为过滤凭据请求的结果。
  3. 如果 requests 为空,则返回一个以新创建的 TypeError 拒绝的 promise。
  4. 如果存在,则令 signal 为 options 的 signal。
  5. 令 global 为此对象的相关全局对象。
  6. 返回在给定 global、origin、requests 和 signal 的情况下准备凭据 请求的结果。

8.4 [[type]] 内部槽

DigitalCredential接口对象具有一个名为 [[type]] 的内部槽,其值为 "digital"。

8.5 [[discovery]] 内部槽

DigitalCredential接口对象具有一个名为 [[discovery]] 的内部槽,其值为 "remote"。

8.6 用户许可

本节为非规范性内容。

数字凭证 API是一个强大特性,需要终端用户的明确许可。此 要求在调用CredentialsContainer 的 get() 方法时以规范性方式强制执行。

9. 权限策略集成

本规范定义了两个策略控制特性:

"digital-credentials-get"
一个策略控制特性,允许文档 请求数字 凭证。其默认允许列表为 'self'。请求一个 Credential 算法作为策略执行点。
"digital-credentials-create"
一个策略控制特性,允许文档 签发数字凭证。 其默认允许列表为 'self'。创建一个 Credential算法 作为 策略执行点。

10. 安全考虑

本节为非规范性内容。

以下各节描述该 API 的安全属性、 范围内的威胁、安全性所依赖的假设,以及 应用缓解措施后仍然存在的残余威胁。本 规范仅针对用户代理在 对凭证响应进行中介时的行为定义要求。

注

其他依赖于协议、凭证 管理器实现、操作系统或传输安全性的安全考虑 被描述为预期或前置条件,但除非已经以规范性方式 规定,否则这些内容并非 本规范的规范性要求。

10.1 威胁模型

本规范的威胁模型包括针对该 API 以及生态系统相邻标准的威胁。

对于本规范,威胁分为两类:范围内 威胁和范围外威胁。

10.1.1 范围内威胁

范围内威胁是由 DC API 本身引入或处理的威胁。以下是本 规范的范围内威胁:

请求篡改
能够在不安全上下文中注入或修改页面内容的 网络攻击者试图在处理之前更改 DigitalCredentialGetRequest 或DigitalCredentialCreateRequest。
API 泛滥
恶意网站试图通过快速、 重复发出请求来压垮 API,以耗尽系统资源、迷惑用户、 创建不必要的凭证交互,或导致提示疲劳, 从而降低用户体验。这包括在 不适当的时机发出请求,例如页面加载期间或缺乏有意义的 用户上下文时。
未经授权的跨源访问
恶意网站试图通过嵌入的第三方内容(例如 iframe) 请求或签发数字凭证,而没有 获得嵌入网站的明确许可,这可能会导致 凭证收集或对敏感用户数据的未经授权访问。
针对底层平台的恶意载荷
恶意网站试图利用底层操作系统或 凭据管理器中的漏洞,方法是通过 API 传递 精心构造或格式错误的协议请求。

10.1.2 范围外威胁

超出范围的威胁是指由协议、 凭据管理器、操作系统平台安全机制或 传输层处理的威胁。 即使这些威胁“超出范围”,它们仍然具有相关性,因为它们会影响 凭据出示和签发的端到端安全性。以下内容定义了本 规范的超出范围的威胁:

操作系统 或设备遭入侵
获得用户操作系统或 设备硬件控制权的攻击者可能绕过用户 代理的保护措施,直接从存储中提取 敏感凭据数据,或操纵 API 调用。此威胁由操作系统平台安全性和 硬件支持的密钥库来应对。
恶意 凭据管理器
用户可能会安装,或因机构强制要求或 基本服务而被迫使用某个凭据管理器,该管理器 会故意泄露数据、未能安全加密凭据,或 无视用户同意。虽然该 API 在钱包 选择之前通过明确的用户许可来保护用户(参见 11.6 用户许可与透明度),但一旦用户 授权某个凭据管理器处理请求,该 API 就无法约束其 内部行为。缓解此风险依赖于操作系统 平台安全性、应用商店审核,以及 用于监管钱包提供商的法律/监管框架。
协议 和格式漏洞
所使用的特定呈现协议、签发协议或凭据 格式中的弱点(例如,加密缺陷、不安全算法、缺少 重放保护或缺少请求认证)可能允许 攻击者拦截、伪造或篡改传输中的凭据。 缓解措施主要发生在协议、格式和传输 层(例如,强制响应加密、请求签名以及 TLS)。虽然该 API 不定义特定于格式的密码学,也 不检查协议载荷的密码学安全性,但它会对所支持的协议实施 基线安全标准(例如要求 响应 加密并 鼓励使用已签名 请求),以 引导请求通过最安全的路径。

10.2 缓解措施

以下缓解措施通过规范中的规范性要求应对范围内威胁。

Digital Credential API 的 WebIDL 接口仅在 安全上下文中公开,从而降低通过篡改的风险,这些篡改来自 不安全上下文(例如,通过网络注入恶意脚本)。有关更多信息,请参阅 安全 上下文规范的 § 5 安全注意事项一节。

为了降低针对底层平台的 恶意载荷风险,用户代理使用JSON 序列化将请求参数传递给凭据管理器(参见 验证凭据请求)。底层 平台和凭据管理器负责在对这些 特定于协议的 JSON 载荷执行操作之前,对其进行可靠的解析和验证。

Digital Credentials API 通过两种 机制减少API 泛滥:

有关防止滥用凭据请求的其他指导, 请参阅 凭据管理第 1 级 规范的 § 7 隐私注意事项一节。不过需要注意的是,这些 保护措施存在局限性,因为网站仍可能采用暗黑模式 来诱导用户进行不必要的交互,从而触发凭据 请求。

Digital Credentials API 通过与 权限策略集成(参见权限策略 集成),减少跨源滥用。 请求一个 Credential和创建一个 Credential算法 分别作为 "digital-credentials-get" 和 "digital-credentials-create" 策略控制特性的策略执行 点。这两个特性是有意分开的:网站可以启用 "digital-credentials-get" 而不启用 "digital-credentials-create",反之亦然, 从而将每个 嵌入式上下文限制为仅具有其所需的能力。有关此集成提供的其他安全 属性,请参阅 权限策略规范的 权限策略一节。

此外,来自不透明源的请求会被拒绝。由于 DigitalCredential 实例是源绑定的,因此从不透明源请求或创建数字凭据的调用(例如 data: 文档,或在没有 allow-same-origin 的情况下被沙盒化的文档)会被凭据管理第 1 级拒绝, 从而降低恶意从不受信任的 环境中提取或欺骗的风险。

10.3 签署演示请求

当出示协议提供一种 对请求进行签名的方式时,强烈建议验证者使用该方式。

未签名的请求可能被运行在 验证者自身页面中的脚本修改,例如由恶意浏览器 扩展注入的脚本。该脚本可以更改所请求的内容,将一个 范围有限的请求变成要求提供更多内容的请求,并且还可以替换 用于加密 响应的参数,使响应被加密给攻击者,而 不是验证者。要求在安全上下文中使用该 API 并不能阻止这种情况,因为 攻击者已经 位于该上下文内部。对于未签名的请求,凭据管理器只能 相信验证者已使自己的页面不包含此类 脚本。另一方面,已签名的请求会为凭据管理器提供可供检查的内容,因此这种 更改可以被检测到,而 不会在未被察觉的情况下通过。

即便如此,只有当凭据管理器能够 判断签名属于发出请求的验证者时,签名才有帮助。页面 内的脚本可以使用自己的密钥对被修改的请求重新签名,因此 除非能够依据一个已被 识别为属于验证者的签名密钥来检查签名,否则签名无法防御此类攻击者。 接受哪些签名密钥,以及如何 建立这些密钥,由凭据 所属的生态系统决定,而不是由本规范决定,并且 已签名请求实际提供的保护取决于该决定。除了 防止同一设备上的页面内篡改之外,请求签名 在跨多个设备出示凭据时还提供关键的纵深防御(参见 10.4 跨设备安全与邻近性)。

10.4 跨设备安全性和邻近性

Digital Credentials API 支持跨设备体验,在这种体验中, 用户从辅助设备出示数字凭据,例如由智能手机充当凭据管理器,并将其出示给主 设备,例如笔记本电脑。虽然具体的数据交换 协议(例如,加密格式和传输方式)不在 此 API 的范围内,但这类跨设备交互通常依赖 已建立的协议,例如客户端到认证器协议 (CTAP)(客户端 到认证器协议 (CTAP))。

这些协议通过建立加密安全 信道并强制要求物理邻近性(例如,通过蓝牙 低功耗)来确保安全,以缓解远程中继攻击。关键的是,在 跨设备流程中,凭据管理器不能天然信任 由主设备转发的源字符串,因为主 设备或其浏览器可能已被攻陷。因此,采用 已签名请求的协议,其中验证者以加密方式 证明其身份,相比仅依赖浏览器声明的源,能够提供显著更强的安全 保证。

11. 隐私考虑

本节为非规范性内容。

议题:隐私 考虑一节仍在编写中

随着本文档不断演进,本节仍在编写中。

数字凭证 API 集成于一个复杂的生态系统中,该生态系统具有 多个技术层和各种参与者(包括但不限于 验证者、持有者和签发者),其中每个参与者 都必须考虑用户隐私的不同方面。本规范 并不试图详尽列出 不同参与者的所有考虑事项。我们希望将这些参与方引导至 多种从更整体角度探讨数字凭证威胁 模型的其他资源:

相反,这些考虑聚焦于数字凭证 API 本身,并描述用户代理如何在实现该 API 时履行其用户代理职责, 同时考虑与其交互的生态系统的 相关隐私属性。

数字凭证的隐私考虑并非静态不变。随着生态系统 成熟,它们会随时间演进,并且可能受到 生态系统中其他参与者行为、技术栈其他 层的改进、对用户隐私的新威胁,以及不断变化的 社会规范和法规的影响。

期望参与数字凭证 API 设计和 实现的各个工作组积极监测 不断变化的隐私环境,并参与 API 相应的 演进。

11.1 设计考虑和替代方案

数字凭证 API 被设计用于对网站发出的 数字凭证请求进行中介,并与凭证 格式、其中包含的信息,以及用于 交换该凭证的协议无关。这一设计以及其他关键设计选择源于 一个目标:为用户提供相比现有替代方案(例如 [custom-schemes])更安全且更注重隐私的凭证 交换体验,同时仍与常见交换 协议兼容,以便于采用。

API 提供验证者与 持有者之间的连接接口,即用于启动凭据呈现协议以及用户切换到持有者应用程序以选择凭据的方式。过去用于此目的的解决方案包括二维码和自定义 URL 方案。如 在 Web 上呈现凭据和 身份呈现中的自定义方案相关问题 所述,这些解决方案存在安全性、隐私性和可访问性方面的问题。

随着数字凭据技术的采用受到生态系统需求和监管要求的推动,Web 平台为上述不理想的技术提供了一种替代方案,该方案易于开发者使用,与现有的凭据 呈现协议兼容,并且最重要的是, 相比上述替代方案,为用户提供了更好的隐私、安全性和可访问性特性。

数字凭证 API 使用户 代理能够 代表用户进行中介协调(例如,以数字凭证选择器或凭证管理器选择器的形式),以便 为请求提供上下文并 防止 立即暴露给持有者应用程序。它还对 支持的协议实施某些最低要求,例如 响应 加密。

注

11.2 隐私范围

数字凭证 API 服务于具有 不同数据披露程度的各种用例,也服务于 根据所处上下文而具有不同偏好的不同用户。 值得注意的是,由 此 API 中介的凭证交换的隐私属性可能会受到 单个用户所处法律和监管环境的强制要求。

这意味着某些用户可能不希望或不被允许使用 最能保护隐私的凭证信息交换方式。 尽管如此,用户代理仍需要为用户提供 默认保护隐私的体验,并保护他们免受伤害。

由于存在这种偏好和用例范围, 用户代理可能很难判断用户是否有意 暴露其个人信息,还是受到诱骗而这样做。 因此,用户代理有责任确保每个 用户在交换开始之前都了解自己正在共享哪些数据,以及谁将参与 信息交换。

11.3 出示协议和凭证格式

由于数字凭证 API 位于 涉及多个独立参与方的交换中心,这些参与方用于 交换用户信息的出示协议和凭证格式对于 用户代理保护用户隐私的目标至关重要。

11.3.1 面向用户隐私的出示协议考虑

我认为有两项协议要求需要进一步阐明:

必须已经过隐私审查 [...]

以及

必须已经过安全审查 [...]

从技术上讲,一份声称“这个协议在各方面都很糟糕”的审查也满足这些 标准。

如果存在一套协议必须满足的具体隐私和安全 要求会更有用,这样审查就能够判断某个 标准是否已经达到。审查中可能存在一些主观因素, 但也应该存在每个协议都必须达到的最低门槛。

这超出了当前纳入标准中的现有要求。我手头没有完整的清单,但应该 可以制定一份。一旦制定,该清单就应该写入规范。例如, 协议是否依赖“回传”?协议(或其传输的格式)是否保证出示的 不可关联性?或者——鉴于不可关联性对于某些用例并无意义——API 在什么 条件下要求协议提供不可关联性?协议提供哪些透明度 机制?哪些类型的隐蔽信道是可以接受的?

11.3.1.1 选择性披露

选择性披露是用于数据最小化的一项基础技术, 它允许持有者共享验证者请求的最低必要信息。预期协议能够通过允许验证者指定所需的确切声明,来支持选择性披露。

11.3.1.2 不可关联的出示

不可链接性 是一种属性,用于确保如果用户多次呈现凭据中的属性,验证者无法将这些独立的呈现关联起来,从而推断它们涉及同一用户 (验证者-验证者可链接性),或者验证者无法与发行者串通,以报告从凭据管理器向发行者交换凭据的情况(验证者-发行者 可链接性)。前者是一种可以由持有者和发行者维护的属性,例如通过为各个验证者签发新的凭据。

虽然后者可以通过例如 零知识 证明实现, 但 API 的设计选择(例如加密响应)使得用户代理无法证明验证者-发行者不可链接性在实际中已经实现。不过,协议应尽可能限制可链接性。

请注意,不可链接性仅针对无法与特定用户身份关联的属性进行考虑。固有可链接的属性,例如姓名、驾驶执照号码或电话号码,不会从不可链接性中受益。

通过 Digital Credentials API,用户 代理可以帮助 验证者和凭据管理器交换不可关联的 属性,但由于响应加密,它无法保证 验证者与 凭据管理器之间不会传递任何可关联的信息。建议 用户代理 在其用户许可体验中考虑这一事实。

议题 279:将可关联性和 签发者参与作为协议要求 privacy-tracker

此 API 的目标是哪种程度的不可关联性?我们能否 以规范性方式强制支持任何特定的不可关联性 特性?

11.3.1.3 “回传”机制

“回传 信息”是指 数字凭据的出示或验证导致向 签发者或其他中心实体发回通知或通信的情形,这可能导致对个人的 跟踪和 用户画像。

与不可关联性类似,用户 代理无法 确保在用户授予 继续处理凭据请求的许可后,签发者不会主动参与凭据出示的创建或 验证。从那时起, 凭据管理器负责作出这一决定。 虽然某些凭据 管理器可以被视为用户 代理,但通常 建议实现 Digital Credentials API 的用户代理设计其许可 体验,以防止在用户确认之前 将 请求暴露给凭据管理器 (同时应考虑集成多个协作用户代理的 注意事项)。

协议必须支持允许签发者、 凭据管理器和验证者避免或减少 对“回传信息”机制依赖的机制。

问题 279:作为协议要求的可关联性和 签发者参与 隐私跟踪

此 API 的目标是哪种程度的不可关联性?本 规范可以在多大程度上强制限制签发者的参与?

11.3.1.4 不可关联的撤销

签发者参与凭证交换的一个常见情形 是进行凭证撤销检查。当出示旨在实现 验证者—签发者不可关联时,这尤其具有挑战性。 当通过例如零知识 证明 使凭证出示不可关联时, 协议中使用的凭证格式应支持 密码学 累加器等离线撤销方法。还期望协议设计和 规范尽可能不鼓励验证者为 撤销目的而参与。

议题 280:我们能否要求 协议支持不可关联的撤销? privacy-trackerregistry

我们应该讨论不可关联撤销技术是否 足够实用,可以作为规范性要求。

11.3.1.6 支持验证者授权

验证者授权是指验证者 证明其身份并证明其有合法权利请求特定属性或凭据的过程。这在交换敏感数据时尤其有用,例如来自政府签发凭据的数据。验证者授权可以限制不必要或滥用性的凭据请求,并确保验证者的访问权限 被限制在其注册的特定凭据属性范围内。

检查验证者授权通常由 凭据管理器处理,但用户代理可以发现 此类方案的存在有助于防止 API 滥用,并设计充分知情的用户权限体验。

议题 281:仅支持已授权验证者的用户代理 (针对政府凭证) privacy-tracker

我们是否应该要求协议包含使用户代理能够理解验证者 授权的规定?

11.3.1.7 加密凭证响应

为了防止用户信息在“传输”过程中暴露给其他方,例如加载在验证者 页面上的浏览器扩展程序,并鼓励验证者安全存储用户凭据,协议必须支持并要求在凭据交换中使用加密响应。

与#49以及我们进行过的其他几次 讨论有关:我们是否要规定响应必须始终加密 (如果是,应使用哪些算法),还是可以将其保留为可选?

11.4 不必要的凭证请求

不必要的凭证请求是整个 数字凭证生态系统的一项主要隐私风险。它们可能以不同方式 出现,并具有不同动机:

这里的一个挑战是确定什么构成“有效”目的, 因而哪些请求属于“不必要”,这需要 参与凭证交换的所有各方共同参与。

为了更详细地探讨如何确定和处理 不必要的使用,分别考虑政府签发的 凭据和其他凭据是合理的,因为它们在 数据敏感性、滥用可能造成的危害以及 法律和监管方面的考量上可能有所不同。

风险缓解和确保用户控制的一个关键组成部分, 且适用于这两类凭据,是用户 代理 检查凭据请求元数据并据此作出决定或进行 UI 呈现的能力。本规范通过协议要求确保用户 代理能够访问这些信息,这些要求规定请求应以 未加密形式传输并包含相关信息(参见5. 协议 和6.2 准备凭据请求)。

11.4.1 政府签发的凭证

政府签发的 数字凭证包括旅行证件、个人许可证、 福利和公共卫生项目证明、车辆登记文件, 以及由政府机构签发的其他文件,或其他 表示此类信息的文件。这些文件高度 敏感,因为它们可能包含永久、不可撤销且唯一的 标识符,而这些标识符对于个人身份以及 与重要公共服务交互的能力至关重要。

11.4.1.1 政府凭证被盗和泄露的风险

这些凭证对用户和攻击者具有很高价值,这意味着 存在显著的盗窃风险,并且泄露给未经授权的第三方 可能造成重大伤害。这包括出于跟踪和 个性化目的请求政府身份信息。

11.4.1.2 政府凭证请求扩散的风险

政府凭证在线可用性提高所带来的一个主要担忧是 杰文斯悖论, 即由于访问阻力降低而增加凭证需求的可能性。 这种影响并非数字凭证 API 固有造成的,而是整个生态系统中数字凭证 日益广泛采用的结果,不过 用户 代理实现 数字凭证 API 很可能会进一步推动这一趋势。因此,这种影响需要由 实现该 API 的用户代理加以考虑,因为它可能 给用户带来有害后果:

  • 信息泄露风险增加,并最终导致 Web 上的用户体验 更不值得信任。当大量服务 以不安全的方式访问和存储政府签发的凭证 (即未保持加密或未能保护私钥)时, 数据泄露和未经授权访问的可能性也会增加。 即使是出生日期和邮政编码这类看似不能识别身份的信息, 组合起来也可以在统计意义上识别 个人。
  • 当大量网站提示用户共享个人信息时, 会造成提示疲劳并降低用户信任。
  • 监视 的可能性增加,并限制在线服务的假名化使用。验证者与签发者或其他参与方之间的串通,可能导致 能够严密监控用户在 Web 上的活动并 对该个人采取不利行动。即使没有采取任何行动, 仅仅存在监视的可能性也可能导致焦虑、 不适以及抑制和自我审查等行为变化, 影响个人自主权和表达自由。
  • 排斥 和歧视无法或不愿 提供这些凭证的个人,使他们无法参与 以前不要求政府签发 凭证的服务,例如 Web 上的论坛和社交媒体平台。
11.4.1.3 缓解不必要的政府凭证请求

上述政府签发数字凭证的风险构成了一项 无法由生态系统中的单一参与者解决的挑战, 需要各个主权国家内部就 使用现实世界凭证访问在线服务的风险和收益 开展更广泛的政策讨论。

最好由签发数字凭证的政府 同时制定法律法规,明确规定这些凭证可以如何使用以及 可用于哪些目的。参与交换的所有各方, 无论法律是否要求其这样做, 都建议支持任何政府验证者身份验证 方案(如果存在)。支持(并集成) 验证者身份验证方案,例如 EUDI 访问和注册证书,可以缓解 不必要凭证请求扩散的风险。然而, 并不能保证存在此类方案,这会显著 增加凭证交换的风险。

实现数字凭证 API 的用户 代理还可以采取其他实际措施来降低风险、增进用户 理解并防止某些类型的伤害:

  • 仅支持能够实现选择性披露和 其他数据最小化技术的协议,可以降低信息泄露的影响和 可能性,并在许可和同意流程中为 用户提供更好的上下文。
  • 支持允许使用零知识 证明等不可关联性机制的协议,可以 通过隐藏签发者来防止基于验证者的监视和潜在 歧视。
  • 提供有用的上下文和清晰易懂的许可 流程将帮助用户更好地决定是否 接受凭证交换,从而降低在没有具体用户需求的情况下 发出交换请求的可行性。

此外,用户 代理设计能够考虑缺少这些缓解措施的许可 体验至关重要,例如,在没有任何验证者身份验证方案的情况下 交换政府凭证中的个人信息。建议 对这类交换施加 更高程度的操作阻力,并向用户提供明确消息突出 所涉及的风险。

11.4.2 非政府签发的凭证

非政府签发的凭证包括所有其他并非由 政府签发且不表示政府签发文件的数字 文档、证书和证明。 其中可能包括就业证明、(非政府)教育 凭证或电影票。值得注意的是,其交换可能 较少受到法律法规的限制。虽然这些文件通常 不具有与政府签发凭证相同的风险,但它们 也可能包含可识别身份或敏感的信息。

11.4.2.1 非政府凭证被盗和泄露的风险

非政府凭证被盗和泄露的影响及可行性 在很大程度上取决于每种 凭证类型的内容。一般而言,这可能导致对 敏感私人信息失去控制并将其暴露,还可能导致 冒充和数据盗窃,从而增加 针对受影响个人进一步攻击的可能性。

11.4.2.2 非政府凭证请求扩散的风险

非政府凭证的灵活性和缺乏监管 带来了被滥用于跨站跟踪 以及通过电子邮件地址或电话号码等长期存在的标识符关联身份的可能性。参与基于数字凭证的跟踪 方案的验证者可能会制造用户激励,使用户 在没有充分理解对其隐私影响的情况下, 接受在多个网站间共享标识符凭证(Web 的“会员 卡”)。

即使不愿在这种方案中共享信息的用户 也可能受到提示疲劳的影响,并可能面临被排除在 这些服务之外的风险。

11.4.2.3 缓解不必要的非政府凭证请求

对于非政府签发的凭证,建议 用户代理理解所请求的凭证 格式及其隐私属性,并建立风险框架,用于决定 向用户显示的上下文,以及 对每种凭证类型适当的操作阻力程度。参与此类凭证交换的协议和格式通常应 支持选择性披露和不可关联性等特性, 但这些特性不一定总是适合或必需, 尤其是在交换电影票等低风险 凭证时。

能够识别所请求凭证类型的用户代理 应根据所请求的凭证定制其许可体验, 并帮助用户理解共享该凭证的 后果。

不能期望用户代理理解所有 凭证请求。无法识别所请求凭证类型的用户代理应显著增加 许可体验中的用户操作阻力,并明确向用户传达 与网站共享未知凭证的风险。请注意, 这可能需要在 不同用户 代理之间进行集成,以施加 适当程度的阻力和透明度。例如, 浏览器可能会将有关凭证请求的知识委托给 操作系统,而操作系统可能要求凭证管理器 注册已知凭证类型,并拒绝未知凭证类型的 交换请求。

议题 100:考虑 在用户代理请求验证方面应用健壮性原则 discussionprivacy-considerations

需要为用户提供适当透明度的需求,与 让生态系统无需获得用户代理明确认可即可开发新凭证 格式的愿望相冲突。

11.4.2.4 报告滥用
议题 267:报告凭证请求的 滥用 privacy-trackerprivacy-considerations

考虑为提出不必要和滥用性请求的验证者 建立可互操作的滥用报告系统。

11.5 指纹识别和数据泄露

11.5.1 浏览器指纹识别

虽然该 API 确保任何用户数据都不会在没有 许可提示的情况下共享(参见 [[[#user-permission-and-transparency|用户 许可和透明度]] 一节),但 数字凭证 API 可能返回的现实世界标识符具有长期性和唯一性, 使其成为跟踪器和 指纹识别者的潜在目标。

即使采用选择性披露,攻击者也可能组合 数字凭证中的数据(例如用户年龄、凭证 签发者、时间戳;参见 [[[#leaking-incidental-data|泄露 附带数据]] 一节)来重新识别和/或对用户进行指纹识别。

对于第三方攻击者(例如嵌入在 验证者页面上的脚本,但未为了跟踪目的与其主动 协作),这种攻击可能更困难,因为响应 加密是强制性的,并且响应应该在 验证者的服务器上解密。因此,验证者可以确保不 将解密后的信息反射回客户端 JavaScript。不过,并非所有 验证者都会选择这样做。

11.5.2 凭证出示时泄露附带数据

为确保凭据的真实性,将其出示给 验证者时,通常会包含比 验证者请求访问的内容更多的信息。它通常至少会 包含 签发者和凭据管理器的签名, 还可能包含其他元数据。

这些额外信息可能被用于重新识别用户和 对用户进行指纹识别,这在原本 不可关联的出示过程中尤其值得关注。

虽然 Digital Credentials API 不控制 凭据响应的内容,但用户代理可以通过明确突出显示 除所请求信息之外,哪些信息可能会与验证者共享, 并且更广泛地通过识别和阻止验证者利用该 API 进行指纹识别,来帮助保护用户免受此类跟踪。

11.5.3 通过协议可用性揭示设备属性

Digital Credentials API 通过 userAgentAllowsProtocol() 公开有关出示和签发协议是否受 用户代理支持的信息。 它通过不根据例如 用户设备上安装了哪些凭据管理器应用程序 来定制其响应,从而缓解浏览器 指纹识别以及用户设备 配置信息的泄露。因此,返回的信息至多等同于一个 用户代理版本。

11.5.4 避免泄露凭证可用性

数字凭证 API 不允许网站在未先经过 用户许可 流程的情况下获知某个 凭证是否可用。 揭示凭证的存在会对用户 隐私造成风险,因为凭证的存在本身就是用户可能 不希望与网站共享的个人信息,而且与 其他信号结合后,可能在未经用户许可的情况下用于识别用户。 这也会对表达自由构成风险,因为 网站可能会越来越多地要求用户出示这些 凭证才能访问服务,从而排除 不愿出示凭证的个人。

为确保此保护措施足够稳健,API 返回的错误 不会通过可观察到的差异(例如不同的错误类型或时序 攻击)泄露有关用户可用凭据的信息。例如,当用户没有 匹配凭据时拒绝请求,与用户取消提示时拒绝 请求会返回相同的通用错误。此外,为了 在不依赖人为延迟的情况下防止时序攻击,用户 代理在未找到匹配凭据时会向用户显示一个对话框(例如空的选择器或 通知),从而使提示框被关闭的延迟 无法与用户取消操作区分开来。

11.6 用户许可和透明度

议题:仍在 编写中

Digital Credentials API 能够通过凭据与网站共享高度个人化、 敏感且存在风险的用户信息,并可能通过永久、唯一、不可撤销的跨上下文 标识符,使网站能够在线上 和线下跟踪用户。它还会向特定网站和/或 凭据管理器透露用户的部分浏览活动以及其表明身份的意图。在凭据请求中, 用户代理的一项关键职责是获得用户 继续进行信息交换的许可。

用户要就是否继续进行凭据交换 作出知情决定,需要了解的重要上下文详细信息包括 以下内容:

建议用户代理在实现中确保 在交换任何与用户相关的信息之前,将上述详细信息完整披露给 用户。

议题 252:我们是否应以规范性方式 定义权限提示的元素? privacy-considerations

这些内容是否应该在规范中成为规范性要求?

议题 44:API 请求应 向网站提供其说明为什么以及如何使用所请求凭证信息所需的信息 enhancementpending closureprivacy-tracker

API 是否应被设计为允许网站提供与上下文相关的 说明?

11.6.1 处理多个凭证请求

议题 286:多个出示请求 (和响应)的隐私考虑 privacy-trackerprivacy-considerationsv2

我们需要描述处理凭证出示的多个请求和响应时的 担忧、权衡以及可能的缓解措施。

11.6.2 集成多个用户代理

根据用户系统的技术架构, “用户 代理”的定义很可能包括 软件栈中的多个协作层,例如浏览器 和操作系统。这些层最优先考虑的事项 必须是安全且信息充分的用户许可体验。因此, 集成对于用户安全可能至关重要。某些层可能持有 其他层无法访问的信息,例如 用户凭证的可用性。过度提示或在 缺少足够上下文的情况下提示可能导致(可被利用的)混淆和 提示麻木。

因此,提示许可的用户代理 应在认为这样做安全的前提下集成软件层, 以获得理想的用户体验。例如, 如果浏览器信任操作系统的 API 契约会显示 适当的提示,则可以不再自行显示提示。

11.6.3 选择凭证管理器之前的许可

作为用户许可流程的一部分,用户 代理需要 确保用户保留选择是否将 凭证请求转发给凭证管理器以及选择哪个凭证 管理器的权力。这是因为请求过程中会发生 信息披露,而且凭证 管理器在收到请求时能够保留或共享这些信息。

11.7 数据清除与持久状态

Digital Credentials API 本身不会引入新的 由浏览器管理的持久状态或本地存储机制。通过此 API 请求的凭据由外部凭据管理器或操作系统存储和管理。 因此,当用户清除给定源或全局的浏览数据(例如 Cookie 或本地存储)时,通常不会 清除或影响这些外部 管理器中保存的凭据。

12. 无障碍考虑

用于选择和授权数字 凭证的用户界面由平台提供,并且在很大程度上超出了 本规范的范围;但是,该 体验的无障碍性属于本规范的范围(参见3. 范围)。以下指南 适用于实现数字凭证选择器、凭证管理器选择器及其相关流程的用户代理和平台, 并引用了 [WCAG22] 中相关的成功标准。如果任一选择器 是非 Web 用户界面,则这些 标准按照 [WCAG2ICT-22] 中的说明适用。

在签发或出示期间呈现的模态对话框内容(其中可以包括 文本、二维码和其他视觉媒体)应该具有标签,并以适当的名称、角色和值 向辅助技术公开 (参见§ 成功标准 4.1.2 名称、角色、值),并且应该为非文本内容提供文本 替代内容(参见§ 成功标准 1.1.1 非文本内容)。

交互状态的变化,例如等待另一 设备、成功响应、错误或取消,应该能够 以编程方式确定,并传达给辅助技术, 而无需改变焦点(参见§ 成功标准 4.1.3 状态消息)。

当操作失败时,用户代理会以若干不同错误之一 拒绝;例如,"NotAllowedError"、 "InvalidStateError" 或 "OperationError" DOMException,或 TypeError。如果平台将 此类失败呈现给用户, 则它应该以文本说明出了什么问题,并在适用时说明如何 恢复,而不是仅仅表示发生了错误(参见 § 成功标准 3.3.1 错误识别)。

交互元素,尤其是允许用户 继续或中止签发 或出示请求的元素, 必须能够以与设备无关的方式操作(例如,通过 键盘;参见§ 成功标准 2.1.1 键盘)。特别是,激活不得要求将多点或基于路径的手势(参见 § 成功标准 2.5.1 指针手势)或设备运动(参见 § 成功标准 2.5.4 运动致动)作为唯一的操作方式。数字凭证选择器和凭证管理器选择器 应该以有意义的焦点顺序呈现其控件(参见 § 成功标准 2.4.3 焦点顺序),在选择器 打开时将焦点移入其中;在显示期间将焦点保持在其中;并在 关闭时将焦点恢复到 先前获得焦点的元素或其他适当位置。

如果释放数字凭证要求持有者进行 身份验证,则应该提供无障碍的身份验证方法。 如果某个步骤依赖认知功能测试,例如回忆 密码,则应该提供不需要此类测试的替代方式 (参见§ 成功 标准 3.3.8 无障碍身份验证(最低要求));并且 身份验证不应该仅依赖单一的身体 特征,例如某些用户无法提供的生物特征。 此步骤通常由平台或凭证管理器执行,在其他方面超出 本规范的范围。

某些平台会跨设备满足出示请求; 例如,显示二维码供用户使用 另一台设备扫描。由于此类流程可能依赖视觉、 摄像头或第二台设备的使用,因此平台应该提供一种 等效且无障碍的方式来完成交互,该方式 不依赖单一的感官能力或输入方式。仅通过二维码等 视觉制品传达的跨设备 请求,如果没有无障碍替代方式,会将无法使用该方式的用户排除在外。

一次交互可能受到来自多个来源的时间限制。 这些限制应该以不会将需要更多时间的用户 排除在外的方式处理(参见§ 成功标准 2.2.1 时间可调整):

审查并披露数字凭证的决定不应该 受到强制倒计时的约束,包括从 周围站点流程继承的时间压力。

在交互期间显示的人类可读凭证内容,以及 为其提供的任何无障碍替代内容(例如图像的文本替代内容), 都承载在凭证载荷中,并由 相关的凭证格式和协议负责。这些 格式和协议还决定该内容的语言和书写方向。

13. 国际化考虑

本节为非规范性内容。

此 API 与凭证格式和交换协议无关,并且 将请求有效载荷(DigitalCredentialGetRequest 的 data 和 DigitalCredentialCreateRequest 的 data)以及响应有效载荷 (DigitalCredential 的data)视为不透明数据。因此, 该 API 未定义任何承载 人类可读自然语言内容的字符串类型值:

因此,本规范未引入任何 需要语言或方向元数据的自然语言文本。如果未来修订版 在 API 层引入由网站编写的人类可读文本、 规范性定义的权限提示文本,或由用户代理绘制的 呈现元素,则这些文本需要携带或关联 适当的语言和方向元数据。

14. 自动化测试

为了进行用户代理自动化和应用测试,本文档 为WebDriver BiDi 规范定义了扩展模块。用户代理 对这些模块的支持是可选的。

14.1 digitalCredentials 模块

digitalCredentials 模块包含用于在 [[DiscoverFromExternalSource]](origin, options, sameOriginWithAncestors) 和[[Create]](origin, options, sameOriginWithAncestors) 调用期间管理和 模拟凭证管理器远端行为的命令。

14.1.1 类型

CDDLdigitalCredentials.VirtualWalletAction = "decline" / "respond" / "wait" / "clear"

digitalCredentials.SetVirtualWalletBehaviorParameters = {
  action: digitalCredentials.VirtualWalletAction,
  ? context: text,
  ? protocol: text,
  ? response: { * text => any },
}

digitalCredentials.VirtualWalletAction 类型表示 不同类型的虚拟钱包操作。

"decline"
虚拟钱包模拟用户取消或拒绝, 从而中止请求。
"respond"
虚拟钱包模拟成功的用户交互,并 返回预定义的凭证响应。
"wait"
虚拟钱包模拟一个处于活动状态、等待处理的提示,实际上 使活动 promise 保持未敲定状态,以测试超时或并发 请求处理。
"clear"
清除活动的虚拟钱包行为。

14.1.2 命令

14.1.2.1 digitalCredentials.setVirtualWalletBehavior 命令
命令类型
CDDLdigitalCredentials.SetVirtualWalletBehavior = (
  method: "digitalCredentials.setVirtualWalletBehavior",
  params: digitalCredentials.SetVirtualWalletBehaviorParameters
)
返回类型
CDDLdigitalCredentials.SetVirtualWalletBehaviorResult = EmptyResult

给定 session 和 command parameters,digitalCredentials.setVirtualWalletBehavior 命令的远端步骤如下:

  1. 令 action 为 command parameters["action"]。
  2. 如果存在,令 context 为 command parameters["context"], 否则为 null。
  3. 如果 存在,令 protocol 为 command parameters["protocol"], 否则为 null。
  4. 如果 存在,令 response 为 command parameters["response"], 否则为 null。
  5. 如果 action 为 "respond":
    1. 如果 protocol 为 null 或 response 为 null,返回一个 错误,其错误代码为无效参数。
    2. 如果 protocol 不是 DigitalCredentialProtocol 的枚举值, 返回一个错误,其错误代码为无效参数。
    3. 将 response序列化 为 JSON 字符串。
    4. 如果序列化产生异常,返回一个 错误,其错误代码为无效参数。
  6. 否则:
    1. 如果 response 不为 null 或 protocol 不为 null,返回 一个错误,其错误代码为无效参数。
  7. 如果 action 为 "clear":
    1. 如果 context 不为 null,从 WebDriver 会话的活动 虚拟钱包行为中移除 context 的条目。
    2. 否则,将 WebDriver 会话的活动 虚拟钱包行为设置为 null。
  8. 否则:
    1. 令 behavior 为元组(action、protocol、 response)。
    2. 如果 context 不为 null,将 WebDriver 会话中 浏览上下文 ID context 的活动虚拟钱包行为设置为 behavior。
    3. 否则,将 WebDriver 会话的默认活动 虚拟钱包行为设置为 behavior。
  9. 返回数据为 null 的成功结果。
注: 在测试中模拟钱包错误

编写自动化测试的开发者可以通过 将AbortSignal作为signal 传入(用于 get()), 或将signal 传入(用于create()), 然后使用所需的中止原因将其 中止,从而模拟钱包错误。这会执行 请求算法使用的同一中止 路径。

示例 9:使用 AbortController 模拟钱包错误
(async () => {
  const controller = new AbortController();
  const credentialPromise = navigator.credentials.get({
    digital: {
      requests: [{
        protocol: "example-request-protocol",
        data: { /* 出示请求数据 */ }
      }]
    },
    signal: controller.signal
  });

  controller.abort(
    new DOMException("Simulated wallet failure", "OperationError")
  );

  try {
    await credentialPromise;
  } catch (error) {
    console.assert(error.name === "OperationError");
  }
})();

14.2 处理虚拟钱包行为

给定一个Promise promise 和一个全局对象 global,要处理虚拟钱包行为,执行以下步骤:

  1. 如果用户代理未处于自动化控制之下,返回 false。
  2. 令 context ID 为 global 的浏览上下文的 ID。
  3. 令 behavior 为当前 WebDriver 会话中 context ID 的活动虚拟钱包行为。
  4. 如果 behavior 为 null,将 behavior 设置为当前 WebDriver 会话的默认活动虚拟钱包行为。
  5. 如果 behavior 为 null,返回 false。
  6. 令(action、protocol、response)为 behavior。
  7. 如果 action 为 "wait",返回 true。
  8. 如果 action 为 "decline":
    1. 以一个“NotAllowedError” DOMException拒绝 promise。
    2. 返回 true。
  9. 如果 action 为 "respond":
    1. 令 JSON string 为序列化 response 的结果。
    2. 令 JS object 为给定 global 的 相关领域解析 JSON string 的结果。
    3. 令 credential 为一个新的DigitalCredential 实例。
    4. 将 credential 的protocol 属性设置为 protocol。
    5. 将 credential 的data 属性设置为 JS object。
    6. 在给定 global 的DOM 操作任务源上排入一个全局任务,以使用 credential兑现 promise。
    7. 返回 true。

A. 索引

A.1 本 规范定义的术语

A.2 通过引用定义的术语

B. IDL 索引

WebIDLpartial dictionary CredentialRequestOptions {
  DigitalCredentialRequestOptions digital;
};

dictionary DigitalCredentialRequestOptions {
  required sequence<DigitalCredentialGetRequest> requests;
};

dictionary DigitalCredentialGetRequest {
  required DOMString protocol;
  required object data;
};

partial dictionary CredentialCreationOptions {
  DigitalCredentialCreationOptions digital;
};

dictionary DigitalCredentialCreationOptions {
  required sequence<DigitalCredentialCreateRequest> requests;
};

dictionary DigitalCredentialCreateRequest {
  required DOMString protocol;
  required object data;
};

typedef (DigitalCredentialPresentationProtocol or DigitalCredentialIssuanceProtocol) DigitalCredentialProtocol;

[Exposed=Window, SecureContext]
interface DigitalCredential : Credential {
  [Default] object toJSON();
  readonly attribute DigitalCredentialProtocol protocol;
  [SameObject] readonly attribute object data;
  static boolean userAgentAllowsProtocol(DOMString protocol);
};

enum DigitalCredentialPresentationProtocol {
  "openid4vp-v1-unsigned",
  "openid4vp-v1-signed",
  "openid4vp-v1-multisigned",
  "org-iso-mdoc"
};

enum DigitalCredentialIssuanceProtocol {
  "openid4vci-v1",
};

C. CDDL 索引

C.1 模块:remote-cddl

digitalCredentials.VirtualWalletAction = "decline" / "respond" / "wait" / "clear"

digitalCredentials.SetVirtualWalletBehaviorParameters = {
  action: digitalCredentials.VirtualWalletAction,
  ? context: text,
  ? protocol: text,
  ? response: { * text => any },
}

digitalCredentials.SetVirtualWalletBehavior = (
  method: "digitalCredentials.setVirtualWalletBehavior",
  params: digitalCredentials.SetVirtualWalletBehaviorParameters
)

C.2 模块:local-cddl

digitalCredentials.SetVirtualWalletBehaviorResult = EmptyResult

D. 一致性

除标记为非规范性的章节外,本规范中的所有编写指南、图示、示例和注释均为非规范性内容。本规范中的其他所有内容均为规范性内容。

本文档中的关键词 可以、必须、不得 、可选、推荐、应该和不应该 应按照 BCP 14 [RFC2119] [RFC8174] 中所述的方式解释,并且仅在它们像此处所示那样全部 使用大写形式时如此解释。

E. 致谢

部分编辑谨向以下个人表示感谢,感谢他们对 本规范提供的反馈和贡献:Christian Bormann (SPRIND)、John Bradley (Yubico)、Rick Byers (Google)、Brian Campbell (Ping Identity)、Lee Campbell (Google)、Nick Doty (CDT)、Heather Flanagan (Spherical Cow Consulting)、Ryan Galluzzo (NIST)、Joseph Heenan (Authlete)、Dominique Hazael-Massieux (W3C)、Bjorn Hjelm (Yubico)、Johann Hofmann (Google)、Mike Jones (Self-Issued Consulting)、Tobias Looker (MATTR)、Matthew Miller (Cisco)、Theresa O'Connor (Apple Inc.)、Simone Onofri (W3C)、Helen Qin (Google)、Wendy Seltzer(受邀 专家)、Manu Sporny (Digital Bazaar)、Orie Steele (Transmute)、Ted Thibodeau Jr (OpenLink Software)、David Waite (Ping Identity) 和 Kristina Yasuda (SPRIND)。

F. 参考文献

F.1 规范性参考文献

[credential-management]
凭据管理第 1 级. Nina Satragno; Marcos Caceres. W3C. 2026 年 7 月 2 日. W3C 工作草案. URL: https://www.w3.org/TR/credential-management-1/
[dom]
DOM 标准. Anne van Kesteren. WHATWG. 现行标准. URL: https://dom.spec.whatwg.org/
[FIDO-CLIENT-TO-AUTHENTICATOR-PROTOCOL-V2.3]
客户端 到认证器协议(CTAP). FIDO Alliance. 编辑草案. URL: https://fidoalliance.org/specs/fido-v2.3-ps-20260226/fido-client-to-authenticator-protocol-v2.3-ps-20260226.html
[html]
HTML 标准. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 现行 标准. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Infra 标准. Anne van Kesteren; Domenic Denicola. WHATWG. 现行标准. URL: https://infra.spec.whatwg.org/
[ISO18013-7]
ISO/IEC 18013-7:2025 符合 ISO 的驾驶 证,第 7 部分:移动驾驶证(mDL)附加功能. ISO/IEC JTC 1/SC 17. 国际标准化组织. 2025 年 5 月. URL: https://www.iso.org/standard/91154.html
[OPENID4VCI]
用于 可验证凭据签发的 OpenID 1.0. Torsten Lodderstedt; Kristina Yasuda; Tobias Looker; Paul Bastian. OpenID Foundation. 2025 年 9 月 16 日. 最终版. URL: https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html
[OPENID4VP]
用于 可验证呈现的 OpenID 1.0. Oliver Terbu; Torsten Lodderstedt; Kristina Yasuda; Daniel Fett; Joseph Heenan. OpenID Foundation. 2025 年 7 月 9 日. 最终版. URL: https://openid.net/specs/openid-4-verifiable-presentations-1_0.html
[permissions]
权限. Marcos Caceres; Mike Taylor. W3C. 2025 年 10 月 6 日. W3C 工作草案. URL: https://www.w3.org/TR/permissions/
[permissions-policy]
权限策略. Ian Clelland. W3C. 2026 年 6 月 18 日. W3C 工作草案. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
用于 RFC 中指示 要求级别的关键词. S. Bradner. IETF. 1997 年 3 月. 当前最佳实践. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC8174]
RFC 2119 关键词中大写与小写的歧义. B. Leiba. IETF. 2017 年 5 月. 当前最佳实践. URL: https://www.rfc-editor.org/info/rfc8174/
[vc-data-model]
可验证凭据数据模型 v2.0. Ivan Herman; Michael Jones; Manu Sporny; Ted Thibodeau Jr; Gabe Cohen. W3C. 2025 年 5 月 15 日. W3C 推荐标准. URL: https://www.w3.org/TR/vc-data-model-2.0/
[vc-use-cases]
可验证凭据用例. Joe Andrieu; Kevin Dean. W3C. 2026 年 3 月 18 日. W3C 工作组注记. URL: https://www.w3.org/TR/vc-use-cases/
[WCAG22]
Web 内容无障碍指南(WCAG) 2.2. Michael Cooper; Andrew Kirkpatrick; Alastair Campbell; Rachael Bradley Montgomery; Charles Adams. W3C. 2024 年 12 月 12 日. W3C 推荐标准. URL: https://www.w3.org/TR/WCAG22/
[WCAG2ICT-22]
将 WCAG 2 应用于非 Web 信息和通信技术的指南(WCAG2ICT). Mary Jo Mueller; Phil Day; Daniel Montalvo. W3C. 2025 年 12 月 11 日. W3C 工作组注记. URL: https://www.w3.org/TR/wcag2ict-22/
[webdriver]
WebDriver. Simon Stewart; David Burns. W3C. 2026 年 7 月 2 日. W3C 工作草案. URL: https://www.w3.org/TR/webdriver2/
[webdriver-bidi]
WebDriver BiDi. James Graham; Alex Rudenko; Maksim Sadym. W3C. 2026 年 8 月 24 日. W3C 工作草案. URL: https://www.w3.org/TR/webdriver-bidi/
[webidl]
Web IDL 标准. Edgar Chen; Timothy Gu. WHATWG. 现行标准. URL: https://webidl.spec.whatwg.org/

F.2 资料性参考文献

[credential-considerations]
Web 上凭据的用户注意事项. Nick Doty; Rick Byers. W3C. 2025-03-26. URL: https://github.com/w3c/credential-considerations/blob/main/credentials-considerations.md
[custom-schemes]
用于身份呈现的 自定义方案所存在的问题. Rick Byers. W3C. 2024-05-01. URL: https://github.com/w3c-fedid/digital-credentials/blob/main/custom-schemes.md
[identity-web-impact]
身份与 Web. Simone Onofri. W3C. 2025-02-25. URL: https://www.w3.org/reports/identity-web-impact
[ISO18013-5]
ISO/IEC 18013-5:2021 符合 ISO 的驾驶 证,第 5 部分:移动驾驶证(mDL)应用. ISO/IEC JTC 1/SC 17. 国际标准化组织. 2021 年 9 月. URL: https://www.iso.org/standard/69084.html
[presenting-credentials-on-the-web]
在 Web 上呈现 凭据. Simone Onofri. URL: https://docs.google.com/document/d/1Ppaz_EnhzHqPOz5UusRJvbSunh-RXPWgJ3Np_TM2EE0/
[prevent-credential-abuse]
防止滥用 数字凭据. Daniel Appelquist; Martin Thomson. W3C. 2025 年 11 月 14 日. TAG 结论. URL: https://www.w3.org/2001/tag/doc/prevent-credential-abuse/
[privacy-principles]
隐私原则. Robin Berjon; Jeffrey Yasskin. W3C. 2025 年 5 月 15 日. STMT. URL: https://www.w3.org/TR/privacy-principles/
[rfc6973]
互联网 协议的隐私注意事项. A. Cooper; H. Tschofenig; B. Aboba; J. Peterson; J. Morris; M. Hansen; R. Smith. IETF. 2013 年 7 月. 资料性. URL: https://www.rfc-editor.org/info/rfc6973/
[secure-contexts]
安全上下文. Mike West. W3C. 2023 年 11 月 10 日. CRD. URL: https://www.w3.org/TR/secure-contexts/
[threat-model-decentralized-credentials]
去中心化凭据的 威胁模型. Simone Onofri; Amir Sharif. W3C. 2026 年 6 月 22 日. DNOTE. URL: https://www.w3.org/TR/threat-model-decentralized-credentials/
[URL]
URL 标准. Anne van Kesteren. WHATWG. 现行标准. URL: https://url.spec.whatwg.org/