数字凭证

W3C 工作草案

关于本文档的更多详细信息
此版本:
https://www.w3.org/TR/2026/WD-digital-credentials-20260616/
最新发布版本:
https://www.w3.org/TR/digital-credentials/
最新编辑草案:
https://w3c-fedid.github.io/digital-credentials/
历史:
https://www.w3.org/standards/history/digital-credentials/
提交历史
编辑:
Marcos CaceresApple Inc.
Tim CappalliOkta
Mohamed Amir YosefGoogle Inc.
前编辑:
Sam GotoGoogle 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("验证凭证失败");
      }

      // 渲染验证结果
      displayVerificationResult(await response.json());

    } catch (error) {
      console.error("请求数字凭证时出错:", 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);
    }
  });
</script>

2.5 跨源请求数字凭证

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

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

2.6 跨源签发数字凭证

类似地,本规范允许通过 "digital-credentials-create" 策略控制特性,使用该 API 从远程/第三方源签发 凭证。这 对于网站想要使用不同源上的签发服务来请求 签发数字凭证的场景很有用。Permissions Policy 可以设置在嵌入签发方 界面的 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. 协议

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

议题 439:用户代理应实现哪些协议?specsubstantive

#401 中,我建议添加 以下内容:

    <p>
       [=user agent=] 必须实现在 [=table of exchange protocols=] 中列出的至少一个 [=digital credential/exchange protocol=]。
       建议用户代理实现 [=table of exchange protocols=] 中列出的所有 [=digital credential/exchange protocols=]。 
    </p>
    <aside class="note" title="检查用户代理允许哪些交换协议">
      <p>开发者可以通过调用 `DigitalCredential.`{{DigitalCredential.userAgentAllowsProtocol()}} 静态方法,
      检查用户代理允许哪些 [=digital credential/exchange protocols=]。
      用法示例见 [[[#checking-if-protocol-is-allowed]]]。
      </p>
    </aside>

理由如下:

  1. 它强制用户代理至少支持一个协议——这样开发者至少知道他们会得到什么。
  2. 它强烈鼓励实现所有协议,但并不强制(无论如何,由于下面第 3 点或由于平台限制,我们也无法强制)。
  3. 它让现有和“旧版”用户代理保持符合性,特别是在我们未来添加新的交换 协议时。例如,在某个特定 平台上可能无法实现某些协议,但实现其他协议可能可行。
受支持的出示签发协议表
标识符 规范
出示协议
openid4vp-v1-unsigned OpenID for Verifiable Presentations 1.0 § A.3.1. 未签名请求
openid4vp-v1-signed OpenID for Verifiable Presentations 1.0 § A.3.2. 已签名 请求
openid4vp-v1-multisigned OpenID for Verifiable Presentations 1.0 § A.3.2.2. JWS JSON 序列化(多签名请求)
org-iso-mdoc ISO/IEC 18013-7:2025 符合 ISO 的 驾驶执照,第 7 部分:移动驾驶执照(mDL)附加功能 § 附录 C
签发协议
openid4vci-v1 OpenID for Verifiable Credential Issuance 1.0 § 即将推出
议题: API 集成

5.1 转换请求协议

要在给定一个 DigitalCredentialGetRequestDigitalCredentialCreateRequest request 的情况下转换请求协议

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

6. 凭证请求协调器

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

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

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

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

凭证请求协调器

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

6.1 交互状态

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

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

协调器初始化为idle交互 状态

6.2 准备凭证请求

要在给定 Document document、一组序列 DigitalCredentialGetRequest 值 或一组序列 DigitalCredentialCreateRequestrequests、一个 Promise promise,以及一个可选的 AbortSignal signal 的情况下准备凭证 请求

  1. globaldocument相关全局对象
  2. 如果凭证请求 协调器不处于 "idle" 交互状态
    1. 在给定 globalDOM 操作任务源排入一个全局任务,以使用 "NotAllowedError" DOMException 拒绝 promise
    2. 返回。
  3. 断言凭证请求协调器活动 promisenull
  4. 凭证请求 协调器交互状态设置为 "requesting"。
  5. 凭证请求 协调器活动 promise设置为 promise
  6. validatedRequests 为在给定 requests 时执行验证凭证请求的结果。如果该操作 抛出一个异常 error,则:
    1. 使用 errorpromise拒绝 凭证请求
    2. 返回。
  7. 如果 validatedRequests 为空,则:
    1. 使用一个新创建的 TypeErrorpromise拒绝 凭证请求
    2. 返回。
  8. 如果传入了 signal,则:
    1. 断言signal 未被中止

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

    2. 凭证 请求协调器中止信号设置为 signal
    3. abortAlgorithm 为以下算法:
      1. 如果凭证请求 协调器活动 promise不是 promise,则返回。
      2. 给定 signal中止原因中止 凭证请求
    4. 凭证 请求协调器中止 算法设置为 abortAlgorithm
    5. abortAlgorithm添加signal
  9. handled 为在给定 promiseglobal 时运行处理虚拟钱包行为的结果。
  10. 如果 handledtrue,则返回。
  11. 使用 documentvalidatedRequestspromisesignal发起凭证请求
  12. 如果 document 不再完全活动,则使用一个 "AbortError" DOMException中止凭证请求

6.3 验证凭证请求

给定一个由 DigitalCredentialGetRequestDigitalCredentialCreateRequest 对象组成的序列 requests验证凭证 请求

  1. validatedRequests 为一个新的空列表
  2. requests 中的每个 request
    1. protocol 为在给定 request 的情况下运行转换请求协议 的结果。
    2. 如果 protocol 是失败,则继续
    3. 如果在给定 protocol 的情况下,用户代理允许 协议返回 false,则继续
    4. 如果 requestDigitalCredentialGetRequest, 则令 datarequestdata; 或者如果 requestDigitalCredentialCreateRequest, 则令其为 requestdata
    5. data 序列化 为 JSON 字符串。
    6. 如果序列化导致一个异常,则抛出异常
    7. 根据 request展示协议签发协议或其他条件,验证 request展示请求数据签发请求数据。验证 要求是特定于协议的,并且不在本 规范范围内:
      :验证细节不在范围内
      Issue 472:用户 代理请求验证和错误 specsubstantive

      准备步骤最初声明:

      除了协议定义的要求之外,[=user agent=] 还可以 根据本地策略、配置或 不断演进的安全考量应用额外的验证条件。例如,[=user agent=] 可能会拒绝 某个请求,如果该请求 (a) 寻求特定的凭证属性,(b) 使用或要求 [=user agent=] 被配置为不接受的密码算法(例如, 作为算法敏捷性或向后量子方案过渡的一部分),或 (c) 依赖于未被 [=user agent=] 所配置的信任决策接受的证书或信任锚。

      最好对此进行扩展说明。

      1. 如果验证失败,则抛出一个适当的 异常
      2. 否则,将 request 追加validatedRequests
  3. 返回 validatedRequests

6.4 中止凭证请求

要在给定 JavaScript 值或 DOMException error 的情况下中止 凭证请求

  1. 如果凭证请求 协调器活动 promisenull, 则返回。
  2. activePromise凭证请求协调器活动 promise
  3. 如果凭证请求 协调器处于 "requesting" 交互状态
    1. 凭证 请求协调器交互状态设置为 "aborting"。
    2. 关闭数字凭证 选择器

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

  4. 使用 erroractivePromise拒绝凭证 请求

6.5 拒绝凭证请求

要在给定一个(JavaScript 值)error 和一个 Promise promise 的情况下拒绝 凭证请求

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

6.6 发起凭证请求

要在给定 Document document、一个已验证凭证请求 validatedRequests列表、一个 Promise promise,以及一个可选的 AbortSignal signal 的情况下发起 凭证请求

  1. topLevelOrigindocument顶级可遍历体活动文档相关设置对象
  2. requestData 为新的请求上下文,其requestsvalidatedRequests,且top-level origintopLevelOrigin
  3. 并行
    1. 使用 requestData 显示数字凭证 选择器,并 等待以下结果之一:
      • 用户选择了能够满足请求的数字凭证持有者
      • 用户取消操作。
      • 平台遇到错误。
      议题 456: 使用 CTAP 出示 discussionspec

      当时在和 @mohamedamir 讨论……我们应当在规范中说明, 跨平台跨设备凭证交换应当(或建议)通过 CTAP 进行。

      我们不能强制要求(即 MUST),因为:

      • 这与操作系统或框架有关,因此超出了本规范范围……或者至少超出了浏览器在未实现整个交换栈时通常能做的范围。
      • 平台可以自由使用更高效或专有的协议,尤其是用于跨设备交换时。
      • 这能让规范面向未来,同时在当下提供最佳兼容性。
    2. 如果 signal 不为 null 且 signal中止
      1. 返回。
        :中止已被处理

        准备凭证 请求步骤添加signal 的中止算法会处理数字凭证 选择器的拆卸。

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

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

      2. responseData 为由持有者返回的字符串出示响应字符串签发响应
        :为什么响应是字符串
      3. 在给定 document相关全局对象DOM 操作任务 源排入一个全局任务,以 执行 以下步骤:
        1. 如果凭证请求 协调器活动 promise不是 promise,则 返回。
        2. parsedResponseDataOrError 为在给定 responseData将 JSON 字符串解析为 JavaScript 值的结果。
        3. abortSignal凭证请求 协调器中止信号
        4. abortAlgorithm凭证请求 协调器中止算法
        5. 如果 abortSignal 不是 nullabortAlgorithm 不是 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. 凭证请求 协调器交互状态设置为 "idle"。

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) 内部方法。

有关如何与 凭证管理第 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 接口强制所有操作进行用户中介,以确保用户控制和同意。

为了简化开发者在涉及 DigitalCredentialget() 调用中的体验,用户代理mediation 成员 缺失 或其值不是 "required" 时,不得抛出 错误。类似地,在涉及 DigitalCredentialcreate() 调用中,用户 代理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);
};

7.7.1 protocol 成员

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

7.7.2 data 成员

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

7.7.3 userAgentAllowsProtocol() 方法

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

此方法不会传达底层 OS/平台对出示协议签发协议的支持。

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

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

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

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

7.8 支持性数据结构

数据结构(例如枚举)在本规范中支持 DigitalCredential

7.8.1 请求上下文结构

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

requests
一个经过验证的凭证请求列表
top-level origin
一个环境设置对象

此枚举的值对应于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. 如果存在,令 signaloptionssignal
  2. 如果 signal中止,则返回一个 signal中止原因拒绝的 promise。
  3. globalthis相关全局对象
  4. documentglobal关联 Document
  5. 如果 document 不是具有用户注意的顶级可遍历体的完全 活动后代,则返回一个 "NotAllowedError" DOMException 拒绝的 promise。
  6. requestsoptionsdigitalrequests 成员。
  7. 如果 global 没有瞬态激活,则返回一个 "NotAllowedError" DOMException 拒绝的 promise。
  8. 消耗 global 的用户激活。
  9. promise 为在 this相关 realm中的一个 新 promise
  10. 使用 documentrequestspromisesignal准备凭证请求
  11. 返回 promise

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. 如果存在,令 signaloptionssignal
  2. 如果 signal中止,则返回一个 signal中止原因拒绝的 promise。
  3. globalthis相关全局对象
  4. documentglobal关联 Document
  5. 如果 document 不是具有用户注意的顶级可遍历体的完全 活动后代,则返回一个 "NotAllowedError" DOMException 拒绝的 promise。
  6. requestsoptionsdigitalrequests 成员。
  7. 如果 global 没有瞬态激活,则返回一个 "NotAllowedError" DOMException 拒绝的 promise。
  8. 消耗 global 的用户激活。
  9. promise一个 新 promise,位于 this相关 realm中。
  10. 使用 documentrequestspromisesignal准备凭证请求
  11. 返回 promise

8.4 [[type]] 内部槽

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

8.5 [[discovery]] 内部槽

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

8.6 用户许可

本节为非规范性内容。

数字凭证 API 是一项强大特性,需要获得最终用户的明确许可。此 要求会在调用 CredentialsContainerget() 方法时以规范性方式强制执行。

9. Permissions Policy 集成

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

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

10. 安全考量

本节为非规范性内容。

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

其他依赖协议、凭证 管理器实现、操作系统或传输安全的安全考量 被描述为期望或前提条件,但除非已被规范性 指定,否则本规范不对其作出 规范性要求。

10.1 威胁模型

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

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

10.1.1 范围内威胁

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

请求篡改
能够在不安全上下文中注入或修改页面内容的 网络攻击者,试图在处理前篡改 DigitalCredentialGetRequestDigitalCredentialCreateRequest
API 泛洪
恶意网站试图通过快速、 重复发出请求来压垮 API,以耗尽系统资源、混淆用户、 制造不必要的凭证交互,或造成提示疲劳 从而降低用户体验。这包括在 不合适的时间发出请求,例如在页面加载期间或没有有意义的 用户上下文时。
未授权跨源访问
恶意网站试图通过嵌入的第三方内容(例如 iframe) 请求或签发数字凭证,而没有 嵌入站点的明确许可,这可能导致 凭证收集或未授权访问敏感用户数据。

10.1.2 范围外威胁

范围外威胁是由协议、 凭证管理器、OS 平台安全或 传输层处理的威胁。 即使“超出范围”,它们仍然相关,因为它们会影响 凭证出示和签发的端到端安全性。以下内容定义了本 规范的范围外威胁

  • 待编写……

10.2 缓解措施

以下缓解措施通过本规范中的 规范性要求来处理范围内威胁

Digital Credential API 的 WebIDL 接口仅在 安全上下文中暴露,从而降低通过 不安全上下文进行 篡改的风险(例如,恶意脚本通过网络 被注入)。请参阅 5 安全考量一节,该节属于 安全 上下文规范,以获取更多信息。

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

关于防止凭证请求被滥用的其他指导, 请参阅 Credential Management Level 1 规范的 7 隐私考量一节。不过请注意,这些 保护有其局限性,因为站点仍可能使用诱导性设计模式 来鼓励不必要的用户交互,从而触发凭证 请求。

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

11. 隐私考量

本节为非规范性内容。

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

随着本文档的发展,本节仍在编写中。

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

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

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

预计参与数字凭证 API 设计和 实现的各个小组会主动监测 不断演进的隐私格局,并参与该 API 的相应 演进。

11.1 设计考量和替代方案

数字凭证 API 被设计为中介网站对 数字凭证的请求,并且不依赖于凭证 格式及其中包含的信息,也不依赖于用于 交换它的协议。这一点以及其他关键设计选择,均源于 为用户提供比现有替代方案(例如 [custom-schemes])更安全、更私密的凭证 交换体验这一目标,同时仍然兼容常见的交换 协议以便采用。

该 API 提供了验证方持有者之间的连接接口,即启动凭证出示协议 以及用户切换到持有者应用以 选择凭证的手段。过去为此目的 使用过的解决方案包括二维码和自定义 URL 方案。正如 在 Web 上出示 凭证身份出示中 自定义方案的相关顾虑中所述, 这些解决方案存在安全、隐私和无障碍方面的顾虑。

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

数字凭证 API 赋予用户 代理代表用户进行 中介的能力(例如以数字凭证选择器的形式),以便对请求进行上下文化,并 防止 立即暴露给持有者应用。它还对 受支持协议施加某些最低要求,例如 响应 加密

11.2 隐私谱系

Digital Credentials 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:可链接性和 签发方参与作为协议要求 privacy-tracker

此 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 举报滥用

考虑为发出不必要和滥用性请求的验证方 建立一个可互操作的滥用举报系统。

11.5 指纹识别和数据泄露

11.5.1 浏览器指纹识别

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

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

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

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

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

这些附加信息可用于重新识别和 指纹识别用户,当进行原本 不可链接的出示时,这一点尤其相关。

虽然数字凭证 API 不控制 凭证响应的内容,但用户代理可以通过清晰突出显示除了所请求内容外 哪些信息可能会被共享给验证方,并更广泛地通过识别和阻止验证方经由 API 进行指纹识别,来帮助保护用户免受这种类型的跟踪。

11.5.3 通过协议可用性暴露设备属性

数字凭证 API 通过 userAgentAllowsProtocol() 暴露关于用户代理支持哪些出示签发协议的信息。 它通过不基于例如用户设备上安装了哪些 凭证管理器应用来自定义响应,来缓解浏览器 指纹识别以及暴露关于用户设备 配置的信息。因此,返回的信息充其量相当于一个 用户代理版本。

11.5.4 避免泄露凭证可用性

数字凭证 API 不允许站点在未先经过 用户许可 流程的情况下获知某个 凭证是否可用。 暴露凭证的存在会对用户 隐私构成风险,因为凭证的存在属于个人信息, 用户可能并不愿意与站点共享;并且结合其他信号后, 可能被用于在未经用户许可的情况下识别用户。 这也会对言论自由构成风险,因为 网站可能越来越多地开始要求用户出示这些 凭证才能访问服务,从而排除 不愿出示凭证的个人。

11.6 用户许可和透明度

议题:进行中的 工作

数字凭证 API 使得通过 凭证与网站共享高度个人化、 敏感且有风险的用户信息成为可能,这可能赋予通过 永久、唯一、不可撤销、跨上下文 标识符在线上和线下跟踪用户的能力。它还会暴露用户浏览活动的一部分, 以及他们向特定网站和/或 凭证管理器表明身份的意图。 用户代理在凭证请求中的一项关键责任,是从用户那里获得 继续进行信息交换的 许可。

用户要就是否继续进行凭证交换作出 知情决定,需要以下 重要上下文细节:

建议用户代理在其实现中确保 在发生任何与用户相关的信息交换之前,将所列细节 完全披露给用户。

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

这些是否应当在规范中成为规范性内容?

议题 44:API 请求应当 向站点提供其解释所请求凭证信息为何以及如何被使用所需的内容 enhancementpending closureprivacy-tracker

该 API 是否应当被设计为让站点可以提供上下文内 说明?

11.6.1 处理多个凭证请求

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

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

11.6.2 集成多个用户代理

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

因此,提示用户授予许可的用户代理 被鼓励在其认为安全的情况下集成软件层,以获得理想的用户体验。 例如,如果 浏览器信任操作系统的 API 合同会显示 适当的提示,那么浏览器自身可以不显示提示。

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

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

12. 无障碍考量

实现者在专门为此 API 设计凭证选择器时,需要考虑无障碍性。在签发出示期间呈现的模态对话框内容, 其中可以包括文本、二维码和其他视觉媒体,应当被标注并 暴露给辅助技术。

交互元素,尤其是那些允许用户继续或中止签发出示请求的元素, 必须能够以设备无关的方式操作。

13. 自动化测试

出于用户代理自动化和应用测试的目的,本文档 为 WebDriver BiDi 规范定义了扩展模块。用户代理 对其提供支持是可选的

13.1 digitalCredentials 模块

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

13.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"
清除活动的虚拟钱包行为。

13.1.2 命令

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

给定 sessioncommand parametersdigitalCredentials.setVirtualWalletBehavior 命令的远端步骤为:

  1. actioncommand parameters["action"]。
  2. 如果存在,令 contextcommand parameters["context"], 否则为 null
  3. 如果存在,令 protocolcommand parameters["protocol"], 否则 为 null
  4. 如果存在,令 responsecommand parameters["response"], 否则 为 null
  5. 如果 action"respond"
    1. 如果 protocolnullresponsenull,则返回一个 错误,其错误代码invalid argument
    2. 如果 protocol 不是 DigitalCredentialProtocol枚举值, 则返回一个错误,其错误代码invalid argument
    3. response序列化 为 JSON 字符串。
    4. 如果序列化产生异常,则返回一个 错误,其错误代码invalid argument
  6. 否则:
    1. 如果 response 不是 nullprotocol 不是 null,则返回 一个错误,其错误代码invalid argument
  7. 如果 action"clear"
    1. 如果 context 不是 null,则从 WebDriver session活动 虚拟钱包行为中移除 context 对应的条目。
    2. 否则,将 WebDriver session活动 虚拟钱包行为设置为 null
  8. 否则:
    1. behavior 为一个由 (action, protocol, response) 组成的元组。
    2. 如果 context 不是 null,则将浏览 上下文 ID context 对应的 WebDriver session活动虚拟钱包行为 设置为 behavior
    3. 否则,将 WebDriver session 的默认活动 虚拟钱包行为设置为 behavior
  9. 返回带有数据 null成功

13.2 处理虚拟钱包行为

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

  1. 如果用户代理不处于自动化控制下,则返回 false
  2. context IDglobal浏览上下文的 ID。
  3. behavior 为当前 WebDriver session 针对 context ID活动虚拟钱包行为
  4. 如果 behaviornull,则将 behavior 设置为当前 WebDriver session 的默认活动虚拟钱包行为
  5. 如果 behaviornull,则返回 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相关 realm 时,解析 JSON string 的结果。
    3. credential 为一个新的 DigitalCredential 实例。
    4. credentialprotocol 属性设置为 protocol
    5. credentialdata 属性设置为 JS object
    6. 在给定 globalDOM 操作任务源排入一个全局任务,以使用 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. 一致性

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

本文档中的关键词 MAYMUSTMUST NOTOPTIONALSHOULD 应按 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 (Invited Expert)、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 年 4 月 10 日。W3C 工作草案。URL:https://www.w3.org/TR/credential-management-1/
[dom]
DOM 标准。Anne van Kesteren。WHATWG。 现行标准。URL:https://dom.spec.whatwg.org/
[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]
Permissions Policy。Ian Clelland。W3C。2025 年 10 月 6 日。W3C 工作草案。URL:https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
用于 RFC 以指示 要求等级的关键词。S. Bradner。IETF。1997 年 3 月。当前最佳实践。URL:https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 关键词中大写与小写的歧义。B. Leiba。IETF。2017 年 5 月。当前最佳实践。URL:https://www.rfc-editor.org/rfc/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/
[webdriver]
WebDriver。Simon Stewart; David Burns。 W3C。2026 年 5 月 28 日。W3C 工作草案。URL:https://www.w3.org/TR/webdriver2/
[webdriver-bidi]
WebDriver BiDi。James Graham; Alex Rudenko; Maksim Sadym。W3C。2026 年 5 月 22 日。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
[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/rfc/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 年 5 月 29 日. DNOTE. URL: https://www.w3.org/TR/threat-model-decentralized-credentials/