如何在 41.0b1+ 中强制安装未经验证的 Firefox 扩展?

如何在 41.0b1+ 中强制安装未经验证的 Firefox 扩展?

Firefox 的最新更新(41.0b1)严格阻止安装未经验证的扩展,即无处不在的 HTTPS隐私獾

我如何才能强制安装这些扩展?里面有没有about:config我可以暂时切换的设置?

Mozilla 在 Firefox 中强调了这一变化这里并指出其此前在控制恶意扩展方面的努力不够有效。

答案1

是的,中有一个设置About:config,其名称为xpinstall.signatures.required。双击首选项名称,使其值设置为 false。现在您可以在 Firefox 中安装未签名的扩展。无需重新启动浏览器。

答案2

显然在 Firefox 60 及以上版本xpinstall.signatures.required配置.js上述技巧有效(Mozilla,请倒下!)。

上面提到的俄罗斯论坛似乎也提到了针对这些版本的 Firefox 的解决方案。因此,请将其放入配置.js而是保存到C:\Program Files\Mozilla Firefox

//
try {(code => {
    var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
    var jsval, evl = true, re = e => Cu.reportError(e), imp = name => {try {
        return Cu.import(`resource://gre/modules/addons/${name}.jsm`, {});
    } catch(ex) {}}
    if ((jsval = imp("AddonSettings"))) {
        jsval.AddonSettings = {ADDON_SIGNING: false, REQUIRE_SIGNING: false, ALLOW_LEGACY_EXTENSIONS: true};
        try {evl = jsval.eval("this") === jsval;} catch(ex) {evl = false;}
    }
    var jsvals = ["XPIProvider", "XPIInstall"].map(imp).filter(i => i);
    jsvals[0].AddonSettings && lockPref("extensions.allow-non-mpc-extensions", true);
    jsvals[0].signaturesNotRequired = true;

    if (evl) return jsvals.forEach(jsval => {try {jsval.eval(code);} catch(ex) {re(ex);}});

    var sl = Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader);
    Cu.importGlobalProperties(["URL", "Blob"]); var url = URL.createObjectURL(new Blob([(code)]));
    jsvals.forEach(jsval => {try {sl.loadSubScript(url, jsval);} catch(ex) {re(ex);}});

})(String.raw`((vzss, pckg) => {
    var trueDesc = {enumerable: true, value: true};
    typeof Extension == "function" && Object.defineProperty(Extension.prototype, "experimentsAllowed", trueDesc);
    "AddonInternal" in this && Object.defineProperty(AddonInternal.prototype, "providesUpdatesSecurely", trueDesc);
    this.isDisabledLegacy = () => false;
    if ("XPIDatabase" in this) this.XPIDatabase.isDisabledLegacy = () => false;
    try {SIGNED_TYPES.clear();} catch(ex) {};

    if (!vzss && !pckg) return;

    var re = /\x06\x03U\x04\x03..(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]*\@[a-z0-9-\._]+)0\x82\x02"0\r\x06\t/i;
    var getUUID = () => {
        var gen = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator);
        return (getUUID = () => gen.generateUUID().toString())();
    }
    var getIdFromString = str => {
        var match = str && str.match(re);
        return match ? match[1] : getUUID();
    }
    var getState = arg => ({
        signedState: AddonManager.SIGNEDSTATE_NOT_REQUIRED,
        cert: typeof arg == "object" ? arg : {commonName: arg}
    });
    var checkAddon = addon => {
        if (addon.id || (
            "_installLocation" in addon
                ? addon._installLocation.name == KEY_APP_TEMPORARY
                : addon.location.isTemporary
        ))
            return getState(null);
    }
    var getRoot = () =>
        !AppConstants.MOZ_REQUIRE_SIGNING && Services.prefs.getBoolPref(PREF_XPI_SIGNATURES_DEV_ROOT, false)
            ? Ci.nsIX509CertDB.AddonsStageRoot : Ci.nsIX509CertDB.AddonsPublicRoot;

    if (vzss) {
        var getURI = file => {
            var jsval = Cu.import("resource://gre/modules/addons/XPIProvider.jsm", {});
            return (getURI = file => jsval.getURIForResourceInFile(file, "META-INF/mozilla.rsa"))(file);
        }
        var getIdFromFile = file => {
            var str, is = {close() {}}, sis = {close() {}};
            try {
                is = Services.io.newChannelFromURIWithLoadInfo(getURI(file), null).open();
                sis = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
                sis.init(is);
                str = sis.readBytes(sis.available());
            } catch(ex) {}
            sis.close(); is.close();
            return getIdFromString(str);
        }
        this.verifyZipSignedState = function verifyZipSignedState(aFile, aAddon) {
            var res = checkAddon(aAddon);
            return res ? Promise.resolve(res) : new Promise(resolve => {
                var callback = {openSignedAppFileFinished(rv, zipReader, cert) {
                    zipReader && zipReader.close();
                    resolve(getState(cert || getIdFromFile(aFile)));
                }};
                gCertDB.openSignedAppFileAsync(getRoot(), aFile, callback.wrappedJSObject = callback);
            });
        }
    }

    if (pckg) Package.prototype.verifySignedState = function verifySignedState(addon) {
        var res = checkAddon(addon);
        return res ? Promise.resolve(res) : new Promise(resolve =>
            this.verifySignedStateForRoot(addon, getRoot()).then(({cert}) => {
                if (cert)
                    resolve(getState(cert));
                else
                    this.readBinary("META-INF", "mozilla.rsa").then(
                        buffer => resolve(getState(
                            getIdFromString(String.fromCharCode(...new Uint8Array(buffer)))
                        )),
                        () => resolve(getState(getUUID()))
                    );
            }, Cu.reportError)
        );
    }
})(
    "verifyZipSignedState" in this, typeof Package == "function"
);`)} catch(err) {
    err.message != "Components is not defined" && Components.utils.reportError(err);
}

然后你必须将其添加到配置首选项.js文件保存至C:\Program Files\Mozilla Firefox\defaults\pref

pref("general.config.obscure_value", 0);
pref("general.config.filename", "config.js");
pref("general.config.sandbox_enabled", false);

经过测试,该程序可以在 FF 66.0.3 上运行。遗憾的是,它无法神奇地恢复您的附加组件和主题,但至少可以重新启用重新安装它们的选项。无论如何,这比 Mozilla 提供的任何功能都要好,因为尽管他们的论坛充斥着有关此问题的投诉,但他们似乎并不特别在意。

答案3

在 Firefox 48 及以上版本中,此方法无效。相反,您应该在 Firefox 目录中创建两个配置文件。

  1. 创造配置.js记事本中的文件(确保文件扩展名是.js并不是。TXT):

    //
    try {
    Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {})
    .eval("SIGNED_TYPES.clear()");
    }
    catch(ex) {}
    
  2. 移动配置.js到你的 Firefox 安装目录:

    视窗: C:\Program Files\Mozilla Firefox
    (或者 C:\Program 文件 (x86)\Mozilla Firefox

    Linux: /usr/lib64/firefox-< 版本 >
    (或 /usr/lib/firefox-< 版本 > )

    苹果: /应用程序/Firefox.app

  3. 创造配置首选项.js在记事本中:

    pref("general.config.obscure_value", 0);
    pref("general.config.filename", "config.js");
    
  4. 移动配置首选项.js进入 Firefox默认值\首选项目录。
    (例如C:\Program Files\Mozilla Firefox\defaults\pref

  5. 重新启动 Firefox。

  6. 将未签名的 XPI 拖入 Firefox 窗口,或者使用 Firefox 附加组件设置中的“从文件安装附加组件”选项。


源自此来源: https://forum.mozilla-russia.org/viewtopic.php?id=70326

答案4

tldr:Mozilla 完全删除了在“中安装未签名扩展的可能性发布“软件频道。

老问题了,但我今天遇到了这个问题。我只是想在本地 Firefox 上安装并测试我在这里创建的第一个主题……没有运气。花了半天时间在网上搜索安装未签名插件的可能性后,似乎有没有任何!(我没有尝试上面@CoolKoon 的回答中的黑客脚本)

mozilla 状态这里

如果我想使用未签名的附加组件,我有哪些选择?(高级用户): Firefox 扩展支持版本 (血沉)、Firefox开发人员版本和每晚Firefox 版本将允许您覆盖设置以强制执行扩展签名要求通过在 Firefox 配置编辑器(about:config 页面)中将首选项 xpinstall.signatures.required 更改为 false 来实现。还有一些特殊的无品牌 Firefox 版本允许此覆盖。有关更多信息,请参阅 MozillaWiki 文章附加组件/扩展签名。

此外webextension 开发文档说同样的话:

在 about:config 中切换 xpinstall.signatures.required 首选项后,可以在 Firefox 的 Developer Edition、Nightly 和 ESR 版本中安装未签名的扩展程序。要使用此功能,您的扩展程序必须具有附加组件 ID。

我个人的解决方案:安装 ESR(并尝试转移我的个人资料)

相关内容