TsgcWebSocketLoadBalancerServer › Properties › SSLOptions
保存负载均衡器 TLS 侦听器的证书路径、TLS 版本选择和 OpenSSL 调优参数。
property SSLOptions: TsgcWSSSL_Options read FSSLOptions write SetSSLOptions;
Version=tlsUndefined,VerifyCertificate=False
在激活负载均衡器且 SSL 为 True 之前提供证书材料:RootCertFile、CertFile 和 KeyFile 指向 PEM 文件(当文件包含完整证书链时,三者使用相同路径),仅当私钥已加密时才需要 Password。将 VerifyCertificate 设为 True 可请求并验证客户端证书(子选项 FailIfNoCertificate 和 VerifyClientOnce 细化检查方式),VerifyDepth 控制证书链长度;当注册的后端必须提供客户端证书以进行双向 TLS 认证时,此功能非常有用。Version 选择特定的 TLS 版本(tls1_0、tls1_1、tls1_2、tls1_3)或保持协商开放(tlsUndefined)。使用 iohNativeTLS 时,它表示允许的最低版本,见下文。OpenSSL_Options 公开底层旋钮:APIVersion(oslAPI_1_0/oslAPI_1_1/oslAPI_3_0)、LibPath/LibPathCustom、UnixSymLinks、ECDHE、CipherList、CurveList、VersionMin 和 X509Checks。
IOHandler 用于选择 TLS 引擎。iohOpenSSL 是默认值,iohSChannel 使用 Windows 提供程序。iohNativeTLS 选择的是 sgcCrypto 包中用纯 Object Pascal 实现的 TLS 引擎,可同时使用 TLS 1.3 和 TLS 1.2:不会加载任何 OpenSSL 库,并在 TLS 1.3 中提供 RFC 10024 的混合后量子密钥交换组,其中 X25519MLKEM768 排在最前。它的两个偏好列表是 NativeTLS_Options.Groups 和 NativeTLS_Options.CipherSuites,采用 OpenSSL 风格以冒号分隔,列表留空则保留引擎的默认值。该引擎在经典的每连接一线程引擎上运行,也同样能在 IOCP 和 EPOLL 引擎上运行。iohAppleTLS 和 iohAndroidTLS 是仅限客户端的处理器:服务器若使用其中之一,会在 Active 设为 True 时引发异常,除非 OnSSLGetHandler 提供了自己的处理器。请改用 iohNativeTLS、iohOpenSSL,或在 Windows 上使用 iohSChannel。
对于原生引擎,Version 表示允许的最低版本,而不像 iohOpenSSL 那样表示确切版本。tlsUndefined(默认值)和 tls1_2 接受 TLS 1.3 和 TLS 1.2,tls1_3 只接受 TLS 1.3,而 tls1_0 或 tls1_1 会在服务器启动时引发配置错误,因为该引擎只支持 TLS 1.2 和 TLS 1.3。要仅接受 TLS 1.2,请在 NativeTLS_Options.CipherSuites 中只列出 TLS 1.2 的套件,例如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。该引擎依据 RootCertFile 中的根证书验证客户端证书,当 NativeTLS_Options.UseSystemRoots 为 True(默认为 False)时,还会加上操作系统信任的证书。使用 iohNativeTLS 时,CertFile 也可以是一个 .pfx 或 .p12 文件,其中保存证书、证书链和密钥,以 Password 打开。该引擎通过 TLS 1.3 和 TLS 1.2 的会话票据恢复会话:NativeTLS_Options.SessionTickets(默认值为 True)用于开启该功能,NativeTLS_Options.TicketLifetime(默认值为 7200 秒)设定票据可使用的时长。TLS 1.2 的会话恢复要求客户端支持扩展主密钥。它不接受 0-RTT,也不会触发 OnSSLVerifyPeer,该事件属于 OpenSSL 处理器。VerifyCertificate 会向客户端索取证书并进行验证,VerifyCertificate_Options.FailIfNoCertificate 会拒绝不提供证书的客户端,而 VerifyClientOnce 不起作用,因为该引擎从不重新协商。请参阅 原生 TLS。
oServer := TsgcWebSocketLoadBalancerServer.Create(nil);
oServer.SSL := true;
oServer.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.Version := tls1_3;
oServer.SSLOptions.OpenSSL_Options.VersionMin := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Active := true;