mORMot2 Daily每日上游提交速读

SChannel 获得原生 mTLS,服务器启动竞态得到修复

Windows 服务器现在可通过 SChannel 要求并验证客户端证书,并复用 TNetTlsContext 现有的信任存储与验证回调。另一组修改修复 HTTP 和 async 服务器构造顺序,避免主线程在 socket、worker 与交叉引用就绪前运行。使用 Windows mTLS 或在高负载下创建服务器的团队应直接采用最终 build。

要点

  • 应采用 build 2.4.17294 的 de8d47ea7122b30aa81296a1e5e899a3909e34b1。
  • SChannel 服务器现通过 ClientCertificateAuthentication、CACertificatesFile、CASystemStores、CACertificatesRaw、OnEachPeerVerify 与 OnAfterPeerValidate 实现 mTLS。
  • HTTP 与 async 服务器线程会保持 suspended,直到 socket、worker 与 owner link 完成初始化。
  • 应升级以获得 CACertificatesRaw 加载修复、缺少客户端证书的明确错误及最终 SChannel 声明与 cache 修正。
  • 新增公开 API 包括 acoCreateSuspended、ConsoleLock/ConsoleUnLock 与 WinCryptTextToBinary。

升级建议

请采用 build 2.4.17294。若 Windows 服务器使用或准备使用客户端证书认证、由 CACertificatesRaw 提供信任锚,或在并发环境中创建 HTTP/async 服务器,应尽快升级。请测试证书链接受与拒绝、OnEachPeerVerify override、OnAfterPeerValidate context,以及 THttpServer 与 THttpAsyncServer 启动。原始 payload 没有 superseded_by,因此不声明正式避开区间;请完整采用有序序列,不要挑选其中间 commit。

版本号2.4.17268 → 2.4.17294
提交26
行数+1526 -492
阅读2 分钟

26 条中的 26 条 · 上游 26 次提交

主题
# 条目 类别 单元
1 高 SChannel mTLS 增加 Windows 7 兼容与更严格证书链检查 mormot.net.sock.windows 使用 Windows 7 支持的较短 CERT_CHAIN_ENGINE_CONFIG 布局,在更旧系统上拒绝 mTLS,完善 client-auth EKU 与信任处理,并修正 chain engine 清理。 修复 mormot.net.sock.windows 9d610a05+36-20

net: several SChannel fixes

影响

Windows 7 可使用新的服务端 mTLS;更旧系统会得到明确 unsupported 结果,证书链资源也能正确释放。

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

2 高 最终 SChannel 修复避免类型冲突与阻塞式证书链获取 mormot.net.sock.windows 使用自身的证书 context 指针声明,设置 SCH_CRED_CACHE_ONLY_URL_RETRIEVAL_ON_CREATE,并完善 SChannel 测试与 Windows 版本 guard,避免 Delphi RTL PCCERT_CONTEXT 冲突及创建 credential 时的网络 URL 获取。 修复 mormot.net.sock.windows+1 9a2fec3f+17-12

net: latest SChannel fixes

影响

Windows Delphi 与 FPC 构建获得稳定的最终 mTLS 路径,服务器启动不再因通过 URL 获取证书链而阻塞;非 Windows TLS backend 不受影响。

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

3 高 服务器线程现在只在构造完成后启动 TLoggedThread.AfterConstruction 现在先调用 inherited 再 Start。THttpServerGeneric 与 TAsyncConnections 总是以 suspended 创建 RTL thread,保存调用方选项并在构造后启动;THttpAsyncServer 也仅在 bound socket 有效后设置 esRunning。 修复 mormot.core.threads+2 0b8d9252+11-9

net: fixed previous commits

影响

HTTP 与 async 服务器不再与自身 constructor 竞争,也不会在 bind 成功前报告 running;所有使用这些服务器类的 Delphi/FPC backend 均受益。

公开 API

  • TLoggedThread.AfterConstructionbehaviour-changed

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

4 高 经典 HTTP 服务器为每个连接保留完整 TLS 客户端认证策略 启用客户端证书认证时,THttpServerSocket.Create 会把完整 TNetTlsContext 复制到每个已接受连接,再重置临时状态;OpenSSL 验证也会清除旧 LastError 并只计算一次结果。 修复 mormot.lib.openssl11+2 7b63898e+14-6

net: some TLS fixes especially on OpenSSL and THttpServer

影响

Threaded THttpServer 连接现在会保留 mTLS 所需 CA 列表与验证 callback;OpenSSL callback 不再继承上一次验证的旧错误。

公开 API

  • THttpServerSocket.Createbehaviour-changed

Arnaud Bouchez · 11:18 UTC · 在 GitHub 上查看该提交 →

5 高 SChannel 明确报告缺失客户端 credential 与信任失败 Windows TLS 路径对缺失客户端证书识别 SEC_E_NO_CREDENTIALS,扩展 SSPI 错误文本,并收紧 chain policy 失败处理,同时保留 callback override 行为。 修复 mormot.core.os+2 13a977c1+10-5

net: better SSPI/SChannel error handling

影响

mTLS 拒绝变得明确且可诊断,不再表现为模糊 handshake 失败;影响 Windows Delphi/FPC 服务器,其他 backend 不受影响。

Arnaud Bouchez · 13:30 UTC · 在 GitHub 上查看该提交 →

6 高 内存 CA 证书现在正确进入 SChannel 验证 TSChannelServerContext.Create 修正信任源选择中的 else 绑定,使 CACertificatesFile 与 CASystemStores 均未提供 CA 时,CACertificatesRaw 条目能够被解析并加入。 修复 mormot.net.sock.windows 4355bdd9+5-3

net: fixed SChannel CACertificatesRaw[] support

影响

通过 CACertificatesRaw 传入 PEM root 的 Windows mTLS 服务器现在会使用这些 root 验证,不再静默忽略。

公开 API

  • TNetTlsContext.CACertificatesRawbehaviour-changed

Arnaud Bouchez · 13:57 UTC · 在 GitHub 上查看该提交 →

7 高 Windows SChannel 服务器可要求客户端证书 TSChannelServerContext 基于 TNetTlsContext 实现服务端 mTLS:加载配置的 CA 来源,必要时构建独占 chain engine,请求客户端 credential,检查 client-auth EKU,并运行 OnEachPeerVerify 与 OnAfterPeerValidate。 新功能 mormot.net.sock+1 cbc906b6+368-38

net: implement mTLS using SChannel

影响

Windows backend 可直接用原生 SChannel 实现双向 TLS,无需切换 OpenSSL;现有服务器在未启用 ClientCertificateAuthentication 时仍为单向 TLS。

值得一看

若采用 SChannel mTLS,请配置一个 CA 来源,并在 2.4.17294 上按自身证书策略测试两个验证 callback。

公开 API

  • TNetTlsContext.ClientCertificateAuthenticationbehaviour-changed
  • TNetTlsContext.OnEachPeerVerifybehaviour-changed
  • TNetTlsContext.OnAfterPeerValidatebehaviour-changed

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

8 中 HTTP 服务器家族采用延迟主线程启动 TAsyncConnections 与 THttpServerGeneric 根据公开 suspended 选项设置 TLoggedThread.fStartAfterConstruction;THttpApiServer 删除手动 Start,由基类管理启动时机。 修复 mormot.net.async+1 2acff7c1+5-21

net: fixed servers main thread startup

影响

这是启动修复的中间步骤,随后由 0b8d9252 修正;不要脱离最终构造修改单独 cherry-pick。

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

9 中 THttpAsyncServer 在任一线程运行前完成关联 THttpAsyncServer.Create 以 suspended 状态构造继承的服务器线程与 fAsync,设置双向引用后再启动 async 侧并等待 socket bind,避免暴露未完整关联的对象。 修复 mormot.net.async fb7baf23+17-6

net: fixed THttpAsyncServer.Create thread startup sequence

影响

修复任一线程在 constructor 窗口解引用缺失 owner 状态的问题;这是随后启动提交完成的中间修复。

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

10 中 SChannel 声明公开 Windows 证书链 engine mormot.lib.sspi 新增 Windows 证书链结构、callback、常量与 API import,用于创建受限 chain engine 并评估客户端证书 SSL chain policy。 新功能 mormot.lib.sspi a1586a7c+154-2

lib: SChannel cert chain API support

影响

低层 Windows Delphi/FPC 代码可直接调用证书链 API,SChannel mTLS 也获得所需声明;其他平台不变。

公开 API

  • Windows certificate-chain API declarationsadded

Arnaud Bouchez · 06:33 UTC · 在 GitHub 上查看该提交 →

11 中 OpenSSL 服务器现在调用最终 peer 验证 callback 服务器 handshake 成功后,TOpenSslNetTls.AfterAccept 会调用 TNetTlsContext.OnAfterPeerValidate,并提供 TLS context、peer certificate、cipher 信息与当前验证结果。 新功能 mormot.lib.openssl11 bda449fe+36-8

lib: TOpenSslNetTls.AfterAccept implements OnAfterPeerValidate callback

影响

OpenSSL 服务器获得与新 SChannel 路径一致的 callback;现有 callback 可能在此前不会触发的 server accept 上运行。

值得一看

审查 OnAfterPeerValidate handler 的服务端假设,并测试接受与拒绝 peer certificate。

公开 API

  • TNetTlsContext.OnAfterPeerValidatebehaviour-changed

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

12 中 TAsyncConnections 可在主循环 suspended 状态下构造 TAsyncConnectionsOptions 新增公开选项 acoCreateSuspended;TAsyncConnections.Create 用它让主线程保持 suspended,直到 worker 与初始化就绪。 新功能 mormot.net.async 342146c9+12-5

net: fixed TAsyncConnections main thread execution

影响

自定义 async server 子类可显式控制初始执行;现有 option set 保持原默认值,framework 内部使用该选项保障安全启动。

公开 API

  • acoCreateSuspendedadded

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

13 中 Lazarus 聚合 package 现在包含 Windows 密码学 unit packages/lazarus/mormot2.pas 在 uses 中加入 mormot.crypt.win,使聚合 FPC package 能编译并注册此前新增的 Windows 密码学 unit。 编译器与平台 mormot2+1 de8d47ea+8-7

fpc: fixed mormot2 package source

影响

Lazarus package 用户不再缺少 mormot.crypt.win 符号;Delphi 项目和直接列出 unit 的 FPC 项目不受影响。

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

14 中 Async HTTP 初始化先发布状态再执行 mormot.net.async 与 mormot.net.ws.async 将 accept-only flag、bound socket 发布、owner link 和 WebSocket keep-instance 初始化提前,使 worker 与主循环执行前即可看到它们。 内部重构 mormot.net.async+1 47868569+103-89

net: async HTTP server code cleanup

影响

Async stack 能看到一致的 constructor 状态,降低启动竞态;该步骤由 0b8d9252 完成,不需要应用迁移。

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

15 中 TLoggedThread 新增构造后启动的内部开关 mormot.core.threads 新增 protected 的 fStartAfterConstruction 与 AfterConstruction override,使子类可在对象构造完成前保持 suspended。 内部重构 mormot.core.threads b698a9c6+13-4

core: introducing TLoggedThread.fStartAfterConstruction flag

影响

该内部机制支撑服务器启动修复;现有应用线程不受影响,除非自定义子类主动设置该 protected flag。

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

16 低 TSynTests 串行化多线程 console 更新 mormot.core.test 用 ConsoleLock 与 ConsoleUnLock 包围 TSynTests 的进度、颜色和错误输出序列,防止并行测试混合 cursor 与颜色状态。 修复 mormot.core.test de6c7467+50-35

core: fixed TSynTests console output

影响

并行测试输出保持可读;应用 backend 不受影响,除非自身工具直接使用 TSynTests。

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

17 低 新增 Windows wrapper 解码 PEM 与 Base64 证书文本 mormot.core.os.security 新增公开 WinCryptTextToBinary,将 RawUtf8 通过 CryptStringToBinaryA 转为 RawByteString,默认使用 CRYPT_STRING_BASE64HEADER,并优化 WinCryptBinaryAppendAsText。 新功能 mormot.core.os.security d344d129+43-8

core: new WinCryptTextToBinary() wrapper function

影响

Windows 代码获得统一的 PEM/Base64 解码 helper;现有调用保持源兼容,可选择采用。

公开 API

  • WinCryptTextToBinaryadded

Arnaud Bouchez · 09:46 UTC · 在 GitHub 上查看该提交 →

18 低 公开 console 锁支持原子输出序列 mormot.core.os 在可重入 ConsoleCriticalSection 之上新增 ConsoleLock 与 ConsoleUnLock,使调用方可将多次 console 更新作为一个序列保护。 新功能 mormot.core.os 3f2d5e44+18-2

core: new ConsoleLock/ConsoleUnLock functions

影响

工具和测试 runner 可防止跨线程输出交错;现有 console 调用行为不变。

公开 API

  • ConsoleLockadded
  • ConsoleUnLockadded

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

19 低 Windows 信任失败获得可读错误名称 mormot.core.os 扩展 Windows 错误码解析,加入 SChannel、SSPI 与证书信任常量,使证书链和 policy 失败显示符号名称。 编译器与平台 mormot.core.os 31cf2232+13-7

core: include SChannel/SSPI trust error codes

影响

日志与异常更易诊断;运行时信任决策和应用 API 不变。

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

20 低 TLS callback 与 Windows 解码 helper 被统一整理 mormot.lib.openssl11 将最终 peer callback 参数组装移入局部 helper;mormot.lib.sspi 改用共享 WinCryptTextToBinary,不再走私有 CryptStringToBinaryA 路径。 内部重构 mormot.lib.openssl11+1 c9977bb6+32-33

lib: small refactoring of the two previous commits

影响

TLS 验证行为不变,同时删除重复转换与 callback 代码;无需应用迁移。

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

21 低 JSON 长度 guard 被重写但结果不变 TJsonWriter.AddEscapeBuffer 将一个 short-circuit 条件改写为对 MaxLen 与 Len 的嵌套检查;最终判断仍是 MaxLen 大于零且 Len 超过 MaxLen。 内部重构 mormot.core.json 5b7993fc+5-5

core: fixed #626 TJsonWriter.AddEscapeBuffer

影响

应用可观察行为与公开 API 均不变;这是对上一期已修复 guard 的控制流改写。

Arnaud Bouchez · 10:14 UTC · PR #626 · 在 GitHub 上查看该提交 →

22 低 网络测试套件新增端到端 SChannel mTLS 服务器测试 test.net.proto 创建启用客户端证书认证的 Windows SChannel 服务器,并用生成的测试 identity 覆盖成功与失败 handshake。 测试 test.net.proto 1a36278a+332-6

test: cover SChannel mTLS server

影响

这是新功能的回归覆盖,本身不改变应用行为。

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

23 低 SChannel 测试服务器现在并行运行 网络测试套件并行启动多个 SChannel 服务器变体,覆盖并发 console 输出与独立 TLS 服务器生命周期。 测试 test.net.proto 2f892a9e+141-118

test: made SChannel servers run in parallel

影响

仅测试 harness 发生变化;生产 Delphi/FPC backend 没有直接行为或 API 变化。

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

24 低 SChannel 集成测试覆盖完整客户端认证矩阵 TNetworkProtocols._SChannel 在 mTLS 修改后扩展最终 Windows TLS 矩阵,覆盖不同服务器实现、CA 输入与客户端证书结果。 测试 test.net.proto eddc9ae5+35-33

test: completed TNetworkProtocols._SChannel

影响

回归覆盖增加;此纯测试提交不改变 Delphi/FPC 应用代码与运行时行为。

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

25 低 OpenSSL 服务器测试覆盖更多 TLS 验证路径 test.net.proto 扩展 OpenSSL TLS 服务器覆盖,并验证新的共享 peer-validation callback 行为及 SChannel 客户端证书场景。 测试 test.net.proto 09e6e909+29-7

test: enhanced OpenSSL TLS server coverage

影响

这是纯测试覆盖,为 OpenSSL 与 SChannel 提供一致性检查,不改变公开 API。

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

26 低 SChannel 测试新增信任与 callback 边界场景 test.net.proto 在实现完善期间扩展 SChannel 覆盖,包含 CA 来源、peer callback 与客户端证书结果。 测试 test.net.proto 170f4c56+19-3

tests: better SChannel coverage

影响

该修改仅提高回归检测能力;应用代码与公开 API 不变。

Arnaud Bouchez · 13:37 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