mORMot2 Daily每日上游提交速读

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 用户不应停在最终兼容修复之前。

版本号2.4.17189 → 2.4.17208
提交19
行数+1176 -372
阅读2 分钟

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。

Arnaud Bouchez · 10:32 UTC · 在 GitHub 上查看该提交 →

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。

Arnaud Bouchez · 08:15 UTC · 在 GitHub 上查看该提交 →

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;无需源码迁移。

Arnaud Bouchez · 10:31 UTC · 在 GitHub 上查看该提交 →

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 变更引入的编译问题;无需修改应用源码。

Arnaud Bouchez · 17:08 UTC · 在 GitHub 上查看该提交 →

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。

Arnaud Bouchez · 14:40 UTC · 在 GitHub 上查看该提交 →

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。

Arnaud Bouchez · 19:29 UTC · 在 GitHub 上查看该提交 →

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 不变。

Arnaud Bouchez · 14:21 UTC · 在 GitHub 上查看该提交 →

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 变量的具名类型。

公开 API

  • TNewNetTlsadded — NewNetTls 使用的新公开函数类型。

Arnaud Bouchez · 14:19 UTC · 在 GitHub 上查看该提交 →

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 行为不变。

Arnaud Bouchez · 19:35 UTC · 在 GitHub 上查看该提交 →

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 元数据。

公开 API

  • TWinCertInfo.KeyProviderTypeadded — 公开证书 key provider 类型。
  • TWinCertInfo.KeyProviderFlagsadded — 公开 provider 获取 flags。
  • TWinCertInfo.KeySpecadded — 公开证书 key specification。

Arnaud Bouchez · 17:51 UTC · 在 GitHub 上查看该提交 →

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。

Arnaud Bouchez · 17:08 UTC · 在 GitHub 上查看该提交 →

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 文本。

Arnaud Bouchez · 19:12 UTC · 在 GitHub 上查看该提交 →

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。

Arnaud Bouchez · 10:31 UTC · 在 GitHub 上查看该提交 →

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。

Arnaud Bouchez · 12:35 UTC · 在 GitHub 上查看该提交 →

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 自签名证书声明。

Arnaud Bouchez · 07:01 UTC · 在 GitHub 上查看该提交 →

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 行为不变。

公开 API

  • TWindowsSpec.wsWeakCngadded — 标记 CNG API 不可用的 Windows 环境。

Arnaud Bouchez · 16:58 UTC · 在 GitHub 上查看该提交 →

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 声明。

Arnaud Bouchez · 12:35 UTC · 在 GitHub 上查看该提交 →

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 失败会显示诊断名称而非纯数字错误码;其他应用行为不变。

Arnaud Bouchez · 16:59 UTC · 在 GitHub 上查看该提交 →

19 低 msLAPS 解密 helper 简化但契约不变 TNCrypt.LapsDecrypt 移除冗余本地状态,直接使用解析后的 header 长度,并修正内部 LDAPS/msLAPS 文案。 内部重构 mormot.lib.sspi 32e7d9b3+13-15

lib: NCrypt.LapsDecrypt() cleanup

影响

预计对应用代码无影响;公开签名与解密结果均未变化。

Arnaud Bouchez · 14:19 UTC · 在 GitHub 上查看该提交 →

上游活动 每日提交数 · 最近 60 天
提交977
活跃天数44/60
最忙一天2026-09-30
峰值60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13