Подтвердить что ты не робот

Как отключить проверку подписи для надстроек Firefox?

Начиная с версии 42, Firefox по умолчанию отказывается устанавливать неподписанные надстройки. Как отключить эту проверку?

4b9b3361

Ответ 1

Можно отключить проверку аддонов только в Nightly и Developer канале. Другими словами, невозможно в версиях бета-версии и стандартных выпусках.

  • Перейдите к about:config (введите его в адресную строку)
  • Установите xpinstall.signatures.required в false.

Подробнее в https://wiki.mozilla.org/Addons/Extension_Signing

Ответ 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);

Ответ 4

Как и в Firefox 47: релиз и бета-версии Firefox для рабочего стола не позволят устанавливать беззнаковые расширения без переопределения.

Для получения дополнительной информации см. страницу Mozilla Wiki на подписи подписи.

Ответ 5

Решение

@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 секунд (т.е. один раз в день)

Ответ 6

Это код, который я нашел в теме на HackerNews, касающейся подписи дополнений apocalypse. Он работает в 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. Он мгновенно включает все дополнения, которые не прошли проверку.