WebAuthnの仕様を4章まで読んだ

これを読んでいる Web Authentication: An API for accessing Public Key Credentials Level 1

4章まで読んだとはつまりまだ本編に入っていないという意味である

TerminologyがTerminologyだけで理解できないところがいくつかあり、今後を読み進めながら理解した上で再度読み直し、ある程度噛み砕いた説明をできるようになったら会社のブログにまとめる予定

以下、読みながらとっていたメモ

Introduction

  • webauthnは認証のための公開鍵ベースのクレデンシャルを作るAPIだよ
  • 公開鍵はRPに所属するOriginからしかさわれないよ
  • 他のRPからはデータの中身とか存在性とか見れないよ
  • Web Authentication APIはRegistrationとAuthenticationの2つの区分があるよ
    • Registrationでは認証機によって公開鍵クレデンシャルが作られるよ
      • 公開鍵クレデンシャルはRPのユーザーアカウントに紐づけられるよ
        • 公開鍵クレデンシャルはアカウント登録時か、登録後に生成して紐付けとけばおk
    • AuthenticationではRPは認証アサーションを提示されるよ
      • これは公開鍵を登録したユーザーの存在と同意を証明します
    • それぞれのAPInavigator.credentials.create()navigator.credentials.get()
  • 認証機はWeb Authentication APIを使ってUAとやりとりする
    • バイス自体(スマホとかPCとか)に実装されてる認証器(プラットフォーム認証器)とUSBとかBLEとかNFCでデバイスと接続して使う認証器(ローミング認証器、いわゆるセキュリティキー)があるよ

1.1 Specification Roadmap

  • 想定してる読み手がUAの開発者とかRPの開発者とか認証器の開発者とかいろいろいるけどどの辺読んだらいいんだ?が書いてある

1.2 Use Cases

いわゆるユースケース

1.2.1 Registration

  • 携帯電話で
    • サイトにアクセスしてパスワードでログインして
    • 画面にデバイス登録する?って出るので
    • ユーザーが同意して
    • 事前に設定した認証ジェスチャーバイオメトリクスとかPINとか)にあわせてユーザーがなんかして
    • 登録おkって表示される

1.2.2 Authentication

  • PCでスマホにBLEでつないでスマホで認証フロー進めたらPC側で認証完了してる、みたいな話書いてあるんだが、そんなことできんの? // TODO

1.2.3 New Device Registration

  • ローミング認証器とプラットフォーム認証器どっちも登録するような場合のユースケース
    • 最初にプラットフォーム認証器が実装されてないPCでローミング認証器を登録して、その後別のデバイスでプラットフォーム認証器を登録する
    • これをやるとパスワードリカバリで便利だったりする
  • フロー
    • デスクトップPC側
      • デスクトップPCでパスワードログイン
      • セキュリティキーの登録ページに行く
      • USBのセキュリティキーを刺すとセキュリティキーがチカチカするのでタッチすると、登録完了
    • ラップトップ側
      • サインイン画面でユーザーがUSBキーを刺してボタンをおす
      • サインイン後の画面でPCのプラットフォーム認証器を登録するか聞いてくる
      • ユーザーがOKして事前設定した認証ジェスチャーを行う
      • 登録完了し、サインアウト
    • 再びラップトップ
      • サインインしてねプロンプトがでるので、認証ジェスチャーをするとサインインする

1.2.4 Other Use Cases and Configurations

1.3 Platform-Specific Implementation Guidance

一般的なユースケースについて定義してるけど特定のプラットフォームでサポートする場合はプラットフォーム側の仕様とか制約とか見てくれよな

2 Conformance

  • 各要素が何に適合してないとダメか、みたいな話

2.1 User Agents

  • UAの実装者は、仕様を守ってくれよな!

2.2 Authenticators

  • 認証器の実装者は、仕様を守ってくれよな!

2.2.1 Backwards Compatibility with FIDO U2F

  • U2Fしかサポートしない場合、UserHandleは常にnullにしてくれよな!
    • UserHandleは要するに認証器側が持ってるユーザーIDみたいなやつ
    • U2FはIDレス認証ないので

2.3 WebAuthn Relying Parties

  • 認証器の実装者は、仕様を守ってくれよな!

2.4 All Conformance Classes

  • CBORの仕様を守ってくれよな!
  • 守ってないやつは、許すな!

3 Dependencies

  • WebAuthnが依存してる他の仕様一覧
    • Base64url encodingはこの定義に合わせてるぞ、とか
    • ここでいうCBORはこれのことだぞ、みたいな

4 Terminology

  • アテステーション
    • 認証器や、認証器が出力したデータ(credeitnal idとかキーペアとか署名回数とか)の出どころを証明する文章
    • 登録時にアテステーションオブジェクトの中に入れて送信する
  • アテステーション証明書
    • 認証器が自身の製造元とか性能を証明するために認証器自体が利用するアテステーションキーペアのためのX.509証明書
    • 登録時に認証器はアテステーション秘密鍵をRP専用の公開鍵(と追加データ)に署名するために利用する。この公開鍵はauthenticatorMakeCredentialを通じて生成される
    • RPはアテステーション署名検証のために証明書のアテステーション公開鍵を利用する
  • 認証式
    • ユーザーとユーザーのクライアント(1つ以上の認証器)が一緒になって、ユーザーが登録した公開鍵クレデンシャルに紐づく秘密鍵を管理下においていることを暗号学的に証明すること。
    • この秘密鍵はあの公開鍵クレデンシャルを登録した俺だ!を証明するための式。しきたりに合わせた一連作業なので、式、っぽい。方程式の式じゃなくて、卒業式の式
  • 認証アサーション
  • 認証器
    • RPに登録する公開鍵クレデンシャルを生成し、潜在的なユーザー検証によって認証を行い、RPによって提示されたデータ、チャレンジ、認証アサーションを暗号で署名して返却するWebAuthnクライアントによって利用される、暗号化エンティティ
  • 認証ジェスチャー
    • ユーザーが認証器に対して物理的に行うインタラクション
      • ユーザーが同意を示すために利用する
      • 登録と認証時にジェスチャーする
      • タップするだけだったり、認証器側が対応していればユーザー認証もできる(指紋とか)
  • バイオメトリクス認証
    • 個人の生態学的もしくは行動パターンを元にした自動的な認証
  • バイオメトリクス認証
  • Bound credential
    • Boundは境界の方じゃなくてBindの過去分子
    • 管理認証器だけが認証器に紐づけられた公開鍵クレデンシャルソースのためのアサーションを生成できること
  • セレモニー
    • 人間とか物理デバイスとかコンピューティングとかが連携してよしなに頑張ること(多分・・・)
      • の一連の流れのことをセレモニーという、という認識でよさそう
    • WebAuthnの文脈では登録と認証のこと
  • クライアントプラットフォーム
    • クライアントデバイスとクライアントであわせてクライアントプラットフォーム
      • 1つのハードウェアデバイスも、OSやクライアントが異なる別のコンテキストで実行されれば、複数のクライアントプラットフォームとなる
  • クライアントサイド
    • 認証器とクライアントプラットフォーム
  • レジデントクレデンシャル / クライアントサイドレジデント公開鍵クレデンシャルソース
    • 認証器、クライアントもしくはクライアントデバイスに保存されているクレデンシャル秘密鍵が属する公開鍵クレデンシャルソースのこと。 // TODO 関係性がよくわからんのでわかったら追記
    • そのようなクライアント再度のストレージはレジデントクレデンシャルに対応している認証器を必要とし、認証器がRP IDだけを渡された場合に、ユーザーとやりとりすることで秘密鍵を選択できる必要がある
    • 定義では、クレデンシャル秘密鍵は認証器によってのみ常にコントロールされる。レジデントクレデンシャルの場合、認証器は認証器自身からラップされたキーマテリアルのストレージをクライアントデバイスにオフロードするが、クライアントデバイスはそのキーストレージをリモートエンティティ(RPサーバーとか)には送信しない
  • Conforming User Agent
    • WebAuthn対応のUA
    • JSのAPIが叩けて、認証器と接続できる
  • クレデンシャルID
    • 公開鍵クレデンシャルソースとその認証アサーションのID
      • 認証器が生成する
  • クレデンシャル公開鍵
    • RPに登録するときにRPに対して発行されるキーペアの公開鍵の方
    • 公開鍵の方はRPに送る
  • Human Palatability
    • 人間が理解できて、覚えられるようなID
    • ランダムなバイトシーケンスとかじゃないやつ
  • 公開鍵クレデンシャルソース
    • 認証アサーション生成のために認証器が利用するクレデンシャルソース
    • authenticatorMakeCredentialが公開鍵クレデンシャルソースを生成し、管理している認証器に紐づけ、秘密鍵に紐づいた公開鍵を返す。RPはこの公開鍵を、公開鍵クレデンシャルソースによって作成される認証アサーションの検証に使う。
    • あやふや。// TODO
  • 公開鍵クレデンシャル
    • 公開鍵クレデンシャルソース、公開鍵クレデンシャルソースに対応する認証可能な公開鍵、または認証アサーションのいずれか
    • どれなのか?はコンテキストによる
    • よくわからん // TODO
    • 登録時に認証器は非対称鍵を生成し、秘密鍵の部分とRPからの情報を公開鍵クレデンシャルソースへ保存する
    • 公開鍵の部分はRPに返され、RPはユーザーアカウントと一緒に公開鍵を保存する
    • RP IDによって特定できるRPだけが認証セレモニー時にget()メソッドによって公開鍵クレデンシャルを利用できる。
    • RPは保存した公開鍵のコピー認証アサーションの検証に利用する
  • Rate Limiting
    • いわゆるレートリミット
    • 認証器にブルートフォース対策として実装される
    • 間違えすぎると指数的に遅くなったり禁止されたり
  • 登録 / 登録セレモニー
    • ユーザー、RP、ユーザーのクライアント(1つ以上の認証器を含む)が一緒に頑張って公開鍵クレデンシャルをつくってそれをRPのアカウントに紐づける一連の行為
    • ユーザーの存在チェックとかユーザー認証も含む
  • Relying Party / WebAuthn Relying Party.
    • Web Authentication API で登録、認証をやるWebアプリをもつエンティティ
  • Relying Party Identifier / RP ID *登録、認証セレモニーが実行されるRPを特定する有効なドメイン文字列
  • Test of User Presence
    • シンプルな認証ジェスチャ
      • 要するにユーザーが認証器にタッチするやつ(タッチじゃなくてもよい)
        • Booleanの結果が返る
    • 存在性チェックだけで、user verification ではない
  • User consent
  • User Handle
    • RPがuser.idとして提供し、公開鍵クレデンシャルとRPのユーザーアカウントをマッピングするのに使う
    • 認証器具は公開鍵クレデンシャルソースにユーザーハンドルとRP IDをマッピングする
  • User Verification
    • 認証器が authenticatorMakeCredential と authenticatorGetAssertion でローカルで認証するやつ
    • いくつかの認証ジェスチャーによって行われる
      • タッチしてPIN入力とかパスワード入れたりとかバイオメトリック認証とか
    • 各ユーザーの区別に使える
  • User Present / UP
    • user presence testによる、ユーザーの、「自分、いますよ」
  • User Verified / UV
    • User Verificationによる、ユーザーの、「自分、本当に自分ですよ」
  • Client / WebAuthn Client
    • UAに実装されている中間エージェント
      • WebAuthnのJSのAPIの裏で動いてる何か?
      • 認証器操作のためのインプットを整理したり、Web Authentication APIの呼び出し元に DiscoverFromExternalSourceの操作の結果を返したりする
    • WebAuthn ClientはWebAuthn Client Device上で実行されるが、これらはイコールではなく区別される
  • Client Device / WebAuthn Client Device
    • WebAuthn Clientを実行するスマートフォン、ラップトップ、デスクトップコンピュータなどのハードウェアデバイスと、その上でうごくOS