服务器 SSL | Indy 服务器的 SChannel

基于 Indy 的服务器组件(TsgcWebSocketServerTsgcWebSocketHTTPServer)可以使用 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. 使用下面描述的两种方法之一配置证书。

SChannel_Options 属性

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 属性 CertFilePassword 在从 PFX 文件加载证书时使用。

来自 Windows 存储的证书

如果证书已安装在 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(.pfx 或 .p12)证书文件,请在 SSLOptions 上设置 CertFilePassword 属性。 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

TLS 版本

使用 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 版本,但如有需要,您也可以强制启用传统模式。

相对于 OpenSSL 的优势

注意事项