xpinstall.signatures.required
,但这没有任何效果。插件仍然需要一个签名。 - joelostblom以下说明将在Firefox中禁用Firefox配置文件中安装文件的签名检查。您将要将一些文件添加到Firefox配置文件目录下的chrome目录中。
如果在about:config
中将javascript.enabled
设置为False
,则此代码将无法运行。该选项需要设置为True
,这是默认设置。
从Firefox 69+开始,除了下面的说明之外,您还需要在about:config
中将toolkit.legacyUserProfileCustomizations.stylesheets
设置为true
。如果不存在该选项,则需要创建它(在右键上下文菜单中选择“新建”)作为布尔选项。有关此选项添加的更多详细信息,请参见Bugzilla 1541233。
我已在Firefox 66.0.3+上进行了测试。
升级版本的过程似乎会在不激活这些更改的情况下暂时运行浏览器代码。因此,当您第一次运行新版本的Firefox时,依赖于禁用附加组件签名的安装的任何扩展都将被禁用。您可以在升级到新的Firefox版本后立即重新安装这些扩展,扩展应该可以继续工作。%appdata%\Mozilla\Firefox\Profiles\[profileID]
。如果您只有一个配置文件,[profileID]
将是%appdata%\Mozilla\Firefox\Profiles
目录中唯一的目录。如果您有多个配置文件,您需要选择要将此修改安装到的配置文件。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.');
<安装目录>/defaults/pref/disable-add-on-signing-prefs.js
中(Windows: <安装目录>\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");
您还需要将以下代码添加为文件<安装目录>/disable-add-on-signing.js
(Windows: <安装目录>\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
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) {}
多年来,我一直使用这些解决方案来安装我自己开发的一些扩展,并测试我正在开发的扩展的新版本(当我想要在发布版本中进行测试而不是Firefox开发者版或夜间版时)。
注意:在about:addons
中,Firefox在某些情况下可能会显示扩展已启用(未灰掉),但会显示扩展“无法验证并已禁用”的文本。这个文本是不准确的!扩展是已启用并正常运行的。
在resource://gre/modules/addons/XPIProvider.jsm
中,const SIGNED_TYPES
被定义为一个Set
。为了使插件需要签名,其类型必须是该Set
的成员。Set.prototype.clear()
方法用于清除Set
中的所有条目。这将导致不需要签名的插件类型(代码1,代码2)。
"webextension"
、"extension"
、"experiment"
或"apiextension"
。
1. 博客中的代码将此调用放在一个try{}catch(){}
块中。实际上没有必要这样做。这样做的唯一有效作用是防止任何错误在浏览器控制台(Ctrl-Shift-J,或者在OSX上是Cmd-Shift-J)中报告。如果此操作失败,没有其他代码需要运行。此外,如果此操作失败,我希望能在浏览器控制台中看到错误,以便知道它确实失败了。不使用try{}catch(){}
没有任何负面影响,并且可以追踪问题,如果在未来的Firefox版本中,插件因未签名而被禁用。
disable-add-on-signing.js
中添加了XPIInstall.jsm
行。因此,可能需要删除该行。我不记得在进行这些更改后是否在FF54上再次测试过它。请注意,有时插件页面似乎表明它没有工作,而实际上它确实工作,你需要重新安装先前禁用的插件。 - Makyenjavascript.enabled
设置为 false
时,它确实被禁用了。 - Makyen<FIREFOX INSTALLATION DIR>/default/prefs
中安装一个autoconfig.js
文件和在<FIREFOX INSTALLATION DIR>
中安装一个ci.clg
文件组成。这是一种在Firefox打开时自动和彻底禁用xpinstall.signatures.required
(以及其他选项)的方法(已测试使用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);
@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
秒(即每天一次)检查签名。
omni.ja
文件modules/AppConstants.jsm
,并将MOZ_REQUIRE_SIGNING
下的值从true
改为false
omni.ja
中about:config
下验证xpinstall.signatures.required
和xpinstall.whitelist.required
的值是否为false,并重新启动Firefox现在,你的未签名插件应该可以安装了。
omni.ja
文件,Firefox 65+会崩溃。 - hldevC:\Program Files\Mozilla Firefox\omni.ja
没有被压缩,所以你可以跳过重新打包的步骤。只需在类似于 https://chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm 的十六进制编辑器中进行编辑,找到字符串 MOZ_REQUIRE_SIGNING: true
的第一个出现,并将其覆盖为 MOZ_REQUIRE_SIGNING: false
(保持文件大小不变)。然后通过命令行重新启动浏览器以应用更改。使用以下命令:"C:\Program Files\Mozilla Firefox\firefox.exe" --purgecaches
https://superuser.com/a/1536420/1194827 现在你可以(重新)安装(拖放)未签名的 .xpi 插件。 - Stano我在HackerNews论坛的帖子中发现了这段与插件签名有关的代码。它适用于Firefox 56及更早版本,无需重新启动。
// For FF < v57 >...?
async function set_addons_as_signed() {
Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm");
Components.utils.import("resource://gre/modules/AddonManager.jsm");
let XPIDatabase = this.XPIInternal.XPIDatabase;
let addons = await XPIDatabase.getAddonList(a => true);
for (let addon of addons) {
// The add-on might have vanished, we'll catch that on the next startup
if (!addon._sourceBundle.exists())
continue;
if( addon.signedState != AddonManager.SIGNEDSTATE_UNKNOWN )
continue;
addon.signedState = AddonManager.SIGNEDSTATE_NOT_REQUIRED;
AddonManagerPrivate.callAddonListeners("onPropertyChanged",
addon.wrapper,
["signedState"]);
await XPIProvider.updateAddonDisabledState(addon);
}
XPIDatabase.saveChanges();
}
set_addons_as_signed();
这段代码需要在浏览器控制台中执行(而不是网页控制台),可以通过快捷键Ctrl+Shift+J访问。它会立即重新启用所有未通过验证的插件。
async
/ await
需要 Firefox 52+。此外,在 浏览器控制台 中输入命令行需要在 about:config
偏好设置中启用 (devtools.chrome.enabled
必须为 true
) 或在开发者工具设置中选择 "启用浏览器 chrome 和附加组件调试工具箱" 选项 (FF40+)。 - Makyen