TsgcWSAPIServer_WebAuthn 组件提供了一个简单而强大的解决方案,用于实现 WebAuthn 依赖方服务器,在 Web 应用程序中实现无密码身份验证。一个 WebAuthn 应用程序由一个处理服务器端注册和身份验证的 WebAuthn 服务器,以及通常是 JavaScript 应用程序的客户端应用程序组成。
WebAuthn 要求使用安全连接(SSL/TLS),因此必须部署 OpenSSL 库并在服务器上进行配置。
仅支持 OpenSSL 3.0.0+ API,因此之前的 OpenSSL 版本可能无法正常工作。
配置
TsgcWSAPIServer_WebAuthn 必须使用 Server 属性附加到 HTTP 服务器,即 TsgcWebSocketHTTP_Server 或 TsgcWebSocketServer_HTTPAPI。您可以配置处理注册和身份验证选项的服务器端点,以及 WebAuthn 选项(如支持的算法、来源等)。
端点选项
在此处您可以配置处理 HTTP/JavaScript 请求的服务器端点,以使用 WebAuthn 作为验证器。该组件已配置默认端点,但您可以更改所有端点以满足您的需求。
- AuthenticationOptions:默认为 /sgcWebAuthn/Authentication/Options
- AuthenticationVerify: 默认为 /sgcWebAuthn/Authentication/Verify
- RegistrationOptions:默认为 /sgcWebAuthn/Registration/Options
- RegistrationVerify: 默认为 /sgcWebAuthn/Registration/Verify
- Webauthn:包含默认使用的 JavaScript 库。您可以禁用此属性并使用您自己的 WebAuthn 库。
- 测试:默认情况下禁用,仅用于测试 WebAuthn 功能。
示例:如果您的服务器正在监听域 www.test.com,则默认情况下,身份验证选项请求将为 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() 的帧)。然而,网页可以嵌入在 iframe 中,该 iframe 可能来自与顶级页面不同的来源。这为滥用或点击劫持式攻击提供了可能性。为缓解此问题,WebAuthn Level 2 规范引入了 TopOrigin,您可以在其中定义 TopOrigins。
在 WebAuthn 中,crossOrigin 是一个布尔参数,指示 WebAuthn 操作是否在跨源上下文中执行,例如嵌入在与顶级浏览上下文不同源的 iframe 中。
引入此参数是为了帮助浏览器和身份验证器在嵌入式环境中安全处理身份验证请求。
- 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)决定是否信任该验证器。
不同的认证格式定义了此数据的结构和验证方式。三种常用格式为 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:由 Apple 平台身份验证器(如 Touch ID 和 Face ID)使用。证明由 Apple 内部 API 生成,包含特殊证书格式。在使用 Apple 生物特征的 Safari 上使用。
- FidoU2FAttestation:FIDO U2F 认证器使用的旧版证明格式。返回兼容 U2F 的证书和签名。用于支持 FIDO U2F 的较旧安全密钥(例如早期 YubiKeys)。
在 WebAuthn API 中,AllowCredentials 是身份验证过程(通过 navigator.credentials.get())中使用的可选字段。它指定允许对特定依赖方(RP)进行用户身份验证的凭据 ID 列表。此机制允许 RP 控制哪些凭据被视为有效的登录尝试。credentials 属性包含以下字段:
- AllowCredentials:若启用(默认为 false),则指定允许对用户进行身份验证的凭据 ID 列表
- ExcludeCredentials:给定用户名,显示服务器组件中已存储的所有现有凭据。
- Limit: ExcludeCredentials 为 true 时将发送的最大凭据数量。
WebAuthn 协议
- WebAuthn 注册:服务器生成一个挑战并将其发送给客户端,客户端使用验证器(例如安全密钥或生物特征设备)创建密钥对。公钥被发回并由服务器存储,用于将来的认证。以下是有关注册流程事件的更多信息:
- WebAuthn 身份验证:服务器向客户端发送一个挑战值,客户端使用存储在验证器中、之前注册的私钥对其进行签名。服务器使用存储的公钥验证签名响应,从而确认用户身份。以下是有关身份验证流程事件的更多信息:
- MDS:FIDO 联盟元数据服务(MDS)是元数据声明的集中式存储库,供依赖方用于验证身份验证器证明并证明设备型号的真实性。

- 授权:客户端可以在身份验证流程中向服务器请求承载令牌。此令牌可在以后用于打开新的 WebSocket 或 HTTP 连接,而无需使用通行密钥再次登录。