基于 Indy 的服务器组件(TsgcWebSocketServer、 TsgcWebSocketHTTPServer)可以使用 Windows SChannel(安全通道) 作为 TLS 提供程序,而非 OpenSSL。SChannel 是 Windows 原生的 TLS 实现,无需任何外部 DLL。
当服务器组件启用了 SSL 且 IOHandler 设置为 iohSChannel 时,服务器会创建一个 TsgcIdServerIOHandlerSSLSChannel 实例,使用 Windows SChannel API 处理所有 TLS 操作。对于每一个传入的客户端连接,服务器通过 SChannel 提供程序执行 TLS 握手,协商协议版本、密码套件,并绑定已配置的证书。
SChannel 从 Windows 证书存储或 PFX 文件(.pfx / .p12)读取证书。无需 PEM 文件,也无需部署 OpenSSL 库。
要在 Indy 服务器上启用 SChannel,请配置以下属性:
1. 将 SSL 属性设置为 True。
2. 将 SSLOptions.IOHandler 设置为 iohSChannel。
3. 将 SSLOptions.Version 设置为所需的 TLS 版本(tls1_2、tls1_3 等)。
4. 将 SSLOptions.Port 设置为用于安全连接的端口。
5. 使用下面描述的两种方法之一配置证书。
SSLOptions.SChannel_Options 子属性公开了 SChannel 专用设置:
| 属性 | 描述 |
| CertHash | 安装在 Windows 证书存储中的证书指纹(十六进制哈希值)。 |
| CertStoreName | 要搜索的证书存储:scsnMY(个人)、scsnRoot、scsnTrust、scsnCA。 |
| CertStorePath | 存储位置:scspStoreLocalMachine 或 scspStoreCurrentUser。 |
| CipherList | 可选的冒号分隔加密算法列表(例如 CALG_AES_256:CALG_AES_128)。留空则使用系统默认值。 |
| UseLegacyCredentials | 当为 True 时,使用旧版 SCHANNEL_CRED 结构代替 SCH_CREDENTIALS。对于不支持更新 API 的旧版 Windows,请启用此选项。 |
此外,通用 SSLOptions 属性 CertFile 和 Password 在从 PFX 文件加载证书时使用。
如果证书已安装在 Windows 证书存储中, 请提供证书 指纹 并指明其所在位置。
要查找指纹,请打开 PowerShell 并运行:
dir cert:\localmachine\my
Thumbprint 列显示您所需的十六进制哈希值。
Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my
Thumbprint Subject
---------- -------
C12A8FC8AE668F866B48F23E753C93D357E9BE10 CN=*.mydomain.com
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
oServer.SSLOptions.SChannel_Options.CertHash := 'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
oServer.Active := True;
如果您有 PFX(.pfx 或 .p12)证书文件,请在 SSLOptions 上设置 CertFile 和 Password 属性。 SChannel 将在启动时导入证书。
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
oServer.SSLOptions.CertFile := 'c:\certificates\server.pfx';
oServer.SSLOptions.Password := 'mypassword';
oServer.Active := True;
如果您有 PEM 证书和私钥,请先使用 OpenSSL 将其转换为 PFX 格式:
openssl pkcs12 -inkey server.key -in server.crt -export -out server.pfx
使用 SSLOptions.Version 属性控制服务器接受的 TLS 版本:
| 值 | 描述 |
| tls1_0 | TLS 1.0(不推荐) |
| tls1_1 | TLS 1.1 |
| tls1_2 | TLS 1.2(推荐) |
| tls1_3 | TLS 1.3 |
| tlsUndefined | 接受 TLS 1.0、1.1 和 1.2 |
默认情况下,SChannel 使用系统密码配置。您可以通过将 SChannel_Options.CipherList 设置为以冒号分隔的算法名称列表来限制允许的密码,例如:
CALG_AES_256:CALG_AES_128
将此属性留空以使用 Windows 默认值。
Windows Server 2019 及更早版本可能不支持较新的 SCH_CREDENTIALS API。如果服务器无法在较旧的 Windows 版本上启动,请将 SChannel_Options.UseLegacyCredentials 设置为 True 以改用旧版 SCHANNEL_CRED 结构。
该组件在大多数情况下会自动检测 Windows 版本,但如有需要,您也可以强制启用传统模式。