立即处理可能影响正在运行的系统已审查 build 2.4.17190 至 2.4.17208 的全部 19 个 non-merge commit:11 个非版本文件新增 1176 行、删除 372 行。忽略 mormot.commit.inc 与 mormot.commit-num.inc 的纯版本变更。raw payload 没有 superseded_by,因此 avoid 与 still_moving 为空;最终 upstream head 仍与 payload head 一致。
SChannel 默认启用 TLS 1.3,Windows CNG 支持完成整合
这一以 Windows 为主的系列更改了 SChannel 默认协议策略,在已接受的 HTTPS 连接间共享服务器 credentials,并新增大量 CNG、certificate store 与 msLAPS 支持。最终提交还修复 Delphi 7/13 编译问题、避开 Wine 的 CNG stub,并纠正证书私钥 ownership。
要点
- 应采用 build 2.4.17208 的 18e7d88c0083b279402c59019c030abdfe39e3e1。
- SChannelEnableTls13 在 Windows 11 与 Windows Server 2022 及以上版本默认变为 true;若不准备启用,应在初始化前设为 false。
- 使用 SChannel 的 HTTPS 服务器现在只获取一份共享 server credential,并保持到最后一个已接受 TLS context 释放。
- TNetTlsContext 可向 SChannel 提供 PCCERT_CONTEXT 或受密码保护的 PFX,ReleaseBuffers 也可释放空闲 SChannel buffer。
- 新的 TNCrypt、TWinCertStore 与 TWinCertCngKey wrapper 提供 CNG key、certificate store、签名、secret unprotection 与 msLAPS 解密。
- Wine 会跳过其 CNG stub 层,Delphi 7 与 Delphi 13 则得到明确的编译修复。
升级建议
Windows SChannel 用户应完整升级至 build 2.4.17208,并测试 TLS 1.3 协商、证书/PFX 加载及并发服务器关闭。仅当新默认值尚不可接受时,才在 TLS 初始化前将 SChannelEnableTls13 设为 false。Delphi 7、Delphi 13 与 Wine 用户不应停在最终兼容修复之前。
19 条中的 19 条 · 上游 19 次提交
1
高
TLS 1.3 成为当前 Windows 上的 SChannel 默认值
公开全局变量 SChannelEnableTls13 的默认值由 false 改为 true;仅作用于 Windows 11、Windows Server 2022 及以上版本,仍可选择关闭。
破坏性变更
mormot.net.sock
f479106f+6-5
net: now SChannelEnableTls13 default is true
影响
符合条件的 SChannel client/server 可能在不改代码的情况下协商 TLS 1.3,因此重新构建后协议行为会静默变化。
值得一看
测试 handshake、cipher policy 与 peer 兼容性;若需推迟启用,请在 TLS 初始化前设 SChannelEnableTls13 := false。
公开 API
SChannelEnableTls13behaviour-changed — 在受支持 Windows 版本上默认值现为 true。
2
高
Crypt32 扩展后的证书 record 布局得到修正
Crypt32 类型移入 mormot.core.os.security,并修正 pointer、blob 与 record 声明,使 mormot.lib.sspi 能够编译。
修复
mormot.core.os.security+1
d73d5445+14-8
lib: fixed mormot.lib.sspi compilation
影响
该提交修复紧邻的 Windows binding 变更;Delphi 与 FPC 项目不应单独采用之前的中间 revision。
建议升级
应与前一个 Crypt32 binding 提交一起采用,或直接使用本期最终 head。
3
高
PRISM 上的 SChannel 证书 key ownership 得到修正
TSChannelNetTls.AfterBind 不再请求 CRYPT_ACQUIRE_CACHE_FLAG,为每个证书初始化 ownership 输出,并在调用方拥有句柄时释放 CAPI/CNG handle。
修复
mormot.core.os.security+1
86828b99+12-3
net: fixed TSChannelNetTls.AfterBind on PRISM
影响
SChannel 服务器 setup 避免陈旧输出状态与私钥 handle 泄漏,包括 PRISM target;无需源码迁移。
建议升级
绑定证书私钥的 Windows SChannel 服务器应升级并重测 shutdown/rebind 路径。
4
高
新增 flag 后 logging serialization 与 SChannel accept 恢复编译
新增 wsWeakCng 后,mormot.core.log 中 TWindowsSpecs serialization 由 byte 扩为 word;SChannel accept 路径先将共享 context 存入 TObject 局部变量再 cast。
修复
mormot.core.log+1
37405644+9-6
core: fixed compilation after previous commits
影响
该提交修复此前 Windows-spec 与 shared-context 变更引入的编译问题;无需修改应用源码。
建议升级
采用 Wine flag 与 SChannel 共享 context 时应同时包含此编译修复。
5
高
SChannel 支持证书 context 与密码保护的 PFX 输入
SChannel 后端为服务器证书实现 TNetTlsContext.CertificateRaw、PrivatePassword 与 OnPrivatePassword,实现 ReleaseBuffers,验证可访问私钥,并明确拒绝尚不支持的 ClientCertificateAuthentication。
新功能
mormot.lib.sspi+2
3f0914a0+76-31
net: enhanced SChannel TLS layer
影响
Windows 服务器无需 OpenSSL 即可提供现有 PCCERT_CONTEXT 或受保护 PFX;请求 SChannel client-certificate authentication 的配置现在会明确失败。
值得一看
测试证书导入、密码 callback 与空闲 buffer 释放;不要在 SChannel 上启用 ClientCertificateAuthentication。
公开 API
TNetTlsContext.CertificateRawbehaviour-changed — SChannel 服务器现在使用 PCCERT_CONTEXT。TNetTlsContext.PrivatePasswordbehaviour-changed — 用作 SChannel PFX 导入密码。TNetTlsContext.OnPrivatePasswordbehaviour-changed — 可覆盖 SChannel PFX 密码。INetTls.ReleaseBuffersbehaviour-changed — SChannel 现在释放空闲读写 buffer。
6
高
certificate-to-CNG-key wrapper 集中处理 ownership 检查
TWinCertCngKey 获取证书私钥,要求 CNG handle,可选比较证书公钥,并按 CryptAcquireCertificatePrivateKey ownership 规则释放;相关常量移入 core Windows security。
新功能
mormot.core.os+3
73dc5e6a+87-20
lib: new TWinCertCngKey wrapper
影响
SChannel 与其他 Windows 后端获得统一的证书 CNG 签名 key 生命周期检查边界,减少泄漏和误用 CAPI handle。
值得一看
成对使用 Init/Done;若必须拒绝证书与 key 不匹配,请启用 CompareKey。
公开 API
TWinCertCngKeyadded — 证书 CNG 私钥的短生命周期检查 wrapper。
7
高
SChannel HTTPS 服务器在连接间共享一份 credential
TSChannelNetTls.AfterBind 创建包含服务器 CredHandle 的 reference-counted TSChannelServerContext;已接受连接共享它,并在各自 security context 释放后才释放。
性能
mormot.net.sock.windows
73798d46+193-140
net: shared credentials for the HTTPS server using SChannel
影响
高负载 Windows HTTPS 服务器避免每连接调用 AcquireCredentialsHandleW,并获得明确的 credential 生命周期顺序;线协议和应用 API 不变。
建议升级
对 SChannel accept/shutdown 周期做负载测试,并确认最后一个活动连接结束后 credential handle 被释放。
8
高
TLS factory 声明恢复 Delphi 7 兼容性
mormot.net.sock 为 NewNetTls 新增公开函数类型 TNewNetTls,并将局部字符常量移到 module scope 以满足 Delphi 7。
编译器与平台
mormot.net.sock
a51ffadf+11-7
net: fixed Delphi 7 compilation
影响
Delphi 7 项目在相关 TLS 变更后恢复编译;其他编译器获得现有 factory 变量的具名类型。
建议升级
Delphi 7 用户应将此修复与完整 SChannel 系列一起采用。
公开 API
TNewNetTlsadded — NewNetTls 使用的新公开函数类型。
9
高
最终 SChannel 证书路径可在 Delphi 13 编译
mormot.net.sock.windows 在将 Context.CertificateRaw 传给 CertDuplicateCertificateContext 时移除显式 PCCERT_CONTEXT cast,以符合 Delphi 13 类型检查。
编译器与平台
mormot.net.sock.windows
18e7d88c+3-4
net: fixed Dlephi 13 compilation
影响
使用新 SChannel CertificateRaw 路径的 Delphi 13 项目可在本期最终 head 编译;runtime 行为不变。
建议升级
Delphi 13 用户应采用此最终提交,不要停在 SChannel 系列的更早点位。
10
中
证书元数据与 CNG 签名细节得到强化
TWinCertInfo 记录 provider type、flags 与 key spec;新增证书枚举 binding;识别 NTE_BAD_PUBLIC_KEY;ECDSA 签名路径将 PKCS#1 algorithm pointer 初始化为 nil。
修复
mormot.core.os+2
6e9ef943+44-15
core: enhanced Windows SSPI/CNG API wrappers
影响
证书使用方可根据 provider 信息选择 CAPI 或 CNG,ECDSA 签名也不再传递未初始化的 padding 元数据。
建议升级
使用新 CNG 签名路径的用户应升级,并验证各目标 provider 的 RSA 与 ECDSA 证书。
公开 API
TWinCertInfo.KeyProviderTypeadded — 公开证书 key provider 类型。TWinCertInfo.KeyProviderFlagsadded — 公开 provider 获取 flags。TWinCertInfo.KeySpecadded — 公开证书 key specification。
11
中
CNG wrapper 补全 property、签名与解密 helper
TNCrypt 新增具名 handle、hash/signing mode、底层 OpenKey/GetProperty/SignHash/Decrypt 操作,以及高层 GetCardinal、GetBuffer、KeyBits、KeyUsage、KeySign 方法。
新功能
mormot.lib.sspi
6a4f0636+250-24
lib: completed CNG API wrapper
影响
Windows 后端可通过带检查的 wrapper 读取和使用 CNG 私钥,包括 RSA PKCS#1/PSS 与 ECDSA 签名;失败时抛出 ENCrypt。
值得一看
明确选择 TNcryptSignMode,检查 provider key usage,并用独立验证器测试签名。
公开 API
TNcryptHashAlgoadded — CNG 签名的公开 hash selector。TNcryptSignModeadded — 公开 RSA/ECDSA 签名模式 selector。TNCrypt.KeySignadded — 高层带检查 CNG 签名 helper。
12
中
Windows certificate store 新增 owning iterator 与 PEM 导出
mormot.core.os.security 新增 TWinCertStore、TWinCertStoreLocation 及 Create/Next/Duplicate/ToPem,并新增 WinCryptBinaryAppendAsText;现有系统 store PEM 收集改用该 wrapper。
新功能
mormot.core.os.security+1
4211be31+155-48
core: new TWinCertStore wrapper and associated raw API
影响
Windows 后端可安全枚举 store、复制需跨迭代存活的 context,并导出 PEM;对象拥有 store 与当前 context。
值得一看
若要在下一次 Next 后继续保留 Context,应先调用 Duplicate,并释放每个 TWinCertStore 实例。
公开 API
TWinCertStoreLocationadded — Windows certificate-store location 的公开 selector。TWinCertStoreadded — 拥有资源的 Windows certificate-store iterator。WinCryptBinaryAppendAsTextadded — 将 Windows 二进制数据追加为 PEM/base64 文本。
13
中
公开的延迟加载 Windows CNG key-storage 层加入 API
mormot.lib.sspi 新增 ENCrypt、TNCrypt 与 NCrypt factory,动态加载 provider、key 创建、property、finalize、delete 与 free 操作。
新功能
mormot.core.os+1
373f69f3+133-3
lib: introducing Windows Cryptography API: Next Generation (CNG) API
影响
Windows 后端无需静态依赖 ncrypt.dll 即可使用 CNG;XP 仍不支持 CNG,调用方必须检查 runtime 可用性。
值得一看
新增 CNG 用法应检查 NCrypt 可用性,并在各受支持 Windows 版本测试 provider/key cleanup。
公开 API
ENCryptadded — 用于 NCrypt/CNG 失败的公开异常。TNCryptadded — 延迟加载的 CNG key-storage wrapper。NCryptadded — CNG wrapper 的全局 factory。
14
中
NCrypt 可解除 secret 保护并解码加密 msLAPS 值
TNCrypt 基于 Windows 8+ 可选保护 API 新增 Unprotect 与 LapsDecrypt;LapsDecrypt 接受 TLdapAttribute.GetRaw 二进制数据并清零临时明文 buffer。
新功能
mormot.lib.sspi
622071a5+108-13
lib: new NCrypt.LapsDecrypt method
影响
Windows 目录管理后端可在进程内解密 msLAPS-EncryptedPassword;不受支持系统或无效数据会抛出 ENCrypt。
值得一看
仅使用 LDAP 原始二进制 attribute,处理 ENCrypt,并尽量缩短返回密码字符串的生命周期。
公开 API
TNCrypt.Unprotectadded — 通过 Windows NCrypt 保护 API 解除数据保护。TNCrypt.LapsDecryptadded — 解码 msLAPS 加密密码 attribute。
15
中
Crypt32 binding 新增自签名证书创建原语
mormot.lib.sspi 声明 CertStrToNameW 与 CertCreateSelfSignCertificate,mormot.core.os 为 CRYPT_E_NOT_FOUND 增加可读错误名。
新功能
mormot.core.os+1
d6d52bf0+20-7
lib: enhanced crypt32.dll WinAPI support
影响
Windows 后端可通过底层 Crypt32 API 构建名称并创建自签名证书 context;现有应用代码不受影响。
公开 API
CertStrToNameWadded — 底层 Crypt32 名称转换声明。CertCreateSelfSignCertificateadded — 底层 Crypt32 自签名证书声明。
16
中
Wine 被标记为不适合调用 CNG
TWindowsSpec 新增 wsWeakCng;Wine 检测设置该标志,InitializeNCrypt 跳过 ncrypt.dll,因为 Wine stub 会报告成功却不执行操作。
编译器与平台
mormot.core.os+1
1d60fd28+15-13
lib: don't try to use CNG on Wine
影响
在 Wine 下运行的 mORMot2 应用不再尝试不可靠的 CNG 操作;原生 Windows 行为不变。
建议升级
Wine 部署若使用依赖 CNG 的新功能,应处理 NCrypt 不可用并提供替代路径。
公开 API
TWindowsSpec.wsWeakCngadded — 标记 CNG API 不可用的 Windows 环境。
17
低
LocalFree 以便于 pointer 使用的签名公开
mormot.core.os 新增公开 LocalFree(pointer): pointer 声明,Windows security 代码移除释放 API buffer 时的 HLOCAL cast。
新功能
mormot.core.os+1
79a03b23+8-5
core: new LocalFree() public function for Windows
影响
Windows 代码可无需 HLOCAL cast 释放 LocalAlloc 系列结果;现有 Delphi/FPC 后端代码保持兼容。
公开 API
LocalFreeadded — 接受并返回 pointer 的公开 Windows 声明。
18
低
Windows CNG 状态码获得可读错误名
WinErrorShort 与 OSErrorShort 识别 CNG 返回的 NTE_* 范围,core 测试套件新增相应覆盖。
编译器与平台
mormot.core.os+1
3c49fdbf+19-5
core: recognize NTE_* errors as returned by CNG Windows API
影响
Delphi/FPC 后端的 CNG 失败会显示诊断名称而非纯数字错误码;其他应用行为不变。