我怎样才能禁用Firefox加载项的签名检查?

从版本42开始,默认情况下,Firefox拒绝安装未签名的加载项。 我如何禁用此validation?

只能在Nightly和Developer channel中禁用插件validation。 换句话说, 在Beta版本和标准版本中不可能的

  1. 转到about:config (input到地址栏)
  2. xpinstall.signatures.required设置为false

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

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

您将在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 for Desktop的发行版和Beta版本将不允许安装未签名的扩展程序,而不会覆盖。

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

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

我最初发现这个解决scheme禁用强制附加签名检查在这个博客文章 ,这是在这个答案(有点修改)代码的原始来源。 进行这些更改将允许您使用您修改的Firefox分发版将未签名的加载项安装到configuration文件中。 对于大多数人来说,这将是您的主要Firefox安装。 但是,如果您安装了多个版本,则需要在每个安装中进行此修改。 但是,一旦你做了修改,他们将保持通过正常的Firefox更新。

您需要在Firefox安装目录中添加几个文件。 您可以在mozillaZine上findWindows,Linux和Mac OS的安装目录示例列表 。 最常见的安装目录是:

  • 视窗
    • C:\ Program Files \ Mozilla Firefox \
    • C:\ Program Files(x86)\ Mozilla Firefox \
  • Linux的
    • / usr / lib中/ firefox- <版本>
  • OSX
    • /Applications/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.js ): 1

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

结果

使用Firefox的当前发行版,我已经使用这个解决scheme一段时间了,现在有一些扩展是我自己安装的,并testing了我正在使用的扩展的新版本(当我想testing的时候发行版而不是Firefox开发版或Nightly )。

注意: about:addons Firefox 可能会显示(在某些情况下)插件已启用(不灰色),但文本指出插件“无法validation并已被禁用”。 文字不准确! 附加function已启用并正常运行。

怎么运行的

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

如果您愿意,您可以单独禁用任何types的签名检查: "webextension""extension""experiment""apiextension"

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

上面各节中的附加文件closures了扩展必须签名的要求 。 如果签名文件存在,签名仍将被validation。 因此,如果您修改了一个已签名文件的扩展名,并且没有删除签名文件,则扩展名将无法进行签名validation。 换句话说,实际检查任何现有的签名是与签名必须存在的要求分开的一个步骤。

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


1.博客中的代码将此调用放在try{}catch(){}块中。 真的没有必要这样做。 唯一有效的做法是防止在浏览器控制台 (OSX上的CtrlShiftJCmdShiftJ )中报告任何错误。 如果失败,没有额外的代码需要运行。 另外,如果浏览器控制台出现错误,我更希望能够在浏览器控制台中看到错误,以便知道它实际上已经失败。 没有try{}catch(){}没有任何负面影响,并且允许追踪这个问题,如果在Firefox的某个版本中,插件由于没有被签名而开始被禁用。

@ Makyen的解决scheme,但将完全禁用签名检查:

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

你将知道插件是否被签名。

相反,我会build议这样的:

 /* 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()检查这种types的插件是否需要签名。

  • verifySignatures()是一个callback,用于每隔XPI_SIGNATURE_CHECK_PERIOD秒检查签名(即每天一次)