Подписываем расширения Firefox

В свете последних событий связанных с релизом Mozilla Firefox 48, который навёл шухеру среди части пользователей, в связи с обязательным наличием подписи у расширений, люди столкнувшиеся с этой проблемой встали перед выбором, либо:

  • не пользоваться неподписанными расширениями (плохой вариант);
  • использовать небрэндированные сборки;
  • идти окольными путями, пытаясь отключить проверки любыми способами, некоторые из которых предложены в следующих комментариях:
    https://geektimes.ru/post/279132/#comment_9480372
    https://geektimes.ru/post/279132/#comment_9480382
  • подписать необходимое расширение самостоятельно.
  • Как вы уже догадались, здесь пойдёт речь о последнем способе. Если мы не планируем распространять расширения через официальный каталог, то подпись мы можем получить без ручных проверок, т.е. легко и просто.

    Для этого нам понадобятся:

  • учётная запись на addons.mozilla.org
  • установленный nodejs версии >= 0.10
  • npm версии >=3.0.0 (npm up npm)
  • jpm для nodejs (npm install jpm).
  • Будем рассматривать процесс подписания на примере расширения «Random Agent Spoofer». Данное расширение содержит список юзер-агентов, которые довольно быстро устаревают, а обновляется дополнение не часто. В свою очередь, в официальном репозитории файлы с нужными нам данными обновляются регулярно и возникает закономерное желание пустить их в дело.

    Итак, учётную запись зарегистрировали, программное окружение установлено, можно приступать.

    Берём подопытное расширение и распаковываем его в отдельную папку, в нашем случае используем слепок репозитория, расположенного по адресу https://github.com/dillbyrne/random-agent-spoofer.
    Получим следующую структуру каталогов:
        test
        lib
        doc
        data
        .gitignore
        LICENSE
        package.json
        README.md

    Если используется готовое собранное расширение, то в корне папки где оно распаковано, необходимо удалить файлы «bootstrap.js» и
    «install.rdf», они создаются программой сборки, а при модификации уже подписанных дополнений ещё и папку «META-INF». Т.к. мы имеем дело с ещё не собранным дополнением, то это не требуется. Следующим шагом будет редактирование файла «package.json», расположенного опять же в корне каталога распакованного расширения. В нашем случае его начало выглядит так:
    {
         "name": "random-agent-spoofer",
         "title": "Random Agent Spoofer",
         "id": "jid1-AVgCeF1zoVzMjA@jetpack",
         "description": "Allows the use of various browser profiles (including useragent ,platform, oscpu, accept headers and other options), which it can randomly switch between after a chosen period of time has expired",
         "author": "dbyrne",
         …
    }

    Если в нём содержится параметр «id» его надо либо изменить, либо удалить. В противном случае, мы получим ошибку при попытке подписи о том, что не являемся его владельцем.
    Далее командуем следующее «заклинание» для сборки расширения в архив:

    jpm xpi —addon-dir <путь к папке куда распаковали>

    или просто:

    jpm xpi, если текущий каталог это и есть корень распакованного расширения.

    На выходе должен появиться файл собранного расширения .xpi, который и будем подписывать.

    А теперь приготовим свой api-ключ, ради получения которого и регистрировались на addons.mozilla.org. Его можно увидеть по адресу addons.mozilla.org/ru/developers/addon/api/key в таком виде:

    Издатель JWT: <private data>
    Секрет JWT: <private data>

    где <private data> — ваш персональный ключ. И в заключение, собственно, сам акт подписания осуществляем скомандовав:

    jpm sign —api-key <api-key data> —api-secret <api-secret data> —xpi <путь к расширению полученному на предыдущем шаге&#62

    Если всё пройдёт без ошибок и автоматическая проверка будет пройдена, то в текущем каталоге мы получим подписанное расширение, в котором и нуждались.

    Полезные ссылки:
    Документация по jpm: developer.mozilla.org/en-US/Add-ons/SDK/Tools/jpm
    Signing Api: olympia.readthedocs.io/en/latest/topics/api/signing.html

    Всем спасибо за внимание, удачи!