# 托管 TLS 移植基础 这是独立的 C# TLS 组件,通过平台提供的原生 Stream 与安全服务接入自研内核;该目录的宿主测试不能代表裸机 TLS、Bing 主页或实体网络已经可用。原生集成与来宾验收由独立内核的应用、网络和 PAL 层负责,不能将旧 Cosmos 验收结果沿用到新内核。 协议和密码算法使用固定版本 BouncyCastle.Cryptography 2.7.0(MIT),版本、包哈希及来源提交保存在 `DependencyManifest.json` 和 `Packages.lock.json`。TLS 客户端运行 BC 的 `TlsClientProtocol` / `BcTlsCrypto`,只接受 TLS 1.2/1.3、ECDHE 与 AEAD,发送 DNS SNI,并仅请求 HTTP/1.1 ALPN。它没有调用宿主 HttpClient、SslStream 或操作系统证书存储。 证书验证使用显式受信根、BC PKIX 路径构建和签名/约束检查,并检查 UTC 有效期、DNS/IP subjectAltName、serverAuth 和数字签名用途。实际选中的路径与锚点还检查祖先 EKU;所有认证公钥至少为 RSA 2048 位、EC 256 位或 Ed25519/Ed448,路径签名限定为 SHA-256/384/512 或 EdDSA,PSS 参数另行检查。根的自签名并非路径认证依据,因此不把根的旧自签名哈希当作远端链签名。锚点须允许签发证书,其 nameConstraints 显式应用于全部下属证书;固定 BC 不会自行从 TrustAnchor 初始化这些约束。没有 Common Name 回退、跳过证书开关或 HTTP 降级。通配符只允许完整的最左一个标签,拒绝单标签后缀及 IDNA 标签的通配匹配;暂未接入公共后缀表。当前不提供 OCSP/CRL 吊销查询,也不主张拥有完整主流浏览器的证书策略。 `ITlsSecurityContext` 必须由平台提供可靠 UTC 与经健康检查的 CSPRNG,缺失时抛错;握手前会检查两者。平台 Stream 必须在每次读写中执行单调时钟截止时间和取消检查,不能只依赖 BC 的 10 秒握手计时。调用方仍需限制 HTTP 总时长、正文、重定向及资源总量。 `TlsPlatformSecurityContext` 接受 `Func` 与 `TlsRandomFill(Span)` 两个显式平台委托,不调用宿主时间、宿主证书库或 BCL RNG 作为替代。UTC 委托须已验证来源及 UTC 语义;随机委托必须填满缓冲区或抛错,失败后清除可能已写入的部分字节。检测显著错误日期并不能证明 RTC 时区可信;QEMU 必须使用 UTC RTC,实体固件的本地时间约定仍需另外处理。 固定 BC `SecureRandom` 的静态初始化会先 AutoSeed 并调用 `RandomNumberGenerator.Fill`,即使 TLS 显式注入自定义随机生成器也不能消除这条依赖。实际固定 Linux .NET 10 BCL 会进入 `libSystem.Security.Cryptography.Native.OpenSsl`,并不调用 `SystemNative_GetCryptographicallySecureRandomBytes`。独立内核的原生编译显式启用 `Tools/TlsEntropyPatch`,仅修改固定 BC 私有输出的 12 处 RNG 调用,改用 `xfe_runtime_random_fill` 的硬件适配器;其余方法 IL、分支与 EH 结构复核不变。宿主测试和全局 NuGet 包保留原件,不伪造 OpenSSL 初始化,不修改 TLS 或证书策略。原始/派生 DLL、适配器、补丁源码和回执哈希随 NativeAOT 构建绑定。缺少强随机源必须清零并拒绝;非密码学 hash-seed 或时间不能替代它。TLS 密码算法使用 BC 托管实现,不调用宿主 SslStream 或 HTTP 代理。 宿主验收使用 Windows Schannel **仅作为独立的受控服务端**,BC 客户端真实完成 TLS 1.2/1.3、HTTP 数据传输和错误域名/未知 CA 拒绝;证书由测试现场生成,既不安装受信根,也不连接外部代理。密钥只用于本次本地测试。其余用例覆盖错误签名、过期/未生效、缺少 SAN、IP/DNS 混淆、用途错误、未知关键扩展、过期根和缺少时间/随机源。 ```powershell dotnet restore Tests/XFESystem.NativeTls.Tests/XFESystem.NativeTls.Tests.csproj --locked-mode dotnet test Tests/XFESystem.NativeTls.Tests/XFESystem.NativeTls.Tests.csproj -c Release --no-restore ``` 独立内核集成需要按具体平台分别验收,构建成功不能代替下列检查: 1. 导出并校验原生 RNG 的硬件种子来源与失效状态,拒绝未验证的纯 jitter 回退;验证可靠固件 UTC 和单调计时。 2. 引入有来源/哈希/许可证记录的受信根资源,验证裸机 PKIX、密码算法及异常清理的 NativeAOT 行为。不能把 BCL `RandomNumberGenerator` 或 `DateTime.UtcNow` 存在当作这些前提已满足。 3. 把真实原生 socket 封装成有总截止时间的 Stream,在独立网页 worker 中运行该 TLS 客户端;验证失败、断线、取消和关闭后的资源回收。 4. 检查本机编译后的内核体积及 128 MiB 镜像剩余空间。当前 5,155,728 字节的 BC net6.0 DLL 大小不代表 NativeAOT 链接后的增量,不能据此改变启动盘格式。 5. 分别记录受控 DNS/TLS、原生 QEMU 和实体机结果;QEMU 通过只适用于它的设备、UTC 与熵配置,不能据此标记实体网络或完整发行通过。 安全审查尚待完成的明确边界:证书中编码的根名称/用途限制现已显式检查,但没有导入外部信任库元数据、Mozilla distrust 时间、Certificate Transparency 或公共后缀表;也没有吊销查询。应继续增加复杂中间链和约束交叉组合测试。`UtcNow >= 2024` 只是显著错误时间的防线,不能证明 RTC 可信;平台提供者仍必须独立核验固件 UTC、单调进度与随机源来源。41 项宿主检查覆盖实际 TLS 1.2/1.3 传输、校验失败、平台故障传播、锚点名称/用途和弱签名拒绝,不等于原生公网或所有浏览器安全策略验收。 Bing 样式一致性另需图片/字体解码、CSS grid/完整 flex 等布局、脚本 API 与 CSP 等工作。当前浏览器仅实现 CSS 子集,不能以成功获取 HTML 或把地址改成 Bing 作为“CSS 完整”验收。Windows 浏览器截图对照在本轮被 Computer Use 工具停止(无法可靠确定当前浏览器 URL),未执行其他 UI 途径绕过该停止。 参考原始资料:[BC 官方下载](https://www.bouncycastle.org/download/bouncy-castle-c/)、[BC TLS 客户端源码](https://github.com/bcgit/bc-csharp/tree/4007498b13582d90ee1eda5d9920c324428b98b3/crypto/src/tls)、[PKIX 参数源码](https://github.com/bcgit/bc-csharp/blob/4007498b13582d90ee1eda5d9920c324428b98b3/crypto/src/pkix/PkixParameters.cs)。