每一位交付过 TLS 的 Delphi 开发者都熟悉这套流程。这台机器上装的是哪个版本的 OpenSSL。为什么客户的服务器上是 1.1,而构建机上却是 3.0。可执行文件旁边该放哪两个 DLL,以及杀毒软件删掉其中一个之后会发生什么。sgcWebSockets 2026.10 提供了一条出路:一个用 Object Pascal 编写的 TLS 1.3 引擎,内置于库中,不需要任何 DLL。
这是一个真正的实现,而不是一层封装:握手、记录层、密钥调度和证书校验全部都是 Pascal 代码。客户端或服务器无需安装任何东西即可进行 TLS 通信。
一个属性
oClient := TsgcWebSocketClient.Create(nil);
oClient.URL := 'wss://www.esegece.com:2053';
oClient.TLSOptions.IOHandler := iohNativeTLS;
oClient.Active := True;
在服务器端,这是 SSLOptions 上同样的开关:
oServer.SSLOptions.IOHandler := iohNativeTLS;
oServer.SSLOptions.CertFile := 'server.pem';
oServer.SSLOptions.KeyFile := 'server.key';
oServer.SSL := True;
ALPN、S N I 和客户端证书都已具备,无论是在 Indy handler 上,还是在 I O C P 和 E P O L L 服务器上。你的代码其余部分不需要任何改动。
信任机器已经信任的东西
一个 TLS 客户端的可靠程度,取决于它的信任锚点,而分发一份会逐渐过期的 cacert.pem 本身就是一个维护负担。该引擎可以使用操作系统已经信任的根证书:
oClient.TLSOptions.NativeTLS_Options.UseSystemRoots := True;
在 Windows 上,它们来自 ROOT 系统证书存储;在 Linux 和 Android 上,则来自在常见位置中找到的第一个证书包。此选项默认关闭,这样信任锚点就完全由 RootCertFile 决定。
今天就用后量子,是为了明天
一个今天无法破解你 TLS 会话的攻击者,仍然可以把它录下来留存。真正值得思考的问题不是量子计算机现在是否存在,而是你的流量还要保持多久的敏感性。这正是 TLS 正在转向混合密钥交换的原因:只要两半中的任意一半依然安全,共享密钥就是安全的。
该引擎协商 RFC 10024 的混合分组,而默认的分组列表已经以混合分组开头:
oClient.TLSOptions.NativeTLS_Options.Groups :=
'X25519MLKEM768:SecP256r1MLKEM768:X25519';
三种混合方案分别是 X25519MLKEM768、SecP256r1MLKEM768 和 SecP384r1MLKEM1024。两个列表都使用以冒号分隔的 OpenSSL 风格名称,空值则保留引擎的默认设置。
背后的密码学
同一版本还把后量子原语本身加入了 sgcCrypto 包,全部使用 Object Pascal 实现,不依赖任何外部库:
- ML-KEM(FIPS 203)、ML-DSA(FIPS 204)和 SLH-DSA(FIPS 205),密钥可以按照 RFC 9935、RFC 9881 和 RFC 9909,以 SubjectPublicKeyInfo、seed、expanded 和 both 形式的 PKCS#8,以及 PEM 格式进行读写。
- X-Wing,将 X25519 与 ML-KEM-768 配对的混合密钥封装方案。
- 带有后量子密钥的 X.509 证书和证书请求,包括由后量子证书颁发机构签发证书。
- 使用 ML-DSA-44、ML-DSA-65 和 ML-DSA-87(即 RFC 9964 的算法)签名和验证的 JWT。
它们都通过了 NIST 已知答案向量的验证,而这些向量作为一套测试集随库一同发布,而不仅仅是一句声明。
无需你开口的加固
同一批改动还加固了经典算法一侧,以抵御时序攻击。RSA 私钥运算使用了盲化技术和带结果校验的恒定时间幂运算,椭圆曲线标量乘法和 Ed25519 签名都以恒定时间运行,AES 和 GHASH 也不再用秘密字节去索引表。私钥在导入时会被检查,因此一个与其证书不匹配的密钥会被拒绝,而不是继续生成没人能验证的签名;ASN.1 编码不是最小 DER 的签名现在也会被拒绝,而不是被接受。
该在何时使用哪一个
OpenSSL 和 SChannel 都不会消失,对很多应用来说它们依然是正确的选择:如果你需要与某个老旧系统的 TLS 1.2 互操作,就用 OpenSSL;如果客户的策略是密码学必须由 Windows 掌控,就用 SChannel。原生引擎适用于部署本身就是难题的场景:单个可执行文件,旁边不需要任何 DLL,在 Windows 和 Linux 上行为一致,并且无需等平台跟上就能使用后量子密钥交换。
升级
该引擎是 sgcCrypto 包的一部分,按组件单独选择,因此在你设置 IOHandler 之前不会有任何变化。如果构建时没有包含加密相关的 unit,组件会给出一条清晰的提示信息,而不是在握手阶段以隐晦的方式失败。
延伸阅读
观看视频
关于此功能的简短视频发布在eSeGeCe 频道上。
有问题、反馈,或需要迁移方面的帮助?欢迎联系我们 — 你会收到编写这些代码的人的回复。
