codex-desktop-linux信任链详解:从GPG签名验证到ASAR字节级一致的完整保障机制
【免费下载链接】codex-desktop-linuxUnofficial ChatGPT desktop app for Linux (formerly the Codex app), built locally from OpenAI’s official macOS app. Includes Chat, Work, and Codex. Packages for Debian/Ubuntu (.deb), Fedora/openSUSE (.rpm), Arch (pacman), Nix/NixOS, and AppImage, with Wayland and X11 support.项目地址: https://gitcode.com/gh_mirrors/co/codex-desktop-linux
codex-desktop-linux是非官方的 Linux 版 ChatGPT 桌面应用(社区版,菜单中显示为ChatGPT Community)。它以 OpenAI 官方签名的 Linux 包为唯一上游来源,通过「GPG 签名验证 + 逐级 SHA-256 校验 + ASAR 字节级一致」三道关卡,保证你安装的每个字节都可追溯到官方签名。本文带你完整走一遍这条信任链 🔗
信任链全景:四个环节层层把关
整条链可以概括为一句话:先证明索引是真的,再证明包是真的,最后证明应用没被改过。官方架构图在 docs/architecture.md 中:
社区应用图标(带蓝色 C 标记),用于在桌面菜单中与官方ChatGPT区分。
第一步:固定 GPG 公钥,锁定指纹
信任的起点是一把固定在仓库里的 OpenAI 公钥,而不是系统里"恰好存在"的密钥环。相关文件:
- 公钥(Base64 编码):assets/openai-codex-linux-repository-key.gpg.base64
- 验证逻辑:scripts/lib/upstream-linux-package.js
在 scripts/lib/upstream-linux-package.js 中,官方密钥指纹被硬编码:
3BFA0E4AE8B8CC16A2D9BA684A3B4A566C4660E4构建时脚本会先把 Base64 公钥解码为临时密钥环文件(权限 0600),再调用gpg --show-keys --with-colons检查该公钥的指纹是否完全匹配上面这个值——指纹对不上就直接报错退出,杜绝"同名字段不同密钥"的伪造场景。
第二步:InRelease → Packages → .deb 的三级哈希链
签名公钥确认后,校验沿着「索引签名 → 索引摘要 → 包摘要」逐级向下传递,核心代码见 verifyInRelease() 与 verifyIndexedFile():
| 关卡 | 校验对象 | 手段 |
|---|---|---|
| ① | dists/stable/InRelease | gpgv --keyring验证 OpenAI 明签签名 |
| ② | main/binary-<arch>/Packages | 比对 InRelease 载荷中 SHA256 段记录的哈希(+文件大小) |
| ③ | chatgpt_<版本>_<架构>.deb | 比对 Packages 索引中该条目的 SHA-256(+Size) |
除了哈希,脚本还会做结构性检查:
- 从 Packages 的 deb822 条目中必须恰好找到 1 个
chatgpt/<架构>条目(selectChatgptPackage()); - 版本号、
Filename路径形态、SHA256 格式、Size 任一不合规则整体失败; - 下载文件以
0o600权限落盘,防止中途被其他用户篡改。
整个流程刻意不信任latest这类"移动别名"下载链接——docs/architecture.md 明确写道:信任只来源于InRelease签名、Packages摘要、包 SHA-256 这条链。
第三步:ASAR 字节级一致——没打补丁就不许动
app.asar是 Electron 应用的核心代码包。本项目对它的态度非常"硬":
只要没有任何启用的功能需要修改 ASAR,
resources/app.asar原样复制,其 SHA-256 必须与官方包完全相等——连 ASAR 解包工具都不会运行。
实现位于 scripts/lib/asar-patch.sh:
- 无描述符时(linux-features/features.example.json 默认不启用任何功能):直接写一份"空补丁报告",记录
preservedByteForByte: true(write_empty_feature_patch_report); - 有描述符时:在临时目录解包 → 应用声明式补丁 → 用固定文件排序
--ordering确定性重打包→ 生成补丁报告,分别记录上游 ASAR 与产物 ASAR 的 SHA-256(record_patch_report_asar_hashes); - 如果补丁描述符一个字节都没改到东西(上游版本漂移但无实际变更),则放弃重打包,继续保留官方 ASAR 的字节一致性;
- 反之,若某个启用功能出现漂移(补丁找不到目标代码),该候选版本会被直接拒绝,不会进入安装。
这正是 README.md 所说的核心不变量:"With no ASAR-changing feature enabled,resources/app.asarremains byte-for-byte identical to the official package."
第四步:失败即关闭(Fail-Closed)——错误永远不会被"绕过"
信任链的最后一道哲学是任何一环失败都不降级、不提示"跳过":
- 签名错、哈希错、包名/版本/架构错、载荷不完整 → 构建中止,候选版本不被接纳(docs/architecture.md 的 "Architecture invariants");
- 构建是事务性的:先在并行的
codex-app-next/生成候选,全部校验通过后才原子替换现役应用树; - README.md 的排障建议也很直接:"Signature or package verification fails — Do not bypass it"——检查系统时间、网络、
gpgv是否安装、架构与磁盘空间,而不是想办法跳过校验。
上游包维护脚本(scripts/lib/upstream-linux-package.sh)解包官方载荷时不执行任何 maintainer 脚本,且官方包的 APT 源配置与安装脚本永远不会混入社区包——防止官方包管理器"接管"/opt/codex-desktop。
自更新环节:codex-update-manager 如何延续同一信任链
原生包默认附带 Rust 写的更新管理器(源码 updater/src/,行为文档 docs/updater.md),它复用了完全相同的验证逻辑:
- 发布发现:重新验证签名的
InRelease→Packages摘要 → 包 SHA-256;版本/架构/哈希三元组没变则视为无操作; - 内容寻址缓存:下载物按
<version>-<architecture>-<sha256>.deb命名缓存,哈希即身份; - 重建:打包内的 update-builder 只提取官方载荷、应用你本地已启用的功能、生成对应格式的新包;
- 提升与回滚:应用未退出绝不替换;原子交换失败有持久日志恢复,上一版本始终保留为回滚目标,
codex-update-manager rollback一键退回。
一句话:更新过程中任何一步验证失败,现役应用永远不会被替换。
信任链速查表
| 问题 | 该看哪里 |
|---|---|
| 官方公钥与指纹 | assets/openai-codex-linux-repository-key.gpg.base64、docs/architecture.md |
| InRelease/Packages/.deb 三级校验 | scripts/lib/upstream-linux-package.js |
| ASAR 字节级一致与补丁报告 | scripts/lib/asar-patch.sh、docs/build-and-packaging.md |
| 更新器验证与回滚 | docs/updater.md、updater/src/upstream.rs |
| 构建/打包总览 | docs/build-and-packaging.md |
| 签名失败排查 | docs/troubleshooting.md |
小结
codex-desktop-linux 的信任链设计可以浓缩成三句话:
- 公钥固定——只认指纹
3BFA0E4AE8B8CC16A2D9BA684A3B4A566C4660E4对应的 OpenAI 仓库密钥; - 逐级摘要——
InRelease签名 →Packages哈希 →.debSHA-256,环环相扣、失败即中止; - 字节一致——不开功能时
app.asar与官方包逐字节相同,开了功能也有确定性重打包 + 漂移拒绝兜底。
对新手来说,你不需要记住任何细节:只要验证环节报错,按提示修时间/网络/依赖即可,永远不要试图绕过——这条链存在的意义,就是让"你装的东西确实是官方那一份"这件事有据可查 ✅
【免费下载链接】codex-desktop-linuxUnofficial ChatGPT desktop app for Linux (formerly the Codex app), built locally from OpenAI’s official macOS app. Includes Chat, Work, and Codex. Packages for Debian/Ubuntu (.deb), Fedora/openSUSE (.rpm), Arch (pacman), Nix/NixOS, and AppImage, with Wayland and X11 support.项目地址: https://gitcode.com/gh_mirrors/co/codex-desktop-linux
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考