WebAuthn4J は、登録と認証のレスポンス(あらゆる形式のアテステーションステートメント、COSE 鍵、フラグ、カウンター、署名)を検証し、オプションの構築はリライングパーティに任せます。Spring Security と Keycloak は内部でこのライブラリを使っています。0.31.11 は Jackson 3(tools.jackson.*)に依存しているため、アプリケーション自身の JSON 処理にまだ Jackson 2 の com.fasterxml.jackson を使っている場合は注意が必要です。また、API には JetBrains の @NotNull アノテーションが付いており、単一ファイルの java ランチャーでコンパイルすると、org.jetbrains:annotations をクラスパスに追加するまで失敗しました。
設定し忘れるようなユーザー検証のデフォルトポリシーはありません。RegistrationParameters と AuthenticationParameters は、userVerificationRequired と userPresenceRequired を必須の引数として受け取ります。チェックでは、UV フラグが立っていない登録とアサーションは、false を渡すと検証を通り、true を渡すと UserNotVerifiedException で失敗しました。サンプルのように、この値はオプションで送る userVerification と一致させてください。
署名は ASN.1 DER でなければなりません。64 バイトの生の r‖s 形式のアサーション署名は BadSignatureException: Assertion signature is not valid. で失敗し、high-S の DER 署名は検証を通りました。保存済みの値より小さいカウンターは MaliciousCounterValueException: Malicious counter value is detected. Cloned authenticators exist in parallel. でログインを失敗させます。一方、同期パスキーが報告するように常に 0 のままのカウンターは通過します。Ed25519 の認証情報は、登録から認証まで一通り検証できました。
createNonStrictWebAuthnManager() は、どのアテステーションステートメントもトラストアンカーと照合せずに受け入れます。アテステーション none を要求する場合はこれで正しいのですが、アテステーションをポリシーで判断する場合は誤りです。その場合はトラストアンカーを設定し、厳格なマネージャーを使ってください。
WebAuthn インスペクターはブラウザーが送信する内容をデコードし、AAGUID 検索はアテステーションポリシーのために認証器の機種を特定します。