TsgcWSAPIServer_WebAuthn コンポーネントは、ウェブアプリケーションでパスワードレス認証を実現するために WebAuthn Relying Party サーバーを実装するシンプルで強力なソリューションを提供します。WebAuthn アプリケーションは、サーバー側の登録と認証を処理する WebAuthn サーバーと、通常は JavaScript アプリケーションであるクライアント側アプリケーションで構成されます。
WebAuthn はセキュアな接続(SSL/TLS)を必要とするため、OpenSSL ライブラリをサーバーにデプロイして設定する必要があります。
OpenSSL 3.0.0+ APIのみがサポートされています。そのため、以前のOpenSSLバージョンは動作しない可能性があります。
設定
TsgcWSAPIServer_WebAuthn は、Server プロパティを使用して HTTP サーバー(TsgcWebSocketHTTP_Server または TsgcWebSocketServer_HTTPAPI)にアタッチする必要があります。登録と認証オプションを処理するサーバーエンドポイント、サポートされているアルゴリズム、オリジンなどの WebAuthn オプションを設定できます。
エンドポイントオプション
WebAuthn を認証子として使用するための HTTP/JavaScript リクエストを処理するサーバーエンドポイントをここで設定できます。コンポーネントにはデフォルトのエンドポイントが設定済みですが、必要に応じてすべて変更できます。
- AuthenticationOptions: デフォルトは /sgcWebAuthn/Authentication/Options
- AuthenticationVerify: デフォルトは /sgcWebAuthn/Authentication/Verify です
- RegistrationOptions: デフォルトは /sgcWebAuthn/Registration/Options です
- RegistrationVerify: デフォルトでは/sgcWebAuthn/Registration/Verifyです
- Webauthn: デフォルトで使用される JavaScript ライブラリを含みます。このプロパティを無効にして独自の webauthn ライブラリを使用することもできます。
- Test: デフォルトでは無効です。WebAuthn機能をテストする場合にのみ使用してください。
使用例: サーバーがドメイン www.test.com でリッスンしている場合、認証オプションへのデフォルトのリクエスト URL は http://www.test.com/sgcWebAuthn/Authentication/Options になります。
WebAuthn オプション
このプロパティでは WebAuthn サーバーコンポーネントの主要なオプションを設定できます。
- RelyingParty: 必須プロパティで、サーバーの DNS 名を定義する必要があります。例: サーバーがドメイン www.test.com で動作している場合、このプロパティを「www.test.com」に設定します。
WebAuthn は同一オリジンポリシーの制約を適用するためにオリジンを使用します。これはフィッシングやクロスサイト攻撃を防ぐために不可欠です。WebAuthn の登録と認証プロセス中、オリジンはブラウザーと認証器によって厳密に検証されます。
- Origins: リクエストが異なるオリジンから来る可能性がある場合は、Origin プロパティを使用して追加のオリジンを設定します。例: リクエストが login.test.com と www.test.co.uk から来る可能性がある場合は、Origins プロパティに https://login.test.com と https://www.test.co.uk の値を設定します。
- TopOrigins: 通常、WebAuthn は呼び出しフレームのオリジン(navigator.credentials.create() または navigator.credentials.get() を呼び出すもの)に依存します。しかし、Web ページは異なるオリジンから来る可能性のある iframe に埋め込まれることがあります。これにより、悪用やクリックジャッキング型の攻撃の可能性が生じます。これを軽減するために、WebAuthn レベル 2 の仕様では TopOrigins を定義できる TopOrigin を導入しています。
WebAuthn では、crossOrigin はトップレベルのブラウジングコンテキストとは異なるオリジンから埋め込まれた iframe などのクロスオリジンコンテキストから WebAuthn 操作が実行されているかどうかを示すブール値パラメーターです。
このパラメータは、埋め込み環境での認証リクエストをブラウザおよびオーセンティケーターが安全に処理できるよう支援するために導入されました。これは最新のWebアプリケーションにおける一般的なシナリオです。
- AllowCrossOrigins: true の場合、クロスオリジン iframe(例: https://app.example.org のページに埋め込まれた https://auth.example.com の iframe)からのリクエストが許可されることを示します。デフォルトでは無効です。
WebAuthn は、公開鍵資格情報の生成と検証のためにさまざまな暗号アルゴリズムをサポートしています。これらのアルゴリズムは、資格情報の登録(navigator.credentials.create())と認証(navigator.credentials.get())の際に使用され、非対称鍵ペアを用いてチャレンジの安全な署名と検証を保証します。サーバーはデフォルトで最も一般的なアルゴリズムである ES256 と RS256 で設定されています。Algorithms プロパティからサポートするアルゴリズムをいつでも変更できます。以下のアルゴリズムがサポートされています。
- ES256
- ES384
- ES512
- RS256
- RS384
- RS512
- PS256
- PS384
- PS512
- RS1
- EdDSA
WebAuthn において、証明書はオプションのメカニズムで、資格情報の作成時に認証器(デバイスやセキュリティキーなど)がメーカー、モデル、セキュリティ特性に関する情報を提供できるようにします。この情報は依拠当事者(RP)が認証器を信頼するかどうかを判断するのに役立ちます。
異なるアテステーション形式は、このデータの構造化と検証方法を定義します。一般的に使用される 3 つの形式は android-key、packed、およびその他(fido-u2f、apple、none)です。デフォルトでは、すべてのアテステーション形式が有効になっています。サポートされているアテステーション形式のリストは以下を参照してください:
- NoneAttestation: この場合、アテステーションデータは返されません。デバイス識別子の公開を避けることでユーザーのプライバシーを優先します。デバイスの出所を気にしないアプリケーションでよく使われます。
- PackedAttestation: 多くの認証器が使用する柔軟でコンパクトなフォーマットです。認証器はアテステーション証明書と署名を返します。完全アテステーション: ベンダー提供のキーと証明書で署名されたもの、または 自己アテステーション: 資格情報の秘密鍵を使用して署名されたものがあります。さまざまなプラットフォーム(例: YubiKey、Windows Hello)で最も広く使用されています。
- TPMAttestation: トラステッドプラットフォームモジュール(TPM)を搭載したデバイスで使用されます。アテステーションは TPM のキーを使用して署名され、証明書チェーンが含まれます。TPM チップを搭載したエンタープライズデスクトップ/ノートパソコン(例:Windows マシン)で使用されます。
- AndroidKeyAttestation: Android Keystore を使用する Android デバイスで使用されます。キーはハードウェアで生成され、証明書にはデバイスメーカーが発行した証明書チェーンによって署名された情報が含まれます。ハードウェアバックのキーストア(TEE または StrongBox)を持つ Android 携帯電話で使用されます。
- AppleAttestation: Touch ID や Face ID などの Apple プラットフォーム認証器で使用されます。アテステーションは Apple の内部 API によって生成され、特別な証明書形式が含まれます。Apple バイオメトリクスを使用した Safari で使用されます。
- FidoU2FAttestation: FIDO U2F 認証器が使用するレガシーアテステーションフォーマット。U2F 互換の証明書と署名を返します。FIDO U2F をサポートする古いセキュリティキー(初期の YubiKey など)で使用されます。
WebAuthn APIにおいて、AllowCredentialsは認証プロセス中(navigator.credentials.get()経由)に使用されるオプションフィールドです。これは、特定のRelying Party(RP)に対してユーザーの認証を許可される資格情報IDのリストを指定します。このメカニズムにより、RPはログイン試行に対してどの資格情報を有効と見なすかを制御できます。credentialsプロパティには次のフィールドがあります:
- AllowCredentials: 有効にすると(デフォルトは false)、ユーザーの認証が許可されたクレデンシャル ID のリストを指定します
- ExcludeCredentials: ユーザー名を指定すると、サーバーコンポーネントに既に保存されているすべての既存の認証情報を表示します。
- Limit: ExcludeCredentials が true の場合に送信される認証情報の最大数。
WebAuthn プロトコル
- WebAuthn 登録: サーバーはチャレンジを生成してクライアントに送信し、クライアントは認証器(セキュリティキーや生体認証デバイスなど)を使用して鍵ペアを作成します。公開鍵は送り返され、将来の認証のためにサーバーに保存されます。登録フローのイベントの詳細については以下を参照してください:
- WebAuthn 認証: サーバーはクライアントにチャレンジを送信し、クライアントはオーセンティケーターに保存されている以前に登録した秘密鍵を使用してそれに署名します。署名されたレスポンスは、サーバーが保存している公開鍵を使用して検証され、ユーザーの身元が確認されます。認証フローのイベントに関する詳細は以下をご覧ください:
- MDS: FIDO Alliance Metadata Service (MDS)は、認証器のアテステーションを検証し、デバイスモデルの真正性を証明するためにリライングパーティが使用するMetadata Statementの集中リポジトリです。

- 認可: クライアントは認証フロー中にサーバーからベアラートークンをリクエストできます。このトークンは後でパスキーを使用してログインせずに新しい WebSocket または HTTP 接続を開くために使用できます。