Skip to content

实现完整 XHTTP 客户端、服务端与高级 TLS/ECH 支持#40

Draft
MiChongs wants to merge 1 commit into
mainfrom
codex/protocol-xhttp-full
Draft

实现完整 XHTTP 客户端、服务端与高级 TLS/ECH 支持#40
MiChongs wants to merge 1 commit into
mainfrom
codex/protocol-xhttp-full

Conversation

@MiChongs

Copy link
Copy Markdown
Owner

背景与目标

本变更补齐 WutherCore 的 XHTTP(SplitHTTP)传输支持,使其不仅能作为出站客户端使用,也能作为入站服务端独立启动,并严格承接结构化配置。实现以 Xray-core 26.7.11(提交 50231ea)为互操作基准,覆盖 HTTP/1.1、HTTP/2、HTTP/3、三种上传模式、高级 TLS/ECH、独立下载连接和资源治理。

本 PR 使用独立分支与独立 worktree 开发,相对 main 仅包含一个协议提交,未修改或复用主工作区中的用户变更。

客户端实现

  • 完整实现 stream-onestream-uppacket-up 三种 XHTTP 模式。
  • 支持 HTTP/1.1、HTTP/2 和基于 QUIC 的 HTTP/3;协议选择、ALPN、连接复用和关闭语义均有独立测试。
  • 实现 Xray 兼容的请求路径、查询参数、Cookie、请求头、浏览器伪装头、随机填充和会话标识生成。
  • 实现 XMUX 连接池,包括并发连接数、单连接并发、请求次数、连接寿命、空闲回收和取消安全。
  • 实现 downloadSettings 独立下行连接,支持独立地址、端口、网络、安全配置和 XHTTP 参数,并对字段冲突进行严格拒绝。
  • VLESS、VMess、VMess Legacy、Trojan、AnyTLS、TrustTunnel 等现有协议均可通过统一的类型化 XHTTP 传输入口使用,不再依赖字符串参数拼装。

服务端实现

  • 新增 XHTTP 入站监听器和主程序启动接线,支持明文 HTTP/1.1、h2c、TLS HTTP/1.1、TLS HTTP/2 与 HTTP/3。
  • 服务端支持三种上传模式,并将逻辑双向流交给统一的连接表和原始 TCP 转发适配器。
  • 实现严格的路径、Host、查询参数、Cookie、会话标识、序列号、重试与乱序重组校验。
  • 支持 CORS 兼容模式、通配模式、来源白名单与完全关闭模式。
  • 支持事务式监听启动:任一监听器配置或端口失败时,不会遗留半启动服务。
  • 支持显式关闭,监听器、活动连接、逻辑流、证书刷新和 OCSP 后台任务会随生命周期终止。

配置字段与兼容性

  • 将 XHTTP 客户端、服务端、XMUX、下载连接、TLS、证书、OCSP、ECH、连接限制、请求体限制、超时和 CORS 字段完整注册为强类型配置。
  • 同时接受 Xray 常用驼峰字段和项目既有的蛇形/短横线别名;等价别名会归一化,互相冲突时直接报错。
  • 未知字段、无法执行的组合、越界范围、协议不匹配和含糊安全配置均在配置编译阶段失败,不会静默忽略。
  • 结构化字段具有明确优先级,避免 URI 参数、extra、顶层字段和 downloadSettings 之间出现信息丢失。
  • 新增完整中文文档 docs/XHTTP.md,说明客户端、服务端、模式、TLS/ECH、字段语义、安全限制和示例配置。

TLS、ECH 与证书能力

  • 普通现代 TLS 客户端使用 rustls 路径;需要浏览器 ClientHello 塑形或 ECH 时使用经过固定版本审计的 shaped-rustls。
  • 服务端使用 BoringSSL 路径承接 Xray 所需的 TLS 1.0/1.1、ECH Server Keys 与 OCSP Stapling 能力,同时保留现代 rustls 服务端路径。
  • 支持 TLS 最低/最高版本、ALPN、SNI、证书名称校验、证书 SHA-256 固定、公钥固定、系统与自定义 CA、客户端证书、会话恢复、密钥日志、密码套件和曲线选择。
  • 支持文件证书、证书热重载、动态签发、mTLS、ECH Config List、ECH Server Keys、拒绝未知 SNI。
  • OCSP 响应会校验证书绑定、签名、授权响应者、状态和有效期,禁止把未验证字节直接装订到握手。
  • 删除旧式“不安全跳过验证”语义;若用户配置无法安全执行则明确拒绝。

安全与资源治理

  • 对连接数、HTTP 流、逻辑中继、请求体、乱序窗口、等待队列、头部大小和会话数实施独立上限。
  • 请求体预算采用正常与优先容量隔离,并保证取消、失败、重试、部分读取时正确归还。
  • 对慢请求体、握手、空闲连接、逻辑流、客户端建连和关闭过程设置可配置超时。
  • 原始转发在非回环地址上默认拒绝无认证暴露,必须显式允许。
  • 所有解析路径对歧义 Host、非法 HTTP 版本、冲突头部、异常序列、超限填充和无效范围采取失败关闭策略。

依赖与第三方代码

  • 使用 boring/tokio-boringocsp-staplerrasnx509-parserquinnh3 等实际协议库完成实现,没有以空壳或仅配置映射代替协议能力。
  • 固定引入经过补丁记录的 shaped-rustls 快照和 H3 快照,以满足 ECH/ClientHello 塑形及当前 QUIC 接口要求。
  • 新增 THIRD_PARTY_NOTICES.md,并在第三方目录保留上游来源、版本、补丁说明和许可证。

验证结果

  • cargo test -p core-config:107 项通过。
  • cargo test -p core-inbound --lib:133 项通过。
  • cargo test -p core-outbound xhttp --lib:137 项通过。
  • cargo test -p wuther-core:16 项通过。
  • cargo check --workspace --all-targets:通过。
  • cargo fmt --all -- --check:通过。
  • git diff --check origin/main...HEAD:通过。
  • 官方 Xray 26.7.11 HTTP/1.1 互操作:4 项通过,覆盖 WutherCore 客户端到 Xray 服务端、Xray 客户端到 WutherCore 服务端、独立下载端点及流式关闭语义。
  • 官方 Xray 26.7.11 TLS/H2/H3 互操作:8 项通过,覆盖双向 H2/H3、默认 ALPN、真实 ECH、Trojan-over-XHTTP 以及错误证书固定值的负向验证。
  • 所有互操作场景均覆盖 stream-onestream-uppacket-up;Trojan 场景覆盖 H1/H2/H3。

提交约束

  • 分支:codex/protocol-xhttp-full
  • 相对 main 提交数:1
  • 提交:b916cd9fccac115cc0196f69204bdea1fc6be1c5
  • 本 PR 保持草稿状态,便于先完成大体量协议实现的审阅。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant