通过我们的终极指南,深入了解数字凭证 API,掌握其在 Chrome 和 Safari 中的最新功能支持,并时刻关注未来更新。
Vincent
Created: July 25, 2025
Updated: July 25, 2025
See the original blog version in English here.
最后更新:2025 年 7 月 15 日 (WWDC25 之后)
各大主流浏览器对数字凭证 API 的支持情况快速概览:
浏览器 | 支持状态 (2025 年 6 月) | 预计稳定版发布 / 展望 |
---|---|---|
Google Chrome | 🧪 是 (通过功能标志) | 2025 年 9 月 30 日 (Chrome 141) |
Apple Safari | ✅ 是 (测试版) | 2025 年秋季 (iOS 26 / Safari 26,前身为 iOS 19) |
Mozilla Firefox | ❌ 否 (负面立场) | 未计划 |
Microsoft Edge | ❓ 跟随 Chrome | 跟随 Chrome |
数字凭证的世界正在飞速发展。以下是关键发展和预测的快照:
图标 | 日期 / 时期 | 事件 | 描述与来源 |
---|---|---|---|
🚀🤖 | 2024 年 8 月 20 日 | Android 数字凭证 API 源试用 | Chrome 128 针对 Android 上的数字凭证 API 启动了源试用,从而能够通过 Android 的 IdentityCredential CredMan 系统进行请求。 |
🚀🍏 | 2025 年 2 月 27 日 | Safari 技术预览版 214 | WebKit(包含在 Safari 技术预览版 214 中)添加了数字凭证 API 功能标志。(Pull Request, 比较) |
🚀🤖 | 2025 年 3 月 4 日 | Chrome 134 桌面版源试用 | Chrome 134 针对桌面版数字凭证 API 启动了源试用,实现了与 Android 手机钱包的安全通信。(来源:Chrome 134 发布说明) |
🚀🍏 | 2025 年 3 月 31 日 | Safari 18.4 发布 | Safari 18.4 中的 WebKit 功能 使得数字凭证 API 的部分功能可以通过功能标志进行测试。持续的变更在此处跟踪:链接。 |
💡 | 2025 年 4 月 | W3C FedID 工作组接管 | 数字凭证 API 的开发工作正式移交给 W3C 联合身份工作组。 |
🚀🤖 | 2025 年 4 月 30 日 | Chrome 宣布跨设备源试用 | Chrome 宣布从 Chrome 136 开始进行跨设备数字凭证 API 源试用,允许桌面版 Chrome 安全地出示来自 Android 设备的凭证。 |
⚠️🤖 | 2025 年 5 月 2 日 | Chrome API 重大变更 | Chrome 概述了 Chrome 136 和 138 中 API 版本的重大变更(例如,请求格式,在标志下添加 navigator.credentials.create() API)。 |
🚀🍏 | 2025 年 6 月 10 日 | WWDC25:Apple 确认支持 API | Apple 在 WWDC25 上正式宣布 Safari 支持数字凭证 API,确认将重点放在 org.iso.mdoc 协议上以出示身份文件。该功能在带有 iOS 26 的 Safari 26 Beta 版中提供。(来源:在 Web 上验证身份文件) |
🚀🤖 | 2025 年 9 月 30 日 (预计) | Chrome 141:API 稳定 | Google 计划在 Chrome 141 中将数字凭证 API 作为一项稳定且默认开启的功能发布。 |
🚀🍏 | 2025 年秋季 (已确认) | Safari 和 iOS 26 公开发布 | Apple 将公开发布带有数字凭证 API 支持的 Safari 26,作为 iOS 26 及其其他操作系统更新的一部分。 |
🇪🇺📅 | 2026 年中 - 2027 年初 (预期) | EUDI 钱包可用性 | 根据 eIDAS 2.0 法规,预计欧盟成员国将提供支持 mdocs 和 VC 的 EUDI 钱包。 |
数字凭证是当前身份领域的热门话题。随着我们的生活与数字世界的联系日益紧密,以安全、以用户为中心且保护隐私的方式在线声明我们的身份和资格,变得前所未有的重要。传统方法已显老态,市场对更强大解决方案的需求也变得非常迫切。
在本文中,我们将探讨数字凭证 API 的现状,这是一项重要的发展,有望重塑我们与网络身份信息的交互方式。我们将探索其底层机制、支持的协议、当前的浏览器采用情况,并为正在这个快速发展的领域中探索的信赖方和钱包 颁发者提供建议。
多年来,可靠且安全地证明身份一直是网络架构中的一个持续挑战 (链接)。虽然互联网促进了前所未有的连接和信息交换,但它也为虚假陈述和欺诈开辟了新途径。
在一些国家,解决方案应运而生,主要由早期的银行联盟推动,他们开发了利用现有信任关系进行在线身份识别的服务。政府也介入其中,强制推行或提供国家数字身份钱包和服务。然而,这些解决方案通常是孤立的、有地域限制的,并且不具备普遍的互操作性。
在许多地区,身份验证的传统后备方案涉及高摩擦流程。例如,在邮局进行物理验证会带来严重的延迟和不便。视频通话结合文件上传成为一种更数字化的替代方案,随后是最近兴起的自动文档扫描和活体检测。尽管这些方法有所进步,但它们有显著的缺点。它们可能耗时、容易出现人为错误或偏见,并且经常被曝出易受复杂伪造攻击的漏洞。
随着深度伪造、先进的 AI 驱动的冒充技术以及日益复杂的网络钓鱼攻击的出现,这一挑战正在急剧升级。这些技术可以创建高度逼真但完全伪造的视频、音频和文件证据,使得传统系统甚至 AI 驱动的验证工具都极难区分真实用户和欺诈者。创建合成身份或操纵生物特征数据以绕过检查的潜力是一个严重威胁,特别是对于金融机构和任何需要强大“了解你的客户”(KYC) 流程的服务。这种不断升级的威胁形势凸显了我们对更安全、可通过加密验证的在线身份和验证机制的迫切需求。
要理解数字凭证的运作方式,需要了解其中涉及的关键参与者以及实现其功能的不同技术层面。
数字凭证概念的核心,特别是在新的 Web API 背景下,围绕着一个三方模型:
这个三方模型之所以重要,是因为它旨在将用户(持有者)置于其自身数据的控制之中。与传统身份系统中数据可能被集中存储或在没有用户直接干预的情况下在各方之间共享不同,该模型强调用户同意和选择性披露。持有者决定为特定交易分享凭证中的哪些信息,而不是泄露整个凭证。
这些系统的一个基本方面是加密密钥对的参与。颁发者对凭证进行数字签名,确保其真实性和完整性。持有者则使用他们的私钥(通常安全地存放在他们的数字钱包中,并受设备硬件保护)来证明对凭证的控制权,并授权将其出示给验证者。这通常涉及验证者出示一个挑战(一个随机数据片段),持有者的钱包使用与凭证关联的私钥对其进行签名。然后,验证者可以使用相应的公钥来确认签名,从而验证出示的真实性。
这个解释是协议中立的,因为颁发、持有和通过加密挑战进行验证的核心原则在不同的底层技术中是共通的。
本文重点关注数字凭证的验证和选择性披露原则,使用户能够证明特定属性(例如,“我已满 18 岁”、“我拥有有效的驾驶执照”)而无需泄露整个源文件。虽然数字凭证的底层系统可能支持合格电子签名 (QES) 和远程签名功能(如欧盟数字身份钱包等综合解决方案中用于具有法律约束力签名的功能),但本文的重点,特别是对于数字凭证 API,是用于在线交互的身份断言和属性验证,而不是这些更广泛的签名功能。
为了理解数字凭证如何运作,将其想象成一个分层模型会很有帮助。每一层都处理生态系统的一个不同方面,从数据格式本身到它如何呈现给 Web 浏览器中的用户。本文主要关注数字凭证 API,它在表示层运作。
核心术语:
可以把 VC 看作是一种数据模型,VC API 是一个后端规范,而 DC API 是将凭证呈现给 Web 的前端实现。第 1 层(数据模型层)以上的所有内容都与格式无关;以下的所有内容都依赖于凭证格式。
端到端流程(示例:在线年龄验证):
请注意数据是 VC,Web 上的传输是 DC API,底层的交换协议是 OpenID4VP,而服务器端的检查则使用 VC API。
为什么存在这种划分:
关键要点:
在探讨了参与者和数字凭证的整体分层架构之后,本文现在将更深入地探讨表示层,特别是关注数字凭证 API 及其当前状态。
作为表示层的关键组件,数字凭证 API 是一个正在开发的 Web 标准,旨在为网站提供一种安全和标准化的方式来从用户的数字钱包请求和接收数字身份信息。这项工作主要由 W3C 的联合身份工作组 (FedID WG) 负责,于 2025 年 4 月从 FedID 社区组迁移而来。官方规范草案可在此处找到:https://w3c-fedid.github.io/digital-credentials/。
截至 2025 年,该 API 仍被描述为正在经历重大变化。这凸显了它正处于积极开发阶段。尽管如此,其潜力巨大。Chrome 是第一个发布公开成果的浏览器,其源试用允许开发者试验其功能。Chrome 还在 Android 上通过其凭证管理器系统原生支持此功能,并且最近还发布了对桌面端跨设备数字凭证 API 使用的支持。
该 API 通过 navigator.credentials.get()
启用对数字凭证的请求,从而扩展了现有的凭证管理 API。根据 W3C FedID WG 数字凭证解释器 (https://github.com/w3c-fedid/digital-credentials/blob/main/explainer.md),该 API 已恢复使用这个成熟的接口,而不是之前提议的 navigator.identity
。网站通过调用带有数字凭证特定参数的 navigator.credentials.get()
来请求数字凭证。
以下是一个示例,说明网站如何调用 API 以使用 OpenID4VP 请求凭证:
async function requestCredential() { // 检查是否支持数字凭证 API if (typeof window.DigitalCredential !== "undefined") { try { // 这些参数通常从后端获取。 // 此处为静态定义,仅为说明协议的可扩展性。 const oid4vp = { protocol: "oid4vp", // 一个向钱包发出的 OpenID4VP 请求示例。 // 基于 https://github.com/openid/OpenID4VP/issues/125 data: { nonce: "n-0S6_WzA2Mj", presentation_definition: { //Presentation Exchange 请求,为简洁起见省略 }, }, }; // 创建一个 Abort Controller const controller = new AbortController(); // 使用来自后端的出示请求调用数字凭证 API let dcResponse = await navigator.credentials.get({ signal: controller.signal, mediation: "required", digital: { requests: [oid4vp], }, }); // 将加密响应发送到后端进行解密和验证 // 为简洁起见,此处省略 } catch (error) { console.error("Error:", error); } } else { // 后备方案,仅作说明 alert("此浏览器不支持数字凭证 API。"); } }
此示例取自此处。
数字凭证 API 本质上充当一个安全的包装器或中介。它允许浏览器调解身份信息的请求,利用底层操作系统的能力来发现与请求匹配的可用钱包和凭证。然后,浏览器和操作系统可以呈现一个一致的用户界面,用于选择凭证并授权其发布,通过确保用户同意并防止网站静默访问敏感数据来增强安全性和隐私。响应中的实际凭证数据旨在对浏览器本身不透明(加密),解密和解释由信赖方和钱包/持有者处理。
数字凭证 API 被设计为协议无关的,这意味着它可以支持各种用于凭证交换的底层协议。然而,有两个主要的协议家族是当前实现和讨论的核心:org.iso.mdoc(源自 ISO 18013-5 及其扩展 ISO 18013-7 “附件 C”)和 OpenID 基金会的 OpenID for Verifiable Presentations (OpenID4VP) 和 OpenID for Verifiable Credential Issuance (OpenID4VCI) 规范。
起源与标准化:org.iso.mdoc 指的是移动文档的数据格式和交互模型,主要是移动驾驶执照 (mDL),由国际标准化组织 (ISO) 和国际电工委员会 (IEC) 标准化。基础标准是 ISO/IEC 18013-5,它定义了 mDL 应用程序、数据结构以及使用 NFC、蓝牙或 QR 码等技术进行现场(近距离)出示的协议。ISO/IEC 18013-7 将此扩展到支持 mDL 的在线/远程出示。协议字符串“org.iso.mdoc”在 ISO/IEC TS 18013-7(附件 C)中专门定义,用于与数字凭证 API 等 API 一起使用。
数据模型:mdocs 具有基于 CBOR(简洁二进制对象表示法)的严格定义的数据结构,以实现紧凑性和效率。它为常见的驾驶执照属性指定了命名空间和数据元素,并支持强大的加密安全功能,包括颁发者认证、设备绑定、持有者认证(通过肖像)、会话加密和选择性披露。
典型用例:主要是政府颁发的身份文件,如驾驶执照和国民身份证。它专为高保证场景设计,包括现场(例如,交通检查、限制商品的年龄验证)和在线(例如,访问政府服务、银行开户的远程身份验证)。
特性 | org.iso.mdoc (ISO 18013-5/7) | OpenID4VP / OpenID4VCI |
---|---|---|
标准化组织 | ISO/IEC | OpenID 基金会 |
主要焦点 | 移动驾驶执照 (mDL) 和官方 ID | 通用可验证凭证交换(任何类型) |
数据格式 | 基于 CBOR,严格定义的数据元素 | 格式无关;通常是 W3C VC (JSON/JWT)、mdocs、SD-JWT |
传输方式 | 为近距离(NFC、BLE、QR)和在线(18013-7)定义 | 主要基于 OAuth 2.0 用于在线;可通过 QR、深层链接启动 |
选择性披露 | 通过加盐哈希声明内置 | 通过 Presentation Exchange 或 DCQL 等查询语言 |
成熟度 | ISO 18013-5:已发布标准。ISO 18013-7:已发布技术规范。ISO 23220 系列(通用 mDocs):开发中 | OpenID4VP:高级草案(例如,第 28 版草案,2025 年 4 月)。OpenID4VCI:高级草案 |
典型颁发者 | 政府机构(DMV 等) | 政府、教育机构、雇主、任何实体 |
标准成本 | 付费 | 免费 / 开放 |
重要的是要认识到,这些并不总是相互排斥的。例如,OpenID4VP 可以用来请求和传输一个 [org.iso.mdoc]。选择通常取决于具体用例、凭证类型和生态系统参与者。
欧盟数字身份 (EUDI) 钱包是一项重大举措,旨在为所有欧盟公民和居民提供一个安全的数字钱包,用于存放身份文件和证明。EUDI 钱包架构和参考框架明确计划支持 mdoc(特别是移动驾驶执照)和 W3C 可验证凭证,利用 OpenID4VP 和 OpenID4VCI 进行出示和颁发流程。参考实现包括支持 OpenID4VP 传输 mDocs 和 OpenID4VCI 颁发 mDoc 和 SD-JWT-VC 格式的 PID 和 mDL。这样一个大规模项目对两种协议家族的双重支持,凸显了它们的重要性。然而,这一方向并非没有批评,一些观察家指出,深受“美国科技巨头”公司影响的数字凭证 API,可能会被深度整合到最终的 EUDI 钱包规范中。有人担心非欧盟实体可能对欧盟关键基础设施产生影响,正如在此 GitHub 讨论等社区论坛中所讨论的那样。
数字凭证 API 的浏览器格局仍在形成中,其方法和支持水平存在显著差异。
Google Chrome,尤其是在 Android 上,是数字凭证 API 的早期采用者和实现者。他们已经运行了源试用,并将其与 Android 的原生凭证管理器集成。Chrome 的实现主要利用 OpenID4VP 作为通过 navigator.credentials.get()
API 调用请求凭证的协议。虽然 OpenID4VP 本身是格式无关的,可以携带 org.iso.mdoc 或 W3C 可验证凭证作为载荷,但 Google 的实际重点似乎是将 OpenID4VP 流程作为传输机制。Android 的凭证管理器也原生支持 OpenID4VP 用于出示和 OpenID4VCI 用于颁发。这使得 Android 应用可以使用这些标准充当凭证持有者和验证者。
在本文的先前版本中,我们预测 Apple 的方法将与 Google 不同,会专注于 org.iso.mdoc
协议。为了历史背景,我们的推理如下:
WebKit 错误跟踪器和标准贡献的证据表明,Safari 将选择专注于直接支持 org.iso.mdoc
,而不是优先将 OpenID4VP 作为所有凭证类型的传输层。这很可能是由于对 OpenID4VP 在浏览器环境中的复杂性存在技术保留,以及 Apple 在塑造 ISO mdoc 标准以符合其平台安全模型方面投入了大量精力。
正如我们正确预测的那样,WWDC25 证实了这一策略。在大会上,Apple 正式宣布在 Safari 26(将于 2025 年秋季随 iOS 26 和其他操作系统更新一起发布)中支持该 API,并确认其实现仅支持 org.iso.mdoc
协议进行出示。
这在 WWDC25 的会议 在 Web 上验证身份文件 中有详细说明。该 API 允许网站从存储在 Apple 钱包或第三方文档提供商应用中的身份文件(如驾驶执照)请求可验证信息。
Apple 实现的关键要点:
"org-iso-mdoc"
。Safari 的数字凭证 API 实现不支持 OpenID4VP。IdentityDocumentServices
框架和应用扩展来充当文档提供商。Apple 提供了一个清晰的代码示例,说明信赖方如何使用该 API:
async function verifyIdentity() { try { // 服务器生成并以加密方式签署请求数据。 const response = await fetch("drivers/license/data"); const data = await response.json(); // 请求指定了 'org-iso-mdoc' 协议。 const request = { protocol: "org-iso-mdoc", // data 包含经加密签署的 mdoc 请求。 data, }; // API 必须在用户手势操作中调用。 const credential = await navigator.credentials.get({ mediation: "required", digital: { requests: [request], }, }); // 将来自钱包的加密响应发送到服务器进行解密和验证。 const verificationResponse = await fetch("/decrypt", { method: "POST", body: JSON.stringify(credential.data), headers: { "Content-Type": "application/json", }, }); // 显示已验证的详细信息... const json = await verificationResponse.json(); presentDetails(json); } catch (err) { // 处理错误,例如用户取消操作。 } }
这一确认巩固了浏览器市场的不同策略。Chrome 建立在灵活的 OpenID4VP 传输层之上,而 Apple 则利用其在 ISO mdoc 生态系统中的深厚投入,提供一个高度集成和安全,尽管灵活性较低的、专为官方身份文件量身定制的解决方案。
Mozilla 已正式对当前的数字凭证 API 提案表达了**“负面”立场**。他们的担忧是全面的,根植于其保护用户隐私、自主权以及确保一个开放、公平的网络的使命。
Mozilla 承认,这样的 API 可能会比现有的临时凭证出示方法提供更多实用性,但强调新的 Web 平台功能必须能够证明其能从整体上改善网络,并优先考虑用户的利益。虽然 W3C 理事会否决了一项与这些担忧相关的正式反对意见(以允许该工作在 W3C 内部进行,而不是在可能透明度较低的场所进行),但理事会确实建议工作组积极努力减轻这些潜在危害。
表 1:浏览器对数字凭证 API 和协议的支持
特性 / 浏览器 | Google Chrome (在 Android 和桌面端) | Apple Safari (在 iOS 和 macOS 上) | Mozilla Firefox |
---|---|---|---|
数字凭证 API (navigator.credentials.get()) | ✅ 支持(源试用 / 开发中)。将在 Chrome 141 中上线。 | ✅ 是(在 Safari 26 Beta 中支持) | ❌ 负面立场 |
org.iso.mdoc 支持 (通过 API) | ✅ 是(作为载荷格式,通常通过 OpenID4VP) | ✅ 是(支持的独占协议) | ❌ 不适用,因对 API 持负面立场 |
OpenID4VP 支持 (通过 API) | ✅ 是(API 交互的主要协议) | ❌ 负面 | ❌ 不适用,因对 API 持负面立场 |
OpenID4VCI (通过 Web API 颁发) | ✅ 是(由 Android 凭证管理器支持) | ❌ 不太可能通过浏览器 API(仅限原生应用) | ❌ 不适用,因对 API 持负面立场 |
主要开发重点 | OpenID4VP 作为传输;mdoc 和 W3C VC 作为载荷 | org.iso.mdoc 格式和直接协议交互 | 在支持 API 前解决基本问题 |
对于打算向用户请求和验证数字凭证的组织(信赖方或 RP),当前的格局需要仔细的战略规划。
鉴于拥有显著市场份额的 Safari 可能会优先通过数字凭证 API 进行直接的 org.iso.mdoc 交互,而 Chrome/Android 则强调 OpenID4VP(可以携带 mdocs 或其他可验证凭证格式),旨在实现最广泛覆盖的 RP 应准备支持基于这两种方法的交互。
这意味着构建能够实现以下功能的系统:
虽然这增加了复杂性,但试图强迫所有用户走单一协议路径可能会排除大部分用户群,无论是 iOS 用户还是 Android/Chrome 用户,具体取决于所选的路径。一个务实但开发强度更高的方法是构建灵活性以处理这两种情况。
信赖方必须敏锐地意识到,即使请求的是相同的逻辑信息(例如,“用户是否年满 21 岁?”),在直接的 mdoc 查询和 OpenID4VP 查询(可能使用 Presentation Exchange 或 DCQL)之间,该信息在请求中的定义方式和在响应中的返回方式可能会有显著不同。
RP 需要将其特定的数据需求映射到这些不同的协议结构中。至关重要的是要理解在每种协议中选择性披露是如何实现和请求的细微差别,以确保只请求和处理最少必要的数据,从而遵守隐私最佳实践和数据最小化原则。钱包返回的已披露数据的格式和结构也可能不同,需要在 RP 的后端进行不同的解析和验证逻辑。
对于希望颁发数字凭证并为持有者提供钱包应用程序的实体来说,操作系统环境起着至关重要的作用。
钱包颁发者在 iOS 和 Android 上面临着截然不同的环境,涉及钱包创建、系统集成以及与数字凭证 API 的交互。
Apple 的“围墙花园”方法是众所周知的,其数字凭证的实现也不例外。然而,WWDC25 阐明了第三方参与的路径。
虽然 Apple 钱包是州 mDL 等凭证的主要内置提供商,但 Apple 为原生 iOS 应用引入了 IdentityDocumentServices
框架。这允许第三方开发者构建可以配置和出示其自身身份文件的应用程序。
要参与 Web 流程,原生应用必须:
IdentityDocumentProviderRegistrationStore
向操作系统注册应用管理的 mdocs。此注册包括文档类型和用于请求签名的受信任证书颁发机构。这意味着,虽然在 iOS 上创建一个完全集成的钱包需要构建一个原生应用程序并使用 Apple 的特定框架——而不是像 PWA 这样的 Web 技术——但对于第三方应用来说,有一个清晰的、尽管受到严格控制的机制,可以与 Apple 钱包一起充当文档提供商。这证实了在 Safari 中与数字凭证 API 的交互由操作系统管理,然后操作系统将请求分派给 Apple 钱包或任何其他已注册并授权的文档提供商应用。
数字凭证 API 代表了数字身份领域的重大进步,为身份验证和凭证出示提供了一种更安全、以用户为中心且保护隐私的方法。随着生态系统的发展,信赖方和钱包颁发者都必须适应并拥抱这项新技术的潜力。随着形势的变化,我们将不断更新本文。
然而,挑战依然存在。在不同凭证格式、协议和钱包实现之间实现真正的全球互操作性是一项重大任务。解决像 Mozilla 这样的组织就隐私、排斥和用户自主权提出的合理担忧,对于确保这些技术服务于人类至关重要。当前浏览器支持和协议重点的碎片化意味着,信赖方和钱包颁发者在短期内必须在一个复杂的环境中前行。
Enjoyed this read?
🤝 Join our Passkeys Community
Share passkeys implementation tips and get support to free the world from passwords.
🚀 Subscribe to Substack
Get the latest news, strategies, and insights about passkeys sent straight to your inbox.
Related Articles
Table of Contents