TsgcWebSocketClient › 属性 › TLSOptions
配置 TLS 启用时使用的证书、TLS 版本、ALPN、IOHandler 及其他安全连接详情。
property TLSOptions: TsgcWSTLS_Options read FTLSOptions write SetTLSOptions;
Preset=tlspCustom
仅当 TLS 为 True 时可访问。子属性包括 RootCertFile、CertFile、KeyFile、Password、VerifyCertificate、VerifyDepth、Version(从 tlsUndefined 到 tls1_3)、ALPNProtocols 和 IOHandler(iohOpenSSL、iohSChannel、iohAndroidTLS、iohAppleTLS 或 iohNativeTLS)。在 Android 上,iohAndroidTLS 使用平台原生 TLS(javax.net.ssl.SSLEngine),在 iOS 和 macOS 上,iohAppleTLS 使用 Apple 原生 TLS,因此无需部署 OpenSSL 库;原生平台 TLS 需要 Enterprise 版本。OpenSSL 特定的设置位于 OpenSSL_Options 下,SChannel 特定的设置位于 SChannel_Options 下。
VerifyCertificate 对每种 IOHandler(包括 iohSChannel)的证书验证方式相同:其默认值为 False,因此在设置为 True 之前,服务器提供的自签名、已过期或主机名不匹配的证书都会被接受而不会发出任何警告。使用 SChannel 时,验证将针对 Windows 证书存储进行;OnSChannelVerifyPeer 允许应用程序检查证书链,或接受原本会被拒绝的证书。
VerifyCertificate 完全无法说明证书自颁发以来是否已被吊销,因此私钥被窃取后,其证书虽已被吊销但尚未过期,仍然能够通过身份验证。使用 iohSChannel 时,只有将 SChannel_Options.Revocation.Check 设置为 scrcDisabled(默认值)以外的值,才会检查吊销状态:scrcEndCertificate 仅检查服务器证书,scrcChainExcludeRoot 会连同中间证书一起检查,而 scrcChain 还包括根证书。Revocation.Timeout 限制整个 CRL 和 OCSP 获取过程的时间(默认为 5000 毫秒),使无法连接的响应方不会拖住握手过程;Revocation.CacheOnly 仅使用 Windows 已缓存的数据,绝不访问网络;Revocation.IgnoreRevocationOffline 和 Revocation.IgnoreNoRevocationCheck(两者均为 True)则决定是否接受无法连接响应方的情况,或接受未发布任何吊销信息的证书。已确认被吊销的证书始终会被拒绝。请参阅 SChannel Certificate Revocation。
Preset 通过一次赋值应用一组安全默认值。使用 tlspCustom(默认值)时,每个选项都保持您手动配置的值,从而保留以前的行为。设置 Preset := tlspSecureDefaults 会启用证书验证(VerifyCertificate := True),仅当 Version 被设为 tls1_0 或 tls1_1 时才将其提升到 TLS 1.2(tlsUndefined 保持不变,因此 TLS 1.3 仍然可用),当 OpenSSL_Options.VersionMin 和 SChannel_Options.VersionMin 较低或未定义时将它们设为 tls1_2,并启用对服务器证书的主机名检查(OpenSSL X509Checks 主机名验证),同时将 SChannel 吊销检查启用为 scrcChainExcludeRoot。应用预设后,仍可以单独调整各个选项。
IOHandler 还接受 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 风格以冒号分隔,列表留空则保留引擎的默认值。
对于原生引擎,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(默认为 False)会额外加入操作系统信任的证书:Windows 的 ROOT 证书存储、macOS 上 Security.framework 的锚点证书(以 /etc/ssl/cert.pem 作为后备)、iOS 上由 Security.framework 对对端证书链进行的评估、Android 上的 Conscrypt 或 /system/etc/security/cacerts 目录,以及 Linux 上六个标准位置中第一个存在的 CA 证书包文件,从 /etc/ssl/certs/ca-certificates.crt 开始。当找不到系统根证书时,VerifyCertificate := True 需要一个根证书文件。CertFile 也可以是一个 .pfx 或 .p12 文件,以 Password 打开。该引擎通过 TLS 1.3 和 TLS 1.2 的会话票据恢复会话,票据保存在组件自身的会话缓存中,因此重新连接会跳过完整握手。NativeTLS_Options.SessionTickets(默认值为 True)用于开启该功能,TLS 1.2 的会话恢复要求服务器支持扩展主密钥。它不发送 0-RTT 数据,也不会触发 OnSSLVerifyPeer,该事件属于 OpenSSL 处理器。若要固定证书必须携带的名称,请设置 OpenSSL_Options.X509Checks.HostName 或 IPAddress,原生引擎同样会读取它们。请参阅 原生 TLS。
oClient := TsgcWebSocketClient.Create(nil);
oClient.URL := 'wss://www.esegece.com:2053';
oClient.TLSOptions.Version := tls1_2;
oClient.TLSOptions.VerifyCertificate := true;
oClient.TLSOptions.RootCertFile := 'cacert.pem';
oClient.Active := true;