从 sgcWebSockets 2025.4.0 Enterprise 开始,支持 WebAuthn 协议(目前处于 BETA 阶段)。
WebAuthn(Web 身份验证)是由万维网联盟(W3C)和 FIDO 联盟开发的 Web 标准,旨在实现网络上安全的无密码身份验证。它是更广泛的 FIDO2 框架的一部分,旨在减少对传统密码的依赖,而传统密码通常容易受到钓鱼、凭据填充和其他攻击的影响。
WebAuthn 的核心是允许用户使用公钥密码学进行身份验证。用户不再使用用户名和密码,而是向 Web 应用程序(信赖方)注册唯一的公私钥对。私钥安全地存储在认证器上(如硬件安全密钥、智能手机或内置生物识别设备),而公钥存储在服务器上。
在身份验证期间,服务器发出必须由用户私钥签名的挑战。签名的挑战被返回并使用存储的公钥验证,确保响应的完整性和来源。这种方法防止凭据被拦截或重复使用。
WebAuthn 支持多种认证器和设备,使开发人员和用户都具有灵活性。结合 PIN 或生物识别等其他因素时,它还可以实现多因素身份验证(MFA),在不牺牲可用性的情况下显著提高安全性。
支持的认证格式
不同的认证格式定义了这些数据的结构和验证方式。三种常用格式是 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 的旧款安全密钥使用(例如早期的 YubiKey)。
WebAuthn 流程
- WebAuthn 注册:服务器生成挑战并发送给客户端,客户端使用认证器(例如安全密钥或生物识别设备)创建密钥对。公钥被发送回并由服务器存储以供将来身份验证。
- WebAuthn 身份验证:服务器向客户端发送挑战,客户端使用存储在认证器中的先前注册的私钥对其进行签名。服务器使用存储的公钥验证签名响应,以确认用户身份。

WebAuthn 服务器组件
TsgcWSAPIServer_WebAuthn 组件提供了一个简单但强大的解决方案来实现 WebAuthn 信赖方服务器,在您的 Web 应用程序中启用无密码身份验证。WebAuthn 应用程序由处理服务器端注册和身份验证的 WebAuthn 服务器以及通常是 JavaScript 应用程序的客户端应用程序组成。以下是 WebAuthn 服务器的简单配置:
// ... 创建服务器
HTTPServer := TsgcWebSocketHTTPServer.Create(nil);
WebAuthnServer := TsgcWSAPIServer_WebAuthn.Create(nil);
WebAuthnServer.Server := HTTPServer;
// ... 启用测试模式
WebAuthnServer.EndpointsOptions.Test.Enabled := True;
// ... WebAuthn 选项
WebAuthnServer.WebAuthnOptions.RelyingParty := 'localhost';
// ... 绑定
Server.Port := 443;
HTTPServer.SSLOptions.Port := 443;
HTTPServer.Bindings.Clear;
With HTTPServer.Bindings.Add do
begin
Port := 443;
IP := '127.0.0.1';
end;
HTTPServer.SSLOptions.Certificate := 'sgc.pem';
HTTPServer.SSLOptions.KeyFile := 'sgc.pem';
HTTPServer.SSL := True;
// ... 激活
HTTPServer.Active := True;
Delphi WebAuthn 服务器演示
以下 Delphi WebAuthn 演示展示了如何注册新凭据并在之后用于对用户进行身份验证。
