數位憑證 API:在網路上安全且私密地驗證身分

Natalia Markoborodova
Natalia Markoborodova

發布日期:2025 年 10 月 3 日

很高興在此宣布,從 Chrome 141 開始,數位憑證 API 將預設為啟用。此外,iOS 26 還支援 Chrome 和其他瀏覽器的 Digital Credentials API。這項 API 可為網路上的身分驗證帶來全新層級的安全性和隱私權,讓網站能以標準化方式要求及接收使用者提供的可驗證資訊。

原始碼試用成功後,Digital Credentials API 現在支援在 Android 裝置上出示憑證,以及在電腦版 Chrome 上跨裝置出示憑證。

背景

目前線上身分驗證程序相當複雜,通常需要使用者上傳身分證件掃描檔。這種做法通常表示會分享超出必要的資料,這會對使用者造成嚴重的隱私權疑慮。對開發人員而言,這也造成風險,因為他們必須確保解決方案能夠以安全且保護隱私權的方式,處理及儲存通常不一致的私密/機密資料。

同時,eIDAS 2.0 等法規也規定政府必須向大眾提供數位身分識別方式。這些數位身分證件錢包必須能夠保存各種憑證,包括身分和年齡證明。線上服務供應商可以要求提供這些憑證,以驗證使用者身分。

為滿足使用者對隱私權的需求,以及開發人員驗證使用者資料的需求,W3C 的網路標準社群開發了一項解決方案:Digital Credentials API。為解決這個問題,數位憑證 API 導入了內建介面,可驗證使用者資訊,相較於其他替代方案,安全性、隱私權和使用者體驗都更勝一籌。有了這項 API,使用者不必再將身分證件掃描檔等私密文件上傳至多個網站。網站可以只向信任的簽發機構要求特定且經過加密簽署的資料,藉此贏得使用者信任。

核心功能

數位憑證 API 的建構依據是三項核心原則:隱私權、跨平台支援和標準化。

隱私權

Digital Credentials API 可提升線上隱私權和安全性。使用者可透過行動錢包向網站出示數位身分證件,驗證特定事實,不必揭露底層的私密資料。舉例來說,API 可以驗證使用者是否年滿 18 歲,而不必揭露完整生日。這項「選擇性揭露」原則可確保網站只會收到必要的最低資訊量。

Digital Credentials API 也與零知識證明 (ZKP) 通訊協定相容,例如 Google 的 Longfellow ZK。這類通訊協定會傳回加密證明,確保特定身分主張為真,但不會揭露任何其他資訊,藉此保護使用者隱私權。

支援多種平台

數位憑證 API 的目標是支援不同平台,讓使用者在各種裝置上都能輕鬆出示驗證資訊。

Android:提供內建使用者介面,讓使用者從已安裝的錢包應用程式中選取憑證。

在電腦上:使用者可以透過電腦瀏覽器,將行動錢包中的憑證提供給網站。掃描 QR code 後,系統會在電腦和行動裝置之間建立安全、端對端加密且防網路釣魚的連線。這項連線會使用 CTAP 通訊協定,透過 BLE 驗證使用者是否在附近,確保使用者實際在場,且能控制兩部裝置。

標準化

互通性是關鍵。在 Chrome 中,數位憑證 API 與通訊協定平台無關,且相容於各種呈現通訊協定,例如 OpenID4VPISO 18013-7 的附錄 C。Apple 也從 Safari 26.0 開始支援 Digital Credentials API

此外,Digital Credentials API 採用 Android 內建的憑證管理支援功能,並與日漸壯大的相容錢包生態系統整合。Google 錢包是早期採用者,Samsung 錢包和 1Password 也即將支援這項功能。

自來源試用以來的新功能

如果您曾參與先前的來源試用,會發現 Digital Credentials API 已從 navigator.identity.get() 移至 navigator.credentials.get(),與憑證管理 API 的身分統一作業保持一致。此外,providers 參數已重新命名為 requestsrequest 則重新命名為 data

導入作業

整合 Digital Credentials API 主要有兩個步驟:偵測功能,以及要求憑證。開發人員也應實作自訂邏輯,判斷應用程式是否可以使用憑證。

特徵偵測

顯示「使用數位憑證驗證」按鈕前,請先檢查使用者的瀏覽器是否支援 Digital Credentials API。

if (typeof DigitalCredential !== "undefined") {
  // Digital Credentials API is supported
} else {
  // Digital Credentials API is not supported
}

要求憑證

要求憑證時,需要使用 digital 參數呼叫 navigator.credentials.get()。在數位憑證類型中,新增包含 DigitalCredentialGetRequestrequests 陣列,並提供下列基本參數:

  • protocol:以字串指定交換通訊協定。例如 "openid4vp""org-iso-mdoc"。按照下列步驟偵測瀏覽器是否支援通訊協定:

    if (DigitalCredential.userAgentAllowsProtocol("example-protocol")) {
        // Create a request with this protocol
      } else {
        // Protocol is not supported
    }
    
  • data物件,其中包含數位錢包應用程式接受的指定通訊協定參數。"openid4vp" 參數定義於 W3C 數位憑證 API 規格的 OpenID for Verifiable Presentation (OID4VP)

    try {
      const digitalCredential = await navigator.credentials.get({
        digital: {
          requests: [{
            protocol: "openid4vp-v1-unsigned",
            data: {
              response_type: "vp_token",
          nonce: "[some-nonce]",
              client_metadata: {...},
          dcql_query: {...}
            }
        }]
        }
      });
    
      // Decrypt payload respons and verify credentials on the backend
      const response = await fetch("/verify", {
        method: "POST",
          body: JSON.stringify(digitalCredential.data),
          headers: {
              'Content-Type': 'application/json'
          }
      });
    } catch (e) {
      // Handle errors, such as the user canceling the request
      console.error(e);
    }
    

舉例來說,如要要求提供使用者的姓氏、名字,以及指出使用者是否年滿 21 歲的布林值,可以指定下列酬載:

{
  protocol: 'openid4vp-v1-unsigned',
  data: {
    response_type: 'vp_token',
    nonce: '[some-nonce]',
    // Contains the Verifier metadata values, including supported credential formats and response encryption public key
    client_metadata: {
  // Supported credential formats. Refer to the documentation for specific values
        vp_formats_supported: {...},
   // Public key(s). Refer to the documentation for more detail.
        jwks: {...}
    },
    dcql_query: {
      // A wallet will try to find credentials it holds that match these definitions.
      credentials: [
        {
          // A locally unique identifier for this credential definition within the query.
          id: "cred_vc",
          format: "dc+sd-jwt",
          meta: {
            // 'vct_values' specifies the Verifiable Credential allowed type.
            // In this case, it's a European Digital Identity (EUDI) Personal Identification Data (PID) credential.
            vct_values: [
              "urn:eudi:pid:1"
            ]
          },
          // 'claims' is an array of specific data that's being requested.
          claims: [
            {
              // The path ["age_equal_or_over", "18"] corresponds to accessing `credential.age_equal_or_over['18']`.
              path: [
                "age_equal_or_over",
                "18"
              ]
            }
          ]
        }
      ]
    }
  }
}

在本範例中,client_metadata 必須指定支援的格式清單。請參閱規格,瞭解可使用的值。client_metadata 中設定的選用 jwks必須包含用於加密回應的公開金鑰。如需更多範例,請參閱示範程式碼

以下是 DigitalCredential 物件加密回覆酬載的範例:

{
    // This is an example for a response using an OpenID4VP protocol.
    // The format of the 'data' object will differ for other protocols.
    "protocol": "openid4vp-v1-unsigned",
    "data": {
        // To decrypt this JWE payload, use the private key.
   // The decrypted payload will be a JSON object containing the
       // Verifiable Presentation in the 'vp_token' claim.
        "response": "[jwe-token]"
    }
}

在本例中,系統會使用 openid4vp-v1-unsigned 通訊協定要求憑證,而回應會在 data 屬性中包含 response

確切的剖析回應方式取決於通訊協定。您通常需要:

  1. 解密回應酬載。解密方法取決於使用的通訊協定。請參閱如何解密 openid4vp (使用 JWE) 和 org-iso-mdoc (使用混合型公開金鑰加密) 的酬載。
  2. 驗證簽章和簽發機構。詳情請參閱「線上接受數位憑證」說明文件。

如要查看不同通訊協定的程式碼範例,請參閱示範程式碼即時託管版本

驗證對核發機構的信任

數位憑證的加密簽章可證明憑證的真實性。不過,開發人員必須確認發行者是否適合且值得信任,以用於特定用途。舉例來說,如要提供大學生折扣,電子商務網站會要求提供經認可大學核發的憑證,並拒絕任何其他實體簽署的憑證。驗證核發者是否值得信任的常見做法,是維護核准的核發者清單,並拒絕任何不符的核發者。

開始使用

準備好開始進行建構?請詳閱以下重要須知。

  • 適用版本:Chrome 141 以上版本預設會在不同平台啟用 Digital Credentials API。
  • 必要條件:使用者必須擁有相容的裝置,例如搭載 Google Play 服務 24.0 以上版本的 Android 裝置,或是搭載 26 以上版本的 iOS 裝置。裝置必須安裝支援 Digital Credentials API 的數位錢包應用程式,例如 Google 錢包或示範錢包
  • 試用示範:如要瞭解使用者體驗並測試實作方式,最好的方法就是使用 Chrome 141 以上版本,前往 https://verifier.multipaz.org 試用即時示範。

資源

詳情請參閱下列資源:

提供意見

數位憑證 API 現已發布,歡迎分享您使用這項 API 建構應用程式的體驗。提出問題 分享意見回饋或回報任何錯誤。