「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
- WebAuthnを実装する前に理解を深める。
- specレベルは上位項を参照のこと。
詳細 †
以下に、各種、調査結果をサマリーする(まだまだ理解不足です)。
登録フロー †
(1) challengeの受信 †
(2) navigator.credentials.create() の param †
# | パラメタ | 必須 / 任意 | 説明 | フォーマット |
1 | rp | 必須 | Relying partyに関する情報 | JSON Object (下記メンバを持つ) |
1-1 | ・ | id | FQDN名 | String |
1-2 | ・ | name | 任意のRPサイト名 | String |
2 | user | 必須 | Credentialが紐づくユーザー情報 | JSON Object (下記メンバを持つ) |
2-1 | ・ | id | RP上のユーザID | ArrayBuffer? |
2-2 | ・ | name | RP上のユーザID | String |
2-3 | ・ | displayName | RP上のユーザ表示名 | String |
3 | challenge | 必須 | サーバーで生成した乱数 | ArrayBuffer? |
4 | pubKeyCredParams? | 必須 | Credential情報 | JSON Objectの配列 |
4-1 | ・ | type | タイプ(public-key固定) | String |
4-2 | ・ | alg | アルゴリズムを表す数値 | Int |
5 | timeout | 任意 | ユーザーの入力待機時間 | Int |
6 | attestation | 任意 | Authenticator自体の検証 | JSON Object (AttestationConveyancePreference?) |
7 | authenticatorSelection | 任意 | 認証器への要求事項 | JSON Object (AuthenticatorSelectionCriteria?) |
8 | excludeCredentials | 任意 | | JSON Object (PublicKeyCredentialDescriptor?) |
(3) navigator.credentials.create() の return †
# | パラメタ | 説明 | フォーマット |
1 | id | 割り当てられたid | rawIdの文字列表現 |
2 | rawId | idのArrayBuffer?版 | ArrayBuffer? |
3 | ・ | response | AuthenticatorAttestationResponse? | JSON Object (AuthenticatorAttestationResponse?) |
3-1 | | ・ | attestationObject | 公開鍵などを含む | CBOR形式 |
3-1-1 | | | ・ | fmt | Attestation format | "fmt": "packed" |
3-1-2 | | | ・ | authData | Raw buffer struct containing user info | "authData": "{rpIdHash?: "..." ,... }" |
3-1-2-1 | | | | ・ | rpIdHash? | | |
3-1-2-2 | | | | ・ | flags | | |
3-1-2-3 | | | | ・ | flagsBuf | | |
3-1-2-4 | | | | ・ | counter | | |
3-1-2-5 | | | | ・ | counterBuf | | |
3-1-2-6 | | | | ・ | aaguid | | |
3-1-2-7 | | | | ・ | credID | | |
3-1-2-8 | | | | ・ | credIDLen | | |
3-1-2-9 | | | | ・ | credIDLenBuf? | | |
3-1-2-10 | | | | ・ | COSEPublicKey? | | |
3-1-3 | | | ・ | attStmt | Attestation statement data | "attStmt": {sig: "", x5c: ""} |
3-1-3-1 | | | | ・ | sig | Signature | "sig": "..." |
3-1-3-2 | | | | ・ | x5c | X.509 Certificate Chain | "x5c": ["..."] |
3-2 | | ・ | clientDataJSON | クライアント・データ | CBOR形式 |
3-2-1 | | | | ・ | challenge | Random number | "challenge": "..." |
3-2-2 | | | | ・ | origin | Origin of the website | "origin": "http(s)://..." |
3-2-3 | | | | ・ | type | Type of the call | "type": "webauthn.create" |
4 | type | pubKeyCredParams? - typeと同じ | "type": "public-key" |
(4) challenge、origin、typeの検証 †
- techblogyahoo
clientDataJSONの...
- challenge
param.challenge = return.clientDataJSON.challenge みたいな話。
- origin
xxxx = return.clientDataJSON.origin みたいな話。
- type
"webauthn.create" = return.clientDataJSON.type みたいな話。
(5) flagsの検証 †
- techblogyahoo
- UP : User Presence
ユーザーの存在確認(必須)
- UV : User Verification
ユーザーの認証(任意)
(6) signatureの検証 †
(7) 公開鍵の保存 †
認証フロー †
(1) challengeの受信 †
(2) navigator.credentials.get() の param †
# | パラメタ | 必須 / 任意 | 説明 | フォーマット |
1 | challenge | 必須 | サーバーで生成した乱数 | ArrayBuffer? |
2 | timeout | 任意 | ユーザーの入力待機時間 | Int |
3 | rpId | 任意 | rpIdの指定(登録時と同じ値を指定) | String |
4 | allowCredentials | 任意 | ユーザに紐づくCredentialのリスト | Array (PublicKeyCredentialDescriptor?) |
5 | userVerification | 任意 | ユーザ検証に関する要件 | String (enum UserVerificationRequirement?) |
(3) navigator.credentials.get() の return †
# | パラメタ | 説明 | フォーマット |
1 | id | 割り当てられたid | rawIdの文字列表現 |
2 | rawId | idのArrayBuffer?版 | ArrayBuffer? |
3 | response | assertion data | JSON Object (AuthenticatorAssertionResponse?) |
3-1 | ・ | authenticatorData | rpIdHash?, flagsBuf, flags, counter, counterBuf | ArrayBuffer? |
3-2 | ・ | clientDataJSON | クライアント・データ | ArrayBuffer? |
3-2-1 | | ・ | challenge | Random number | "challenge": "..." |
3-2-2 | | ・ | origin | Origin of the website | "origin": "http(s)://..." |
3-2-3 | | ・ | type | Type of the call | "type": "webauthn.create" |
3-3 | ・ | signature | 署名の値 | ArrayBuffer? |
3-4 | ・ | userHandle | 認証器が返す値 | ArrayBuffer? |
4 | type | タイプ(public-key固定) | String |
5 | getClientExtensionResults? | extensions results struct | |
(4) challenge、origin、typeの検証 †
- techblogyahoo
clientDataJSONの...
- challenge
param.challenge = return.clientDataJSON.challenge みたいな話。
- origin
xxxx = return.clientDataJSON.origin みたいな話。
- type
"webauthn.create" = return.clientDataJSON.type みたいな話。
(5) flagsの検証 †
- fido2-net-lib ... サーバー側で処理
- techblogyahoo
authenticatorData.flags
- UP : User Presence
ユーザーの存在確認(必須)
- UV : User Verification
ユーザーの認証(任意)
(6) signatureの検証 †
- techblogyahoo
- Authenticatorの検索
- PublicKey?の取得
- signatureを検証
- counterの検証と更新
実装例 †
提案されたI/F †
FIDO2サーバ標準は存在しないが、
- FIDO2適合テストツールで使用する提案されたREST APIのI/Fは存在する。
- このI/Fは必須で無いが、Serverが標準の方法でMessageを送受信することで
適合テストツールによって使用され、機能が自動的に検証されるようにできる。
- 登録フローには、認証が必要だと思うのだケド、
認証実装したらテストツールも通らないんじゃないか?と。
Credential Creation Options †
Authenticator Attestation †
Credential Get Options †
Authenticator Assertion †
サーバ実装パターン †
OIDCのSTS/IdP(OP)、Client(RP)のどちらでも
WebAuthnのRelying Party(RP)になれる。
IdP/Stsが実装 †
- 提案されたI/Fの実装
- 登録フロー
認証アクセスが必要だが、サイト内なのでWebAPIよりポストバックがイイ
- 認証フロー
認証後に画面遷移が必要なのでWebAPIよりポストバックがイイ
RP & BaaSが実装 †
- 折衷案
- RPがWebAuthnを操作し、
- バックエンドのIDaaS -> BaaSを使用して公開鍵を管理する。
- 提案されたI/Fの実装
- 登録フロー
RPは、IdP/Stsと連携し、
Resource Serverとして機能するBaaSに公開鍵を登録。
- 認証フロー
BaaSに登録した公開鍵を取得するために、
Client認証のみのグラント種別を使用しRPの認証をする。
RPが実装 †
- IdP/Sts
- のコントロールが効かない場合。
- を、そもそも、保有しない場合。
実現できるUX †
参考 †
techblogyahoo †
パラメタ †
gist.github.com/daisukenishino2 †
https://gist.github.com/daisukenishino2/f09fb400fa2186aead4b6f8cad59ab38#gistcomment-2852202
Ackermann Yuriy – Medium †
Mercari Engineering Blog †
enjoy struggling †
Qiita †
ritou †
r-weblife †
Qiita †
Tags: :IT国際標準, :認証基盤