软媒设计
This is my life!
1Password 6 扩展 MV3 移植版

此前在 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_actionactionbackground.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 会提示,纯外观问题
  • 桌面端报错 103Browser's runtime signature invalid (103) 是 1Password 6 的 Chrome 签名白名单过时所致,与移植本身无关,修复方法见下文
  • 无后续更新:静态补丁,不会有新功能和安全修复

安装方法

  1. Releases 下载最新 zip
  2. 解压到固定目录(不能删除,删除后扩展即失效)
  3. 打开 chrome://extensions,开启右上角"开发者模式"
  4. 点"加载已解压的扩展程序",选择解压目录

更新时覆盖文件后,在扩展卡片点刷新图标即可。

桌面端修复: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 认可的移植,仅用于归档和兼容目的。请自行评估使用风险——毕竟是修改了原厂签名文件的扩展,建议配合最小权限原则使用。

仓库地址:xun404/1password-extensions-mv3