尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Search 浏览器如何静默自我更新?带 Developer ID 签名校验的更新器全解析

Search 浏览器如何静默自我更新?带 Developer ID 签名校验的更新器全解析 Search 浏览器如何静默自我更新带 Developer ID 签名校验的更新器全解析【免费下载链接】SearchA small, fast WebKit browser for macOS, by Office Commun.项目地址: https://gitcode.com/gh_mirrors/search59/SearchSearch 是一款运行在 macOS 上的轻量 WebKit 浏览器约 3 MB由设计工作室 Office Commun 打造。它内置了一个静默自我更新机制每天在后台检查一次新版本静默下载更新包并通过 SHA256 哈希与 Developer ID 签名校验确认来源可信后悄悄替换到原安装位置——下次启动即生效全程不打断你正在浏览的页面。本文带你完整拆解这套带 Developer ID 签名校验的更新器是如何工作的。没有框架、没有守护进程一个 JSON 文件搞定一切传统 macOS 应用的自动更新往往依赖第三方更新框架或常驻后台的守护进程。Search 的更新器反其道而行源码注释把立场写得很直白Updater.swift❌ 不用任何更新框架不运行任何后台守护进程✅ 只在下载页旁边放一个小小的appcast.json文件记录最新版本号、ZIP 包地址、SHA256 校验值✅ 每天读一次、用户手动点检查时再读一次若文件里提到的构建比当前更新就把对应的 ZIP静默下载、检查、放进应用所在目录下次打开时就是新版本✅ 永远不会自己重启应用——你正在读的页面不会因为浏览器想变新而被中断这是Chrome 的思路没有 Chrome 的机器。检查节奏一天一次开着就每小时看一次自动检查由 checkIfDue 控制规则很克制场景行为每次启动距上次检查超过20 小时才真正去读 feed否则跳过应用常驻运行挂一个每小时触发一次的计时器容忍 5 分钟防止开着浏览器一周就永远不检查手动触发设置 › 关于 里有Check now按钮点一下立即检查![说明] 每次检查完都会记录时间在设置页显示X 前检查过——每天自动一次Settings.swift。下载前的三道安全闸门 在真正下载 ZIP 之前更新器会先对 feed 里的地址做严格把关link只接受 HTTPS唯一的例外是测试构建通过环境变量SEARCH_FEED指向自己的测试 feed正式版无论怎么启动都只认官网 feed同域校验ZIP 与 DMG 的地址必须和 feed 本身在同一个主机上——即使 feed 主机被攻陷或 DNS 被劫持它也无法把去这里下载的指引指到别的地址缺校验值即拒绝build.sh发布时一定会写入 SHA256所以一个缺少校验和的 feed 会被当作不是我们的 feed直接拒收核心环节Developer ID 签名校验拿到 ZIP 后Swap.install 会依次执行下载 → 比对哈希 → 用ditto解压 → 签名校验 → 替换任何一步失败都整体放弃。签名校验verify是整套机制的信任基石是同一个应用新包的CFBundleIdentifier必须与当前运行的 Search 完全一致确实更新新包的构建号build number必须严格大于当前版本防止回滚更新严格签名检查用SecStaticCodeCheckValidity执行kSecCSStrictValidate | kSecCSCheckAllArchitectures | kSecCSCheckNestedCode——对每个架构、包括所有嵌套代码做严格验证证书链必须落在 Apple要求串developerID要求证书链以Apple 根证书为锚点、经过 Apple 的Developer ID 中间机构、叶子为 Developer ID Application 证书且subject.OU必须等于正在运行的这个应用的 Team ID源码里有一句很关键的话从签名里读出的 Team ID 只是证书自己声称的东西而任何人都能造一张那样声称的证书——所以必须走 Apple 锚点的完整链校验而不是只读 Team ID。自编译版本永远不会被自动更新自己swift build出来的构建是 ad-hoc 签名没有 Team ID更新器会直接以unsignedHere拒绝——一个无法与任何别的东西区分开的应用绝不接受换壳。原子替换两次重命名且绝不自动重启 通过全部检查后替换swap只靠同一磁盘卷上的两次 rename把当前的Search.app改名为Search.app.old旁路暂存把新包 rename 到正式位置若第二步失败立即撤销第一步应用原封不动几个精妙之处rename 而非复制同卷操作几乎是瞬时且原子的正在运行的进程不受影响——内核会跟着 rename 走旧版本继续从.old运行且它的签名身份没变钥匙串项对它依然有效更新器只删除自己产生的东西临时目录和那个.old包。.old的清理sweep只在退出时、以及下次启动时应对上次非正常退出进行且会先确认它确实是本应用才动手你的数据一个字都不会碰更新器有意放过了一切用户数据Updater.swift 注释~/Library/Application Support/Search里的会话、历史、书签、隐藏元素 →不读、不搬、不重写com.officecommun.search的默认设置、钥匙串 →原封不动新旧包保持相同的 bundle id 和签名身份因此旧构建存进钥匙串的密码新构建开箱即读换用新版本的时机完全由你决定要么下次自然启动生效要么在设置里点Relaunch now实现上用一个 shell 等待本进程退出后再open应用relaunch失败兜底与用户控制权情况更新器的应对安装目录不可写如只读挂载切换为offered状态在应用内提示新版本已发布附 DMG 下载按钮——和第一次安装一样设置中关闭Install updates on its ownSettings.swift默认开启关掉后更新器只告知Search x.x 已发布——在设置里等你手动点 Installfeed 声明的最低系统版本高于本机该版本对你不算更新直接不展示发布侧三个文件如何严丝合缝配对更新能静默成立靠的是发布流水线的配合build.sh产出Search.dmg给人Search.zip给更新器并同时生成appcast.json——版本、构建号、两个下载地址、ZIP 的 SHA256、更新说明、最低系统版本一个字段不少publish.sh把这三个文件原样拷到官网目录文件名永不改变所以站点链接、更新器的 feed 地址都永远有效公证策略DMG 会被公证并 staple首次打开即通过 GatekeeperZIP 则交给更新器自己把关——哈希 签名校验就是它的 Gatekeeperbuild.sh 注释小结Search 的更新器是小而自洽的典范值得每个做 macOS 应用的人参考环节做法换来什么检查一天一次 常驻每小时一次不打扰、不漏查传输单文件 JSON feedHTTPS 同域无劫持面信任SHA256 Developer ID 全链严格签名 Team 匹配换壳攻击不成立替换同卷两次原子 rename失败回滚应用永不损坏数据只动 bundle不碰设置与钥匙串密码、历史无缝继承控制权从不自动重启关自动安装则只提示用户始终在方向盘后想深入了解更新相关的安全边界比如更新通道本身属于漏洞报告范围可以阅读 SECURITY.md整体架构与设计取舍则见 README.md。【免费下载链接】SearchA small, fast WebKit browser for macOS, by Office Commun.项目地址: https://gitcode.com/gh_mirrors/search59/Search创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表