Skip to content

fix(ov_cli): trust native CA roots - #6361

Merged
qin-ctx merged 1 commit into
volcengine:mainfrom
sponge225:fix/ov-cli-native-roots
Oct 20, 2026
Merged

qin-ctx merged 1 commit into
volcengine:mainfrom
sponge225:fix/ov-cli-native-roots

Conversation

@sponge225

Copy link
Copy Markdown
Collaborator

Description

本 PR 修复 ov CLI 无法信任操作系统已安装私有 CA 的问题。

当前 ov_cli 使用 reqwest 0.12,并关闭默认 feature 后仅启用 rustls-tls。在该版本中,rustls-tls 实际等价于 rustls-tls-webpki-roots,因此 HTTP 客户端只加载内置的 Mozilla 公共根证书,不读取操作系统原生信任库,也不会处理 SSL_CERT_FILE 或 SSL_CERT_DIR 指定的证书。

这会导致一个常见的自托管场景无法工作:公司内网或家庭局域网中的 OpenViking 服务使用 Caddy internal CA、企业内部 CA 等私有 CA 签发 HTTPS 证书。即使客户端机器已经信任该 CA,浏览器可以正常访问,ov health 和 ov chat 仍会因 UnknownIssuer 拒绝连接。

本 PR 为 reqwest 增加 rustls-tls-native-roots feature。reqwest 会将系统原生根证书与现有 WebPKI 公共根证书合并到同一个 rustls root store,因此:

  • 安装到操作系统信任库的私有 CA 可以被 ov 使用;
  • SSL_CERT_FILE 和 Unix 上的 SSL_CERT_DIR 可以为命令提供自定义 CA;
  • 原有 Mozilla 公共根证书继续保留,公开 HTTPS 服务不受影响;
  • TLS 证书校验仍然启用,未受信任 CA 签发的证书仍会被拒绝;
  • 该 Cargo feature 对 ov_cli 中所有 reqwest client builder 生效,包括普通 API 请求、带独立连接超时的请求和 ov chat,无需在多个构造点重复传递 CA 配置。

Human Involvement

  • A human participated in the implementation or review loop
  • This PR was generated entirely by AI agents without human participation in the loop

Related Issue

Fixes #6289

#6288 已单独修复 TLS 底层错误被隐藏的问题;本 PR 只处理 CA 信任来源,不重复修改错误展示逻辑。

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Refactoring (no functional changes)
  • Performance improvement
  • Test update

Changes Made

  • 在 crates/ov_cli/Cargo.toml 的 reqwest features 中增加 rustls-tls-native-roots,保留现有 rustls-tls,使 native roots 与 WebPKI roots 同时加载。
  • 更新 Cargo.lock,将 rustls-native-certs 纳入 reqwest 的已解析依赖。
  • 更新中英文 CLI README,说明系统信任库、SSL_CERT_FILE 和 Unix SSL_CERT_DIR 的使用方式,并明确 TLS 证书校验不会被关闭。
  • 不新增 ca_cert 配置字段,不修改现有 HTTP client 构造函数,不引入 danger_accept_invalid_certs,也不把任何用户 CA 打包进 ov。

验收条件与实现对应关系:

验收场景 实现保证
系统已信任私有 CA 时 ov health 可连接 rustls-native-certs 加载操作系统原生信任库
通过证书文件提供私有 CA rustls-native-certs 读取 SSL_CERT_FILE / SSL_CERT_DIR
ov chat 使用相同信任来源 Cargo feature 对 crate 中所有 reqwest client builder 生效
公共 HTTPS 服务保持可用 继续启用 rustls-tls-webpki-roots
未受信任证书仍被拒绝 未关闭或绕过 rustls 证书验证

Testing

  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • I have tested this on the following platforms:
    • Linux
    • macOS
    • Windows

编译检查:

cargo check -p ov_cli

结果:通过,无新增编译错误或 warning。

依赖特性检查:

cargo tree -p ov_cli -e features | rg "rustls-tls|rustls-native-certs|webpki-roots"

结果确认 reqwest 同时启用:

  • rustls-tls-webpki-roots
  • rustls-tls-native-roots
  • rustls-native-certs v0.8.3
  • webpki-roots v1.0.6

完整 Rust CLI 测试:

RUST_MIN_STACK=16777216 cargo test -p ov_cli

结果:

  • 单元测试:513 passed, 0 failed
  • 集成测试:4 passed, 0 failed

当前 main 上部分大型 Clap/help 测试在 macOS 默认测试线程栈下会发生 stack overflow,因此本地全量验证显式增大 RUST_MIN_STACK;这不会改变被测代码或测试逻辑。

静态检查:

git diff --check

结果:通过。

本地未搭建真实 Caddy/private CA OpenViking 服务做端到端连接测试;本次变更直接使用 reqwest 官方 native-roots feature,并通过最终 Cargo feature tree 验证 WebPKI roots 与 native roots 已同时进入 ov_cli。

Checklist

  • My code follows the project coding style
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • Any dependent changes have been merged and published

本 PR 不修改 Rust 源码,因此没有需要新增注释的复杂逻辑。rustls-native-certs 已是已发布依赖,并由 reqwest feature 管理。

Screenshots (if applicable)

不适用。本 PR 只调整 CLI TLS 根证书来源和文档,没有界面变化。

Additional Notes

这是有意保持最小范围的修复:系统或用户负责管理可信私有 CA,ov 只读取标准系统信任来源。若未来需要不同 ovcli.conf profile 分别使用不同 CA,再单独评估显式 ca_cert 配置;该能力不属于本 Issue 的必要改动。

@qin-ctx
qin-ctx merged commit 5d10274 into volcengine:main Oct 20, 2026
18 of 19 checks passed
@github-project-automation github-project-automation Bot moved this from Backlog to Done in OpenViking project Oct 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

[Feature]: ov CLI cannot trust a private CA certificate

2 participants