立即处理可能影响正在运行的系统已审查 build 2.4.17269 至 2.4.17294 的全部 26 个 non-merge commit:排除 mormot.commit.inc 与 mormot.commit-num.inc 后新增 1,474 行、删除 440 行。已检查精确 upstream head。没有 superseded_by;升级顺序来自同 unit follow-up,不声明避开区间。
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。
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 结果,证书链资源也能正确释放。
建议升级
使用本期最终 head,并在 mTLS 测试中加入最旧受支持 Windows 版本。
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 不受影响。
建议升级
采用 build 2.4.17294,并在无外部证书链 URL 的条件下重测 Windows 客户端证书验证。
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 均受益。
建议升级
采用 2.4.17294,并压力测试 THttpServer、THttpAsyncServer 与自定义 TAsyncConnections 子类的反复 create/start/free。
公开 API
TLoggedThread.AfterConstructionbehaviour-changed
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 不再继承上一次验证的旧错误。
建议升级
通过 THttpServer 与 THttpAsyncServer 重测 mTLS,包括 callback 拒绝与接受场景。
公开 API
THttpServerSocket.Createbehaviour-changed
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 不受影响。
建议升级
验证客户端证书缺失、过期与不受信时的日志及客户端可见行为。
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 验证,不再静默忽略。
建议升级
升级后,在 CACertificatesRaw 为唯一 CA 来源时分别测试受信与不受信客户端证书链。
公开 API
TNetTlsContext.CACertificatesRawbehaviour-changed
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-changedTNetTlsContext.OnEachPeerVerifybehaviour-changedTNetTlsContext.OnAfterPeerValidatebehaviour-changed
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。
9
中
THttpAsyncServer 在任一线程运行前完成关联
THttpAsyncServer.Create 以 suspended 状态构造继承的服务器线程与 fAsync,设置双向引用后再启动 async 侧并等待 socket bind,避免暴露未完整关联的对象。
修复
mormot.net.async
fb7baf23+17-6
net: fixed THttpAsyncServer.Create thread startup sequence
影响
修复任一线程在 constructor 窗口解引用缺失 owner 状态的问题;这是随后启动提交完成的中间修复。
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
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
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
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 项目不受影响。
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 完成,不需要应用迁移。
15
中
TLoggedThread 新增构造后启动的内部开关
mormot.core.threads 新增 protected 的 fStartAfterConstruction 与 AfterConstruction override,使子类可在对象构造完成前保持 suspended。
内部重构
mormot.core.threads
b698a9c6+13-4
core: introducing TLoggedThread.fStartAfterConstruction flag
影响
该内部机制支撑服务器启动修复;现有应用线程不受影响,除非自定义子类主动设置该 protected flag。
16
低
TSynTests 串行化多线程 console 更新
mormot.core.test 用 ConsoleLock 与 ConsoleUnLock 包围 TSynTests 的进度、颜色和错误输出序列,防止并行测试混合 cursor 与颜色状态。
修复
mormot.core.test
de6c7467+50-35
core: fixed TSynTests console output
影响
并行测试输出保持可读;应用 backend 不受影响,除非自身工具直接使用 TSynTests。
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
18
低
公开 console 锁支持原子输出序列
mormot.core.os 在可重入 ConsoleCriticalSection 之上新增 ConsoleLock 与 ConsoleUnLock,使调用方可将多次 console 更新作为一个序列保护。
新功能
mormot.core.os
3f2d5e44+18-2
core: new ConsoleLock/ConsoleUnLock functions
影响
工具和测试 runner 可防止跨线程输出交错;现有 console 调用行为不变。
公开 API
ConsoleLockaddedConsoleUnLockadded
19
低
Windows 信任失败获得可读错误名称
mormot.core.os 扩展 Windows 错误码解析,加入 SChannel、SSPI 与证书信任常量,使证书链和 policy 失败显示符号名称。
编译器与平台
mormot.core.os
31cf2232+13-7
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 代码;无需应用迁移。
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 的控制流改写。
22
低
网络测试套件新增端到端 SChannel mTLS 服务器测试
test.net.proto 创建启用客户端证书认证的 Windows SChannel 服务器,并用生成的测试 identity 覆盖成功与失败 handshake。
测试
test.net.proto
1a36278a+332-6
23
低
SChannel 测试服务器现在并行运行
网络测试套件并行启动多个 SChannel 服务器变体,覆盖并发 console 输出与独立 TLS 服务器生命周期。
测试
test.net.proto
2f892a9e+141-118
test: made SChannel servers run in parallel
影响
仅测试 harness 发生变化;生产 Delphi/FPC backend 没有直接行为或 API 变化。
24
低
SChannel 集成测试覆盖完整客户端认证矩阵
TNetworkProtocols._SChannel 在 mTLS 修改后扩展最终 Windows TLS 矩阵,覆盖不同服务器实现、CA 输入与客户端证书结果。
测试
test.net.proto
eddc9ae5+35-33
test: completed TNetworkProtocols._SChannel
影响
回归覆盖增加;此纯测试提交不改变 Delphi/FPC 应用代码与运行时行为。
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。