FIDO2 Conformance Test 完全攻略(一):初步介紹與整體架構
這是系列文章的第一篇,將介紹什麼是 FIDO Conformance Test、為什麼它很重要、以及 159 項測試的整體架構。
FIDO2 Conformance Test 完全攻略(一):初步介紹與整體架構
這是系列文章的第一篇,將介紹什麼是 FIDO Conformance Test、為什麼它很重要、以及 159 項測試的整體架構。
系列文章目錄
- 初步介紹與整體架構(本篇)
- [上篇:註冊流程基礎驗證(57 項測試)]
- [中篇:Attestation 格式深度解析(52 項測試)]
- [下篇:登入流程與 MDS3 信任機制(50 項測試)]
- [重點紀錄:踩坑總結與關鍵程式碼]
什麼是 Passkey?為什麼密碼即將消失?
2024 年,Google、Apple、Microsoft 三大巨頭聯手推動 Passkey(通行密鑰),宣告密碼時代即將終結。
傳統密碼的問題:
- 😰 使用者記不住,只好重複使用
- 🎣 容易被釣魚網站騙走
- 💾 資料庫外洩,密碼被破解
- 📱 簡訊 OTP 可被 SIM Swap 攻擊
Passkey 的優勢:
- 🔐 使用公私鑰加密,私鑰永遠不離開裝置
- 🛡️ 無法被釣魚(綁定網域)
- 👆 生物辨識(指紋/Face ID)即可登入
- 🔄 跨裝置同步(iCloud、Google Password Manager)
什麼是 FIDO Conformance Test?
FIDO Alliance(FIDO 聯盟) 是制定 Passkey 標準的組織,成員包括 Google、Apple、Microsoft、Visa、Mastercard 等。
為了確保各家實作的 Server 都符合規範,FIDO Alliance 提供了 Conformance Test Tools:
通過 Conformance Test 代表:
- ✅ RP Server 符合 W3C WebAuthn 規範
- ✅ 可以和任何標準認證器互動(YubiKey、手機 Passkey 等)
- ✅ 具備申請 FIDO Alliance 官方認證的資格
159 項測試的整體架構
測試分類總覽
分類 說明 詳見
──────────────────────────────────────────────────────────────────
Attestation Options 註冊選項 API 回應格式驗證 第二篇
Attestation Result 註冊結果驗證(含各種格式) 第二、三篇
Assertion Options 登入選項 API 回應格式驗證 第四篇
Assertion Result 登入結果驗證 第四篇
MDS3 Metadata Service 信任根驗證 第四篇
──────────────────────────────────────────────────────────────────
總計:159 項測試
API 端點對應
RP Server 需要實作 4 個 API:
POST /attestation/options ← 產生註冊選項
POST /attestation/result ← 驗證註冊結果
POST /assertion/options ← 產生登入選項
POST /assertion/result ← 驗證登入結果
測試編號規則
每個測試都有編號,例如 Resp-5 F-3:
Resp-5 F-3
│ │ │ │
│ │ │ └── 第 3 個測試案例
│ │ └──── F = Failure(應該失敗)/ P = Pass(應該成功)
│ └────── 第 5 個 Response 測試群組
└─────────── Resp = Response 驗證
P(Pass)測試:發送正確的請求,Server 應該回傳成功 F(Failure)測試:發送故意錯誤的請求,Server 應該回傳錯誤
詳細測試分類
1. Attestation Options(註冊選項)- 4 項
測試 /attestation/options API 的回應格式:
編號 測試內容
────────────────────────────────────────────────────────────────────
P-1 回應必須包含 status、user、rp、challenge、pubKeyCredParams、extensions
P-2 attestation 設為 "none" 時,回應也要是 "none"
P-3 兩次請求的 challenge 必須不同(隨機性)
P-4 userVerification 設為 "required" 時,回應也要是 "required"
2. Attestation Result(註冊結果)
這是最大的測試群組,包含:
群組 測試數量 測試內容
────────────────────────────────────────────────────────────────
Resp-1 16 項 基本結構驗證(id, type, response 欄位)
Resp-2 17 項 clientDataJSON 驗證(type, challenge, origin)
Resp-3 20 項 attestationObject 驗證(fmt, attStmt, authData)
Resp-4 12 項 演算法支援(ES256, RS256, Ed25519...)
Resp-5 19 項 packed FULL attestation
Resp-6 4 項 packed SELF attestation
Resp-7 3 項 none attestation
Resp-8 3 項 fido-u2f attestation
Resp-9 7 項 tpm attestation
Resp-A 4 項 android-key attestation
3. Assertion Options(登入選項)- 2 項
測試 /assertion/options API 的回應格式:
編號 測試內容
────────────────────────────────────────────────────────────────
P-1 回應必須包含 status、challenge、allowCredentials、extensions
P-2 兩次請求的 challenge 必須不同
4. Assertion Result(登入結果)
群組 測試數量 測試內容
────────────────────────────────────────────────────────────────
Resp-1 22 項 基本結構驗證(id, type, response, signature)
Resp-2 17 項 clientDataJSON 驗證
Resp-3 12 項 authenticatorData 驗證(rpIdHash, flags, counter)
5. MDS3(Metadata Service)- 6 項
測試 Server 對 FIDO 認證器資料庫的信任機制:
編號 測試內容
────────────────────────────────────────────────────────────────
P-1 正常的 MDS BLOB,應該接受
F-1 認證器狀態為 COMPROMISED,應該拒絕
F-2 BLOB 簽章錯誤,應該拒絕
F-3 BLOB 憑證鏈錯誤,應該拒絕
F-4 中間 CA 被吊銷,應該拒絕
F-5 葉端憑證被吊銷,應該拒絕
開始測試前的準備
1. 下載 Conformance Test Tools
前往 FIDO Alliance 官網申請: https://fidoalliance.org/certification/functional-certification/conformance/
2. 準備 RP Server
確保 RP Server 實作了 4 個 API:
POST /attestation/optionsPOST /attestation/resultPOST /assertion/optionsPOST /assertion/result
3. 下載測試用 Metadata
Conformance Test 使用虛擬認證器,需要下載對應的 Metadata:
在 Conformance Tools 介面點擊「DOWNLOAD TEST METADATA」
將下載的 JSON 檔案放到 RP Server
4. 回應格式要求
重要! Conformance Test 要求特殊的回應格式:
// ✅ 正確格式(所有欄位平鋪在最外層)
{
"status": "ok",
"errorMessage": "",
"challenge": "xxx",
"rp": {...},
"user": {...}
}
// ❌ 錯誤格式(巢狀結構)
{
"status": "ok",
"data": {
"challenge": "xxx",
"rp": {...}
}
}
錯誤回應也必須是 HTTP 200:
{
"status": "failed",
"errorMessage": "username is required"
}
測試結果
本系列文章基於通過全部 159 項測試的實作經驗:
passes: 159
failures: 0
duration: 157.25s
✅ Server-ServerPublicKeyCredentialCreationOptions-Req-1: 4/4
✅ Server-ServerAuthenticatorAttestationResponse-Resp-1: 16/16
✅ Server-ServerAuthenticatorAttestationResponse-Resp-2: 17/17
✅ Server-ServerAuthenticatorAttestationResponse-Resp-3: 20/20
✅ Server-ServerAuthenticatorAttestationResponse-Resp-4: 12/12
✅ Server-ServerAuthenticatorAttestationResponse-Resp-5: 19/19
✅ Server-ServerAuthenticatorAttestationResponse-Resp-6: 4/4
✅ Server-ServerAuthenticatorAttestationResponse-Resp-7: 3/3
✅ Server-ServerAuthenticatorAttestationResponse-Resp-8: 3/3
✅ Server-ServerAuthenticatorAttestationResponse-Resp-9: 7/7
✅ Server-ServerAuthenticatorAttestationResponse-Resp-A: 4/4
✅ Server-ServerPublicKeyCredentialGetOptionsResponse-Req-1: 2/2
✅ Server-ServerAuthenticatorAssertionResponse-Resp-1: 22/22
✅ Server-ServerAuthenticatorAssertionResponse-Resp-2: 17/17
✅ Server-ServerAuthenticatorAssertionResponse-Resp-3: 12/12
✅ Server-MDS3: 6/6
─────────────────────────────────────────────────────────────
Total: 159/159 passed ✅
下一篇預告
下一篇文章將深入分析 Attestation Options 與 Attestation Result 的基礎驗證,包括:
- id、type、response 欄位的驗證邏輯
- clientDataJSON 的 17 種錯誤情況
- attestationObject 的 CBOR 解碼與驗證
敬請期待
參考資源
#FIDO2 #WebAuthn #Passkey #無密碼登入 #資訊安全 #後端開發
메타데이터
- post_id
- 83f56dbb030f
- slug
- fido2-conformance-test-完全攻略-一-初步介紹與整體架構-83f56dbb030f
- url
- https://medium.com/@rafaelwu0103/fido2-conformance-test-%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5-%E4%B8%80-%E5%88%9D%E6%AD%A5%E4%BB%8B%E7%B4%B9%E8%88%87%E6%95%B4%E9%AB%94%E6%9E%B6%E6%A7%8B-83f56dbb030f
- canonical_url
- https://medium.com/@rafaelwu0103/fido2-conformance-test-%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5-%E4%B8%80-%E5%88%9D%E6%AD%A5%E4%BB%8B%E7%B4%B9%E8%88%87%E6%95%B4%E9%AB%94%E6%9E%B6%E6%A7%8B-83f56dbb030f
- author_url
- https://medium.com/@rafaelwu0103
- status
- ok
- fetched_at
- 2026-06-23 03:48:11