服务器 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,请启用此选项。
Revocation.Check 对客户端证书链中的哪些部分查询吊销状态:scrcDisabled(默认值)、scrcEndCertificate、scrcChainExcludeRoot 或 scrcChain。
Revocation.Timeout 整个 CRL 和 OCSP 获取过程所允许的毫秒数,而不是每个 URL 的毫秒数。默认值为 5000。值为零时将沿用 Windows 的默认值,而该值可能长得多。
Revocation.CacheOnly 当为 True 时,仅使用 Windows 已缓存的吊销数据,握手过程绝不会访问网络。默认值为 False。
Revocation.IgnoreRevocationOffline 在无法连接响应方时接受该客户端证书,即软失败行为。默认值为 True。设置为 False 则改为拒绝。
Revocation.IgnoreNoRevocationCheck 接受未发布 CRL 分发点和 OCSP 响应方的客户端证书。默认值为 True。

此外,通用 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 := TsgcWebSocketServer.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 := TsgcWebSocketServer.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 版本,但如有需要,您也可以强制启用传统模式。

客户端证书吊销

当服务器验证客户端证书时(SSLOptions.VerifyCertificate 设置为 True), SChannel_Options.Revocation 子属性决定是否还要根据客户端出示的证书所指定的 CRL 分发点或 OCSP 响应方对其进行检查。吊销检查默认处于禁用状态。有关每项设置的完整说明,请参阅 服务器 SSL | SChannel 客户端证书吊销

相对于 OpenSSL 的优势

注意事项