WebAuthn4J 验证注册响应和身份验证响应——包括所有格式的证明声明、COSE 密钥、标志、计数器和签名——而构建选项的工作留给依赖方。Spring Security 和 Keycloak 在底层使用它。0.31.11 依赖 Jackson 3(tools.jackson.*),如果你的应用自身处理 JSON 时仍在使用 Jackson 2 的 com.fasterxml.jackson,就需要注意这一点;它的 API 还带有 JetBrains 的 @NotNull 注解:在把 org.jetbrains:annotations 加入类路径之前,用单文件 java 启动器针对它编译一直失败。
不存在可能被遗忘的默认用户验证策略: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 查询则能识别认证器型号,供制定证明策略时使用。