Начиная с версии 42, Firefox по умолчанию отказывается устанавливать неподписанные надстройки. Как отключить эту проверку?
Ответ 2
Отключите проверку подписи надстроек в релизных (всех) версиях Firefox
Версия Firefox 65+ (или около того)
Следующие инструкции отключат проверку подписи в Firefox для профиля Firefox, в который вы устанавливаете файлы. Вы собираетесь добавить некоторые файлы в каталог chrome в каталоге вашего профиля Firefox.
Я проверял это на Firefox 66.0. 3+.
IIRC, для Firefox 65 требовался немного другой код, я думаю, что оставил этот код в disable-add-on-signature.js, когда модифицировал его для Firefox 66, но я не уверен в этом.
Мы собираемся использовать технику, которая позволяет вам запускать произвольный код JavaScript в контексте браузера из файлов, хранящихся в каталоге вашего профиля Firefox. Я нашел, как это сделать из репозитория Haggai Nuchi GitHub: Firefox Quantum совместимый userChrome.js.
В Windows каталог вашего профиля 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 "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 и подтвердив, что вы хотите установить.
Если вы хотите получить файл *.xpi для какого-либо конкретного расширения из дополнений Mozilla, вы можете скачать его, щелкнув правой кнопкой мыши кнопку "Установить" и выбрав "Сохранить как" или "Удалить".
Firefox версии 57 или более ранней (или около того)
К сожалению, я не помню, с какой версией Firefox этот метод перестал работать. Я знаю, что использовал его на Firefox 54, 55, 52ESR и FF56. *.
Первоначально я нашел это решение для отключения принудительной проверки подписи надстройки в этом посте, который является исходным кодом (несколько измененного) кода в этом ответе. Внесение этих изменений позволит вам устанавливать неподписанные надстройки в профили, используя измененный вами дистрибутив Firefox. Для большинства людей это будет ваша основная установка Firefox. Однако, если вы установили несколько версий, вам нужно будет вносить эти изменения в каждую установку. Однако после внесения изменений они останутся через обычные обновления Firefox.
Вам нужно будет добавить пару файлов в каталог установки Firefox. Вы можете найти список примеров установочных каталогов для Windows, Linux и Mac OS на mozillaZine. Наиболее распространенные каталоги установки:
- Windows
- 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
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 Developer Edition или Ночной).
ПРИМЕЧАНИЕ. В about:addons
Firefox может показывать (при некоторых условиях) надстройку как включенную (не выделенную серым цветом), но с текстом, указывающим, что надстройка "не может быть проверена и была отключена". Текст не точный! Надстройка включена и работает.
Как это устроено
Внутри resource://gre/modules/addons/XPIProvider.jsm
const SIGNED_TYPES
определен как Set
. Чтобы надстройка требовала подписи, ее тип должен быть членом этого Set
. Метод Set.prototype.clear()
используется для очистки всех записей из Set
. Это приводит к отсутствию типов надстроек, которые требуют подписи (код 1, код 2).
Если вы хотите, вы можете отдельно отключить проверку подписи для любого из типов: "webextension"
, "extension"
, "experiment"
или "apiextension"
.
Удалите каталог META-INF из любого модифицированного расширения
Дополнительные файлы в разделах выше отключают требование, чтобы расширения были подписаны. Если файлы подписи существуют, подпись все равно будет проверена. Таким образом, если вы изменили расширение, которое было подписано, и не удалили файлы подписи, расширение не пройдет проверку подписи. Другими словами, фактически проверка любых существующих подписей является отдельным шагом от требования, что подпись должна существовать.
Если вы изменили расширение, которое было подписано (вы можете сказать, что оно было подписано существованием каталога META-INF в корневом каталоге расширения), вам потребуется удалить файлы сигнатур. Вы можете сделать это, удалив каталог META-INF и все файлы, содержащиеся в этом каталоге.
1. Код в блоге помещает этот вызов в блок try{}catch(){}
.Там действительно нет необходимости делать это.Единственная эффективная вещь, которая делает это, - предотвращает сообщение об ошибке в консоли браузера (Ctrl - Shift - J или Cmd - Shift - J в OSX).Там нет никакого дополнительного кода, который желательно запустить в случае сбоя.Кроме того, я предпочел бы иметь возможность видеть ошибку в консоли браузера, если это не удается, чтобы знать, что на самом деле произошел сбой.Отсутствие try{}catch(){}
не имеет никаких негативных последствий и позволяет отследить проблему, если в какой-то будущей версии Firefox дополнения начнут отключаться из-за отсутствия подписи.
Ответ 3
Чтобы завершить ответ, приведенный выше, я обнаружил 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);