如何禁用 Firefox 附加组件的签名检查?

IT技术 javascript firefox firefox-addon signing add-on
2021-01-22 19:11:11

从版本 42 开始,Firefox 默认拒绝安装未签名的附加组件。如何禁用此验证?

6个回答

只能在NightlyDeveloper频道中禁用插件验证换句话说,它在 Beta 版本和标准版本中不可能的

  1. 转到about:config(在地址栏中输入)
  2. 设置xpinstall.signatures.requiredfalse

更多信息请访问https://wiki.mozilla.org/Addons/Extension_Signing

在 Chrome 之后,现在 Firefox 是第二个需要我安装开发人员版本以进行正常浏览或将我的扩展程序调整为 TamperMonkey 脚本的浏览器。顺便说一句,这是一种眼镜蛇效应问题吗?
2021-03-21 19:11:11
需要明确的是,可以xpinstall.signatures.required在 Firefox 的标准版本(至少在 51.01 上)中切换该选项,但没有效果。插件仍然需要签名。
2021-04-03 19:11:11
@Dalin 我将答案扩展为更明确:Nightly 和 Develepler 频道仅意味着不在 Beta 和发布频道中。所以它在 47.0b3 中不起作用的事实与维基文档相对应。
2021-04-05 19:11:11
看起来该选项现在也可用于“常规”Firefox 版本(已在 45.0.1 上检查;不过不确定何时出现)
2021-04-06 19:11:11
从 FF 47.0b3 开始,这似乎不再起作用(如果这有所不同,则在 beta 频道上)。
2021-04-10 19:11:11

在发布(所有)版本的 Firefox 中禁用附加签名检查

Firefox 版本 65+(左右)

以下说明将禁用 Firefox 上安装文件的 Firefox 配置文件的签名检查。您将在 Firefox Profile 目录下chrome目录中添加一些文件

如果javascript.enabled设置为Falsein ,则此代码将不起作用about:config该选项需要设置为True,这是默认设置。

从 Firefox 69+ 开始,除了下面的说明外,预计您还需要toolkit.legacyUserProfileCustomizations.stylesheets设置为truein about:config如果它不存在,那么您将需要创建它(右键单击上下文菜单中的“新建”)作为布尔选项。有关添加此选项的更多详细信息,请参阅Bugzilla 1541233

我已经在 Firefox 66.0.3+ 上测试过了。

升级版本的过程似乎会在这些更改未激活的情况下短暂运行浏览器代码。因此,当您第一次运行新版本的 Firefox 时,您安装的任何依赖于禁用附加签名的扩展都将被禁用。升级到新的 Firefox 版本后,您可以立即重新安装这些扩展,这些扩展应该会恢复工作。

IIRC,Firefox 65 需要一些稍微不同的代码,我相信我在为 Firefox 66 修改它时将该代码留在disable-add-on-signing.js 中,但我不确定这一点。

我们将使用一种技术,它允许您从存储在 Firefox 配置文件目录中的文件在浏览器上下文中运行任意 JavaScript 代码。我从Haggai Nuchi 的 GitHub 存储库中找到了如何做到这一点:Firefox Quantum compatible userChrome.js

在 Windows 上,您的 Firefox 配置文件目录将为%appdata%\Mozilla\Firefox\Profiles\[profileID]. 如果您只有一个配置文件,该[profileID]目录将是该目录中的唯一%appdata%\Mozilla\Firefox\Profiles目录。如果您有多个配置文件,则需要选择要安装此 hack 的配置文件。

进入您的配置文件目录后,您将需要创建一个名为 的目录(chrome如果该目录尚不存在)。您将以下 3 个文件添加到该目录中:

  • userChrome.css
  • userChrome.xml
  • disable-add-on-signing.js

然后,您将需要 中的以下代码userChrome.css,该代码可从 Haggai Nuchi 的 GitHub 存储库获得:

/*Enable userChrome.js */
/* Copyright (c) 2017 Haggai Nuchi
Available for use under the MIT License:
https://opensource.org/licenses/MIT
*/

@namespace url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul);

toolbarbutton#alltabs-button {
    -moz-binding: url("userChrome.xml#js");
}

您将需要userChrome.xml(从Haggai Nuchi 的 GitHub 存储库中可用版本稍作修改):

<?xml version="1.0"?>
<!-- Copyright (c) 2017 Haggai Nuchi
Available for use under the MIT License:
https://opensource.org/licenses/MIT
 -->
<!-- This has been slightly modified from the version available from
https://github.com/nuchi/firefox-quantum-userchromejs/blob/master/userChrome.xml
by Makyen. The modified version is released under both the MIT and CC BY-SA 3.0 licenses.
 -->

<bindings id="generalBindings"
   xmlns="http://www.mozilla.org/xbl"
   xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
   xmlns:xbl="http://www.mozilla.org/xbl">

  <binding id="js" extends="chrome://global/content/bindings/toolbarbutton.xml#toolbarbutton-badged">
    <implementation>
        <constructor><![CDATA[
            function makeRelativePathURI(name) {
              let absolutePath = Components.stack.filename;
              return absolutePath.substring(0, absolutePath.lastIndexOf("/") + 1) + name;
            }
            // The following code executes in the browser context,
            // i.e. chrome://browser/content/browser.xul
            try {
                Services.scriptloader.loadSubScript(makeRelativePathURI("disable-add-on-signing.js"), window);
            } catch(e) {
                console.error(e);
            }
        ]]></constructor>
    </implementation>
  </binding>
</bindings>

您还需要disable-add-on-signing.js

//This should be installed as the file disable-add-on-signing.js in
//  your profile's "chrome" directory.

//Earlier versions of Firefox
try {
    Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {}).eval("SIGNED_TYPES.clear()");
} catch(ex) {}
try {
    Components.utils.import("resource://gre/modules/addons/XPIInstall.jsm", {}).eval("SIGNED_TYPES.clear()");
} catch(ex) {}
try {
    Components.utils.import("resource://gre/modules/addons/XPIDatabase.jsm", {}).eval("SIGNED_TYPES.clear()");
} catch(ex) {}

//Tested on Firefox 66
const {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetters(this, {
    XPIDatabase: "resource://gre/modules/addons/XPIDatabase.jsm",
});
XPIDatabase.SIGNED_TYPES.clear();

console.log('Add-on signing disabled.');

在您的配置文件的chrome目录中添加这些文件后,您将需要重新启动 Firefox。您可以通过查找“附加签名已禁用”来验证代码是否正在运行。浏览器控制台中

被 Firefox 禁用或删除的附加组件不会自动启用。您将需要重新安装它们。您可以通过将 *.xpi 文件拖放到 Firefox 窗口并确认您要安装来安装它们。

如果您想从Mozilla 附加组件获取任何特定扩展名的 *.xpi 文件,您可以通过右键单击“安装”按钮并选择“另存为”或“删除”来下载它。

Firefox 57 或更早版本(左右)

不幸的是,我不记得这个方法在哪个版本的 Firefox 中停止工作了。我知道我在 Firefox 54、55、52ESR 和 FF56.* 上使用它。

我最初在这篇博文中找到了禁用强制附加签名检查的解决方案,这是此答案中(稍作修改)代码的原始来源。进行这些更改将允许您使用您修改的 Firefox 发行版将未签名的附加组件安装到配置文件中。对于大多数人来说,这将是您的主要 Firefox 安装。但是,如果您安装了多个版本,则需要在每次安装时进行此修改。但是,一旦您进行修改,它们将通过正常的 Firefox 更新保留。

您需要在 Firefox 安装目录中添加几个文件。您可以在 mozillaZine 上找到适用于 Windows、Linux 和 Mac OS 的安装目录示例列表最常见的安装目录是:

  • 视窗
    • C:\Program Files\Mozilla Firefox\
    • C:\Program Files (x86)\Mozilla Firefox\
  • Linux
    • /usr/lib/firefox-<版本>
  • 操作系统
    • /应用程序/Firefox.app

添加第一个文件

然后,您需要添加以下代码作为文件<Install directory>/defaults/pref/disable-add-on-signing-prefs.js(Windows:) <Install directory>\defaults\pref\disable-add-on-signing-prefs.js

//This file should be placed in the defaults/pref directory (folder)
//within the Firefox installation directory with the with the name:
//  disable-add-on-signing-prefs.js
pref("general.config.obscure_value", 0);
pref("general.config.filename", "disable-add-on-signing.js");

添加第二个文件

您还需要添加以下代码作为文件<Install directory>/disable-add-on-signing.js(Windows:) <Install directory>\disable-add-on-signing.js1

//This file should be placed in the Firefox installation directory
//(folder) with the with the name:
//  disable-add-on-signing.js
try {
    Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {})
              .eval("SIGNED_TYPES.clear()");
} catch(ex) {}
try {
    Components.utils.import("resource://gre/modules/addons/XPIInstall.jsm", {})
              .eval("SIGNED_TYPES.clear()");
} catch(ex) {}

结果

我多年来一直在使用这些解决方案来安装一些我为自己使用而构建的扩展并测试我正在开发的新版本的扩展(当我想在Release 版本而不是Firefox Developer Edition每晚)。

注意:about:addonsFirefox 中可能会显示(在某些情况下)加载项已启用(未变灰),但有文字说明加载项“无法验证并已被禁用”。文字不准确!附加组件已启用并正常运行。

怎么运行的

resource://gre/modules/addons/XPIProvider.jsmconst SIGNED_TYPES被定义为一个Set为了使附加组件需要签名,其类型必须是 that 的成员SetSet.prototype.clear()方法用于清除Set. 这导致没有需要签名的附加类型(代码 1代码 2)。

如果你愿意,你可以单独为任何类型的禁用签名检查"webextension""extension""experiment",或"apiextension"

从任何修改后的扩展中删除META-INF目录

上述部分中的附加文件关闭了扩展必须签名要求如果签名文件存在,仍然会验证签名。因此,如果您修改了已签名的扩展名并且未删除签名文件,则该扩展名将无法通过签名验证。换句话说,实际检查任何现有的签名是与签名必须存在的要求不同的步骤。

如果您修改了已签名的扩展(您可以通过扩展根目录中存在META-INF目录来判断它已被签名),那么您将需要删除签名文件。您可以通过删除META-INF目录和该目录中包含的所有文件来完成此操作


1.博客中的代码把这个调用放到了try{}catch(){}block中。真的没有必要这样做。这样做的唯一有效方法是防止在浏览器控制台OSX 上的Ctrl- Shift-JCmd- Shift- J)中报告任何错误如果失败,则不需要运行额外的代码。此外,如果失败,我希望能够在浏览器控制台中看到错误,以便知道它实际上已经失败。try{}catch(){}如果在某些未来版本的 Firefox 上,附加组件由于未签名而开始被禁用则没有任何负面影响并允许跟踪问题。

当我将文件放在相应的目录中时,firefox 在启动时崩溃并显示消息“无法读取配置文件”,在 Firefox 59.0.1 上测试
2021-03-19 19:11:11
我尝试了 Firefox 56 版的解决方案。它运行良好。它也适用于便携式版本。
2021-03-19 19:11:11
@AaA Firefox 54.0现在已经老了。我知道我已经在 FF54、FF 55、FF52ESR 和 FF56.* 中使用过它。因此,我对出现问题感到有些惊讶。我确实注意到我添加了该XPIInstall.jsm行以disable-add-on-signing.js兼容 FF55。因此,可能需要删除该行。我不记得在进行更改后是否在 FF54 上再次测试了它。请注意,有时附加组件页面似乎表明它在实际运行时不起作用,您需要重新安装以前禁用的附加组件。
2021-03-30 19:11:11
我在适用于 Windows 的 FF 52.1.1(64 位)上对此进行了测试,并且可以正常工作。重要说明:如果扩展包含一个 META-INF 目录并且“该目录中的文件不正确”(即因为扩展中的其他文件自扩展签名后已更改),您必须重命名/删除该目录。如果您不这样做,该扩展程序将显示为活动状态,并且 FF 不会就未经验证的扩展程序发出警告 - 但该扩展程序将不起作用。我不知道“该目录中的文件不正确”到底意味着什么。也许对此有更多了解的人可以编辑答案并添加这些详细信息。
2021-04-05 19:11:11
@dbc 有趣。谢谢。很高兴知道。我没想到该配置选项会禁用以这种方式加载的运行 JavaScript。我原以为该选项仅适用于从网页加载的 JavaScript,而不是通过浏览器上下文中的引用。但是,经过测试,它在javascript.enabled设置为时肯定被禁用false
2021-04-07 19:11:11

为了完成上述答案,我发现了firefox-autoconfig,它包括安装一个autoconfig.js文件<FIREFOX INSTALLATION DIR>/default/prefs和一个ci.clg文件,<FIREFOX INSTALLATION DIR>这是一种xpinstall.signatures.required在打开 Firefox 时明确和自动禁用(以及其他选项)的方法(使用 Firefox 45.0.1 测试)

您将在autoconfig.js以下位置看到这些内容

//
pref("general.config.filename", "ci.cfg");
pref("general.config.obscure_value", 0);

和那些内容ci.cfg

// Disable checking if firefox is default browser
lockPref('browser.shell.checkDefaultBrowser', false);

// Disable restoring session
lockPref('browser.sessionstore.resume_from_crash', false);

// Disable extension signature check
lockPref('xpinstall.signatures.required', false);

// Allow extensions to be installed without user prompt
pref("extensions.autoDisableScopes", 0);
pref("extensions.enabledScopes", 15);

// Disable updater
lockPref("app.update.enabled", false);
// make absolutely sure it is really off
lockPref("app.update.auto", false);
lockPref("app.update.mode", 0);
lockPref("app.update.service.enabled", false);

// Prevent closing dialogs
lockPref("browser.showQuitWarning", false);
lockPref("browser.warnOnQuit", false);
lockPref("browser.tabs.warnOnClose", false);
lockPref("browser.tabs.warnOnCloseOtherTabs", false);

// Disable Add-ons compatibility checking
clearPref("extensions.lastAppVersion");

// Don't show 'know your rights' on first run
pref("browser.rights.3.shown", true);

//Disable plugin checking
lockPref("plugins.hide_infobar_for_outdated_plugin", true);
clearPref("plugins.update.url");

// Disable health reporter
lockPref("datareporting.healthreport.service.enabled", false);

// Disable all data upload (Telemetry and FHR)
lockPref("datareporting.policy.dataSubmissionEnabled", false);

// Disable crash reporter
lockPref("toolkit.crashreporter.enabled", false);
Components.classes["@mozilla.org/toolkit/crash-reporter;1"].getService(Components.interfaces.nsICrashReporter).submitReports = false;

// Browser Console command line
pref("devtools.chrome.enabled", true);

从 Firefox 47 开始:桌面版 Firefox 的发行版和 Beta 版将不允许安装未签名的扩展,没有覆盖。

有关更多信息,请参阅有关扩展签名Mozilla Wiki 页面

@Makyen 的解决方案有效,但会完全禁用签名检查:

Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {})
      .eval("SIGNED_TYPES.clear()");

您将知道插件是否已签名。

相反,我建议这样做:

/* Let unsigned addons live! */
Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {})
          .eval("function mustSign(aType) { return false; }");
Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {})
        .eval("XPIProvider.verifySignatures = function() {}");

当您尝试安装未签名的插件时,它仍会警告您,但无论如何它都会工作。该插件被标记为禁用about:addons但实际上处于活动状态(您可以像普通插件一样手动禁用/启用它)。

怎么运行的:

  • mustSign() 检查此类插件是否需要签名。

  • verifySignatures()是用于XPI_SIGNATURE_CHECK_PERIOD每秒检查签名的回调(即每天一次)