此前在 Chrome V99 版本检查绕过方案中,只解决了临时兼容问题。那个方案只撑到 Chrome 停用 Manifest V2——当 Chrome 把 MV2 扩展全部禁用后,1Password 6 的官方扩展直接被判死刑。
问题的本质
1Password 6 是最后一代支持本地保险库(本地 .opvault)的桌面客户端,之后的版本强制迁移到 1Password 账号云存储。问题在于:
- 1Password 7+ 的 Chrome 扩展只支持 1Password 账号,不再与本地保险库通信
- 1Password 6 时代配套的扩展是 Manifest V2,已被 Chrome 全面停用(“This extension is no longer supported”)
- 官方不给 1Password 6 更新扩展
结果就是:坚持本地保险库的用户,Chrome 里没有可用的 1Password 扩展。
思路:把 MV2 扩展改造成 MV3
1Password 6 扩展最终版是 v4.7.5.90(MV2)。MV3 与 MV2 的核心差异在于背景脚本模型:MV2 是长期运行的 background 页面,MV3 改成了可被回收的 service worker,且 webRequestBlocking 等 API 被移除。
移植工作集中在三处:
1. manifest.json
{
"manifest_version": 3,
"background": {
"service_worker": "background-wrapper.js"
},
"action": {},
"host_permissions": ["<all_urls>"]
}
browser_action 改 action,background.persistent 删除,权限模型按 MV3 声明。
2. background-wrapper.js
扩展的全局脚本 global.min.js 是 MV2 时代的产物,直接作为 service worker 加载会报错。用一个 wrapper 做兼容层:
- 提供
window全局对象 polyfill(service worker 环境没有 DOM) - 把
browserAction调用转发到chrome.action - 剥离
webRequestBlocking相关调用(MV3 已移除)
3. global.min.js 的 contextMenus 补丁
MV3 要求 contextMenus.create 必须显式传 id,且事件改用 onClicked。原始代码没传 id,需要打补丁:
chrome.contextMenus.create({
id: "1password-fill",
/* ... */
});
已知问题
移植不是完美的,几个已知限制:
- Go & Fill 跳转失效:
webRequest.onBeforeRequest的重定向功能依赖被 MV3 移除的webRequestBlocking,表单填充和原生消息通道不受影响 - Service worker 会被回收:后台空闲时 Chrome 会终止 worker,唤醒时会自动重连原生消息,偶有感知延迟
- Chrome 标记不受信任:文件被修改后与 Web Store 的哈希不一致,Enhanced Safe Browsing 会提示,纯外观问题
- 桌面端报错 103:
Browser's runtime signature invalid (103)是 1Password 6 的 Chrome 签名白名单过时所致,与移植本身无关,修复方法见下文 - 无后续更新:静态补丁,不会有新功能和安全修复
安装方法
- 从 Releases 下载最新 zip
- 解压到固定目录(不能删除,删除后扩展即失效)
- 打开
chrome://extensions,开启右上角"开发者模式" - 点"加载已解压的扩展程序",选择解压目录
更新时覆盖文件后,在扩展卡片点刷新图标即可。
桌面端修复:Browser’s runtime signature invalid (103)
安装后浏览器控制台可能出现:
[AGENT:NM] Unrecoverable state: Browser's runtime signature invalid (103)
这不是移植版的 bug。1Password 6 桌面端通过原生消息通道校验 Chrome 运行进程的代码签名,白名单停留在 2018 年,只认 Developer ID Application: Google, Inc. (EQHXZ8M8AV) 证书;现代 Chrome 由 Google LLC (EQHXZ8M8AV) 签名,校验必然失败。2023 年的补丁改的正是这个校验点,但 6.8.9 的字节偏移不同,照搬无效。
仓库里的 fix-1password6.sh 负责修桌面端:
- 等长替换
OnePasswordCore.framework中 2 处硬编码证书名(Google, Inc.→Google LLC),保留签名校验,只放行 Google LLC 签名的 Chrome - 打补丁后用系统 API(
SecStaticCodeCheckValidityWithErrors)实测本机 Chrome 满足新白名单,不满足即中止 - 只对框架重新签名(默认 ad-hoc,无需证书),App 其余部分一律不动
用法(先彻底退出 1Password 和菜单栏的 mini):
bash fix-1password6.sh
三步交互:选择语言 → 只读环境检查并确认 → 最终执行确认。遇到非预期版本的文件会安全中止;成功后打印精确的回滚命令。
重要提示
- 补丁后绝不要
codesign --deep整包重签。重签登录项2BUA8C4S2C.com.agilebits.onepassword4-helper(即 1Password mini)会破坏 macOS 13+ 的后台项(BTM)注册,launchd 拒绝拉起 mini,扩展报"1Password 连接至 1Password mini 失败"。 - 若 mini 因其他签名改动起不来:
sudo sfltool resetbtm后重启,再打开 1Password。
风险提示
这是非官方、无支持、不受 AgileBits 认可的移植,仅用于归档和兼容目的。请自行评估使用风险——毕竟是修改了原厂签名文件的扩展,建议配合最小权限原则使用。


