换了台新电脑,同事甩过来一个crx文件,说“内网办公系统要用的NTKO插件,你帮我装上”。我打开chrome://extensions/,把文件拖进去,Chrome立刻弹了一个红底提示:“无法安装扩展程序,因为它使用了不受支持的清单版本”。再查一下浏览器版本,Chrome 130。得,又是Manifest V2的坎。
这事最近越来越常见。Chrome从2024年开始逐步停用基于Manifest V2的扩展,大量老crx离线包(cat-catch 1.0.16、各种OA系统配套插件、老版抓包工具)在新版Chrome面前集体翻车。偏偏在隔离网、政务内网这些环境里,没法实时从网上应用店拉最新版本,crx离线包几乎是唯一选择。所以这两年,会正确下载crx、会离线安装、会处理“清单版本”报错,已经成了刚需技能。
这篇我把完整的处理思路写出来,包括crx离线包从哪搞、怎么装、遇到不同报错怎么排查,以及我实际踩过的几个坑。普通用户能用,IT运维也能当操作手册参考。
1. 先从“Chrome 109”说起:为什么老Chrome反而能装老crx
1.1 一个反直觉的结论
扩展程序和浏览器版本之间,存在一个很多人没意识到的绑定关系:Chrome越新,能装的旧crx反而越少。原因不是兼容性越来越差,而是Google在有意清理“老格式”的生态安全债。
早期Chrome扩展用的都是Manifest V2(清单版本2),它允许扩展请求非常宽泛的权限,比如“读取所有网站数据”“拦截和修改网络请求”。2018年前后Google开始设计Manifest V3,2023年正式宣布MV2退役,之后新上架的扩展必须是MV3,并逐步禁止旧版扩展运行。你手里的老crx如果还在用MV2,浏览器版本越高,被拦下的概率就越大。
这就导致一个看起来很“反常识”的现象:一台停在Chrome 109的老电脑,能轻松装上十几年前的老crx;而一台Chrome 127以上的新电脑,反而会直接拒绝安装。所以,排查任何crx安装问题,第一步永远是确认浏览器版本。
1.2 MV2封禁时间线整理
我根据自己接触到的实际案例,整理了一条大致的时间线,不一定覆盖到所有渠道,但主体脉络是清晰的:
| 时间节点 | Chrome版本 | 现象 |
|---|---|---|
| 2020年之后 | Chrome 88+ | 开始接受Manifest V3扩展,但MV2还能正常用 |
| 2023年上半年 | Chrome 109附近 | 网上应用店停止接受新MV2扩展上架,但已安装的不受影响 |
| 2024年年中 | Chrome 127+ | 开始对部分用户的旧MV2扩展显示“此扩展程序不再受支持”,分批停用 |
| 2024年下半年 | Chrome 129+ | 逐步扩大禁用范围,企业策略成为保留MV2的主要合法通道 |
| 2025年 | Chrome 130+ | MV2基本退出稳定版,未处理的扩展一律停用 |
注意中间几个节点的灰度周期很长,不同地区、不同渠道包表现不一样。我见过有人Chrome 126还挂着MV2扩展好好的,也有人Chrome 127刚更新就被停了。所以别拿别人的版本号来对照自己,要以自己机器上的实际提示为准。
1.3 安装前一定要先查版本
在线地址栏输入chrome://version/,能看到完整的版本号。第一串数字是大版本,比如 “131.0.6778.86” 就是Chrome 131。判断方法很简单:
- 大版本号在 127 以下,MV2的crx还有较大概率拖拽安装成功。
- 大版本号在 127 及以上,MV2扩展基本会被拦,需要考虑换MV3版本或走受管策略。
- 大版本号停在 109 或更低,说明系统可能是Windows 7/8.1老机器,Chrome已经不再提供更新。这种情况下老crx能装,但浏览器本身有大量已知漏洞,不建议长期使用。
我处理内网机器时的原则是:能用新系统就升新系统,能装新扩展就换新扩展,实在被老系统绑住才保留老版本Chrome,而且要确保浏览器不连外网,只跑内网应用。
2. crx离线包究竟从哪里搞:三种可以落地的获取方案
2.1 从已安装的电脑上“复制”扩展
最省事的方案其实不用下载crx——直接从一台已经装好扩展的电脑上把扩展目录整个拷走。Chrome把每个扩展都解压存放在固定位置:
C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data\Default\Extensions\扩展ID\版本号_0\这里“扩展ID”是一串32位小写字母,每个扩展唯一。进去之后,你会看到manifest.json、js、css、_locales这些文件和文件夹,这其实就是扩展的源码形态。
操作步骤:
- 在源电脑上进入上述目录,找到目标扩展的文件夹。
- 把整个“版本号_0”文件夹复制到U盘或内网共享目录。
- 在目标电脑打开
chrome://extensions/,打开右上角“开发者模式”。 - 点击“加载已解压的扩展程序”,选中刚拷过来的文件夹。
这个方法的优点是不依赖网上应用店,环境彻底离线也能用,特别适合内网批量部署。缺点是没有签名信息,浏览器会出现“请停用以开发者模式运行的扩展程序”之类的提示,有些对安全要求高的系统会自动忽略这种扩展。
2.2 应用店页面里的下载技巧
如果需要拿一份“官方来源”的crx,可以在能打开Chrome网上应用店的机器上,用开发者工具直接抓下载地址。打开扩展详情页,按F12进入开发者工具,切换到Network(网络)面板,刷新页面,过滤条件里输入crx。列表里会出现类似下面的请求:
https://clients2.google.com/service/update2/crx?response=redirect&prodversion=109.0.5414.0&x=id%3D扩展ID%26uc这就是Chrome商店下载crx的真实接口。右键这条请求,选“Open in new tab”或“Copy link address”,就能拿到crx文件。URL里的prodversion参数很关键,它表示“我是哪个版本的Chrome在请求下载”。改成不同的版本号,拿到的crx格式也会不同。比如prodversion=49.0.2623.75大概率返回的是老式crx2格式,而新版Chrome默认请求的是crx3格式。
如果你没有条件用开发者工具,也可以手动拼这个地址:把扩展ID换成实际ID,放到浏览器地址栏访问,同样能下载。注意这个接口返回的是重定向,浏览器会自动跳到crx文件。
2.3 第三方站点和自制crx
网上有不少“crx镜像站”能把商店里的扩展打包给你,但我在实际工作中从不建议用它们安装到正式环境。原因不是那些站点一定有毒,而是你无法验证拿到的文件到底有没有被动过手脚。商店里上架的扩展经过审核,镜像站可没有,zip包里被植入一段收集Cookie的脚本,肉眼根本看不出来。如果你非要用第三方来源,至少做两件事:核对文件哈希和扩展ID是否与官方一致,并且只在内网测试机先跑几天。
另一个思路是自制crx。Chrome本身提供了打包命令格式:
chrome.exe --pack-extension="D:\ext" --pack-extension-key="D:\ext.pem"其中D:\ext是解压后的扩展目录,--pack-extension-key可以省略,省略时Chrome会生成新私钥。执行成功后会生成一个.crx文件和一个.pem私钥文件。私钥要妥善保管,因为后续更新这个扩展还必须用同一把私钥签名,丢了私钥等于丢失这个扩展的“身份”。
如果想自己做一套自动化下载更新流程,还可以写脚本定期访问网上应用店的update2接口,拉最新crx传到内网服务器。基本逻辑是:拿扩展ID请求update2接口,解析返回的XML,取出codebase地址下载即可。
3. 离线安装的标准动作:开发者模式、改后缀、拖拽与加载文件夹
3.1 先看看crx文件里到底是什么
crx不是一个全新的格式,说白了就是“文件头+zip压缩包”。文件头以Cr24开头,后面跟着版本号、公钥、签名等元数据,再往后就是一个标准的ZIP。所以把crx后缀改成.zip,用7-Zip或WinRAR就能直接解开。
这个操作在排查问题时常用来“验尸”。比如网上搜到的cat-catch 1.0.16 官方 crx 离线包,下载后双击装不上,我先改后缀解压,打开里面的manifest.json,看最顶部的manifest_version字段。那个字段写的是2还是3,直接决定了Chrome版本和它的关系。
{ "manifest_version": 2, "name": "Cat Catch", "version": "1.0.16", ... }一旦看到"manifest_version": 2,基本可以判定是新版Chrome装不了。这时候再折腾拖拽、改后缀都没有意义,属于白费力气。
3.2 两条安装路径
我把离线安装的路径归纳为两条,适用场景不同:
- 拖拽安装。把crx文件直接拖到
chrome://extensions/页面。前提是开发者模式处于打开状态。如果你在应用店外拖入一个没有经过Chrome登录验证的crx,浏览器会默认拦截,提示“无法安装扩展程序”,只有开发者模式才能接收这种本地包。这个方法适合装网上商店里拿到的、有签名的crx。 - 加载已解压的扩展程序。把crx解压成文件夹之后,在开发者模式下点“加载已解压的扩展程序”,选择那个文件夹。这个方法适合从别的电脑“复制”过来的扩展目录,也适合自己开发的扩展,还可以边改代码边点刷新调试。
两条路径的完整对比:
| 维度 | 拖拽crx | 加载已解压的扩展程序 |
|---|---|---|
| 前置条件 | 需要开发者模式开启 | 需要开发者模式开启 |
| 是否要求签名 | 有签名更好,无签名也能走开发者模式 | 不关心签名 |
| 结果形态 | 安装为正式扩展 | 以开发者模式扩展运行 |
| 自动更新 | 有签名且来自商店源时可能更新 | 没有自动更新 |
| 适合场景 | 拿到官方crx文件 | 内网copy目录、开发调试 |
3.3 完整操作清单
具体操作时,我建议按这个顺序走:
- 打开
chrome://extensions/,把右上角的“开发者模式”开关打开。 - 找一个好识别的目录,比如
D:\crx_tmp,把crx放进去。 - 如果是拖拽安装,直接把crx拖进页面,看到“拖放以安装”的提示后松手。
- 如果拖拽失败,把crx改成zip解压到一个文件夹,再点“加载已解压的扩展程序”选择那个文件夹。
- 安装完成后,去列表里找扩展卡片。如果卡片下方出现“错误”按钮,点开看具体报错信息。很多“安装失败”的真正原因,其实藏在“错误”里。
把这几步做完,大多数简单的离线安装都能落地。真正麻烦的是装完之后被Chrome禁用、或者直接弹“清单版本不受支持”,这就进入下一节的内容了。
4. 实战排错:从“清单版本”到“不再受支持”的完整排查链路
4.1 拦路虎一:“无法安装扩展程序,因为它使用了不受支持的清单版本”
这个报错,本质是浏览器检测到crx里的manifest_version为2,而当前Chrome版本已经不允许新装MV2扩展。它在拖拽安装和加载文件夹时都可能出现,即使你开着开发者模式也一样拦。
我排查这个报错的顺序是固定的:
- 先看
chrome://version/的版本号,确认是127以上还是以下。 - 解压crx,看
manifest.json里的manifest_version。 - 双确认后分路径处理:
- 如果扩展本身有MV3新版本,直接去找新版本,这是最干净的办法。
- 如果扩展已经停止维护,只能找替代扩展,或者评估能不能接受“受管策略”方案(见4.4)。
- 如果是在内网环境且扩展很关键,再往下走企业策略。
网上有些教程教你直接改manifest.json里manifest_version字段,写成3就能装。我直接说结论:大多数情况下没用。MV2和MV3背后的API差异很大,比如MV2的background配置是一组脚本,MV3改成了service_worker;MV2的browser_action在MV3里改名成了action;MV2的webRequestBlocking权限在MV3里默认不可用。你把版本号改成3,Chrome按MV3规则去解析,代码根本对不上,照样报错甚至直接白屏。这个字段的修改属于扩展开发者的工作,普通用户不要指望靠这一招救活老插件。
4.2 拦路虎二:“此扩展程序不再受支持,因此已停用”
跟安装时被拒不同,这个提示出现在扩展已经装好、浏览器自动更新后被禁用的场景。典型画面是:Chrome更新到127+之后,扩展列表里一堆灰色卡片,写着“此扩展程序不再受支持,因此已停用”,旁边还有个“移除”按钮。
遇到这种情况,有两点需要确认:
一是确认哪些扩展被停了。点进灰色卡片,Chrome不会告诉你“因为是MV2所以被停”,它只会给出一个泛泛的理由。你可以去网上应用店搜索该扩展当前是否仍在维护,如果已经下架,基本就是MV2停用没跑了。
二是有没有临时恢复的可能。某些Chrome版本在这类卡片的详情里提供了一个“暂时重新启用”的选项,但Chrome会反复提醒你“该扩展不再受支持”,而且在下次浏览器重启或版本更新后大概率会再次禁用。它只能用来临时导出数据、做一次紧急操作,不适合当作常规运行方案。
4.3 拦路虎三:“无法加载清单”和“清单文件缺失或不可读取”
这个报错多发生在“加载已解压的扩展程序”时,和版本新旧没关系,属于基础路径问题。
常见原因有三个:
- 选错了目录。比如你把“版本号_0”下面的某个子文件夹当成扩展目录,那个文件夹里没有manifest.json,Chrome当然不认。
- 文件名大小写或编码问题。manifest.json必须是这个文件名,不能是manifest.JSON或manifest_v2.json;文件内容必须是UTF-8编码。
- JSON语法错误。用文本编辑器打开manifest.json,确认没有多余的逗号、缺少引号。可以用在线JSON校验工具或本地Node执行
JSON.parse来检查。
我第一次给内网机器装NTKO插件时,就是拷目录的时候漏掉了_locales文件夹,结果扩展加载出来是灰的,页面跟插件的通信完全不工作。后来把整个“版本号_0”目录完整拷过去才正常。所以每次拷贝前,我会先对比源目录和目标目录的文件数量。
4.4 走正门:企业策略和注册表
很多读者看到这里会问:我确实需要用一个老MV2扩展,但Chrome又不让装,能不能通过某种方式把MV2重新打开?答案是:可以,但要走官方提供的受管策略接口。
Chrome为企业和组织提供了ExtensionManifestV2Availability这项策略,通过注册表可以控制浏览器是否启用手动MV2扩展。Windows环境下,注册表路径是:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome新建DWORD值,名称ExtensionManifestV2Availability,设置为2(表示“允许使用MV2扩展”)。部分场景还需要配合:
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist在里面新建字符串值,内容填:
扩展ID;https://clients2.google.com/service/update2/crx设置完成后,重启浏览器,在地址栏打开chrome://policy能看到策略是否生效。
但我要强调两点。第一,这是企业策略设计,面向IT管理员,不是给普通用户“解锁”用的。个人手动改注册表属于自担风险。第二,MV2被抛弃的直接原因是不安全,老扩展权限过大且漏洞无人维护,强行启用意味着把这些风险带进系统。在隔离内网可以评估,在连外网的机器上,我强烈不建议这么干。
5. 我踩过的一些坑:扩展ID、导出目录和安全软件
5.1 导出扩展目录后加载失败,图标是灰色的
我在处理一个文档签章控件时,完整拷贝了扩展目录,加载却报“清单文件缺失或不可读取”。后来发现原因很蠢:Chrome的扩展目录里,版本号子目录名末尾有个_0,但不同Chrome版本可能显示为_0或直接_5这种增量编号。我拷的时候只拷贝了其中的部分文件,没带上_locales这种多语言文件夹,导致加载后扩展的功能跑不起来。
正确做法是确认目标文件夹里直接躺着manifest.json,然后把整层文件夹完整复制,不要漏掉任何子目录。
5.2 crx被安全软件拦了
这个坑比较隐蔽。有次我下载一个抓包扩展的crx,保存时杀毒软件直接弹窗,说是风险软件。仔细一看,那个扩展本身功能完全正常,只是它需要拦截网络请求,被安全软件的行为检测误判了。
如果你遇到类似情况,别急着关安全软件硬装。先在病毒查杀记录里看报毒文件是不是从官网下载、哈希是否一致;确认没问题后,可以在杀毒软件里单独加白名单,而不是全局关闭防护。企业终端管理软件同理,让管理员单独放行即可。
5.3 离线装的扩展为什么不会自动更新
这个问题很多人忽略。通过拖拽或加载文件夹方式装的扩展,默认没有更新源,所以永远不会自动更新。即使官方修了漏洞,你手里的版本也一直带病运行。想要内网扩展持续更新,正规做法有两种:
- 在每台机器上用
ExtensionInstallForcelist指向官方update2接口,浏览器自己拉新版本。 - 如果你有内网更新服务器,可以在服务器上放一个update manifest XML文件,把最新版本号、crx下载地址填进去,再通过Chrome策略把更新源指向内网地址。这个XML的格式不算复杂,主要字段包括
updatecheck的codebase和version属性,工具版本号变了,客户端就会去拉新的crx并自动更新。
如果只是少数几台机器,更省事的做法是定期去官方商店抓最新crx,然后重新用加载文件夹的方式覆盖一次。注意覆盖时要选同一个扩展目录,保证扩展ID不变,否则设置和数据可能丢。
5.4 顺便说一句“chrome 内容过曝”的搜索流量
很多下载crx的人会同时搜“chrome内容过曝”。这问题跟扩展安装关系不大,多半是视频播放页面开了HDR、系统显示色彩管理出问题,或者OBS这类软件抓屏后颜色发白。可以先去chrome://flags/搜color,把跟HDR/色彩管理相关的实验项重置为默认,再看系统显示设置里是否打开了“自动调整颜色”。如果只是个别网页发白,通常跟网页自身样式或GPU加速有关,尝试关闭“使用硬件加速”后再看。排查方向先往系统和显示去,不用重装Chrome,也别费劲去卸载扩展。
最后的一点实操体会
我现在的处理流程已经固定下来了:拿到一个crx,先看文件后缀改不改得开、manifest_version是几,再确认Chrome当前大版本,最后才决定是拖拽安装、加载文件夹,还是走策略。这看上去多花了两分钟,实际上能省掉后面大量试错时间。
如果你是在企业或内网环境帮同事处理插件,建议把这类常用扩展的crx文件和对应私钥统一收好,放到一个内部共享目录里,做成一个小型知识库。别等某天全公司OA突然瘫痪,再四处找旧版本,那时候你会发现连一份能用的crx离线包都很难找。