Расширения, размещенные вне Chrome Web Store, могут быть установлены только пользователями Linux. В этой статье описывается, как упаковывать, размещать и обновлять файлы .crx с личного сервера. Если вы распространяете расширение или тему исключительно через Chrome Web Store , обратитесь к разделу «Размещение и обновление веб-магазина» .
Упаковка
Расширения и темы распространяются в виде файлов .crx . При загрузке через панель разработчика Chrome файл .crx создается автоматически. Если расширение публикуется на личном сервере, файл .crx необходимо создать локально или загрузить из Chrome Web Store.
Загрузите файл .crx из интернет-магазина Chrome.
Если расширение размещено в Chrome Web Store, файл .crx можно загрузить из панели разработчика. Найдите расширение в разделе «Ваши объявления» и нажмите «Подробнее». Во всплывающем окне нажмите на синюю ссылку main.crx , чтобы загрузить его.

Загруженный файл можно разместить на личном сервере. Это наиболее безопасный способ локального размещения расширения, поскольку его содержимое будет подписано Chrome Web Store. Это помогает выявлять потенциальные атаки и попытки несанкционированного доступа.
Создайте файл .crx локально.
На странице управления расширениями каталоги преобразуются в файлы .crx . Перейдите по адресу chrome://extensions/ в контекстном меню или щелкните меню Chrome, наведите курсор на «Дополнительные инструменты», а затем выберите «Расширения».
На странице управления расширениями включите режим разработчика, щелкнув переключатель рядом с пунктом «Режим разработчика» . Затем выберите кнопку «УПАКОВАТЬ РАСШИРЕНИЯ» .

Укажите путь к папке расширения в поле «Корневой каталог расширения», затем нажмите кнопку «УПАКОВАТЬ РАСШИРЕНИЕ» . Для пакетов, создаваемых впервые, поле «Закрытый ключ» следует игнорировать.

Chrome создаст два файла: файл .crx и файл .pem , содержащие закрытый ключ расширения.

Не теряйте закрытый ключ! Храните файл .pem в секретном и безопасном месте; он понадобится для обновления расширения.
Обновить пакет .crx
Обновите файл .crx расширения, увеличив номер версии в manifest.json .
{
...
"version": "1.5",
...
}
}
{
...
"version": "1.6",
...
}
}
Вернитесь на страницу управления расширениями и нажмите кнопку «УПАКОВАТЬ РАСШИРЕНИЕ» . Укажите путь к каталогу расширений и местоположение закрытого ключа.

На этой странице будет указан путь к обновленному расширению в собранном виде.

Упаковка через командную строку
Упаковывайте расширения из командной строки, запуская chrome.exe . Используйте флаг --pack-extension , чтобы указать расположение папки расширения, и флаг --pack-extension-key чтобы указать расположение файла закрытого ключа расширения.
chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem
Хостинг
Сервер, на котором размещаются файлы .crx , должен использовать соответствующие HTTP-заголовки, чтобы позволить пользователям установить расширение, перейдя по ссылке.
Google Chrome считает файл устанавливаемым, если выполняется хотя бы одно из следующих условий:
- Файл имеет тип содержимого
application/x-chrome-extension - Расширение файла —
.crx, и оба следующих утверждения верны:- Файл не передается с HTTP-заголовком
X-Content-Type-Options: nosniff - Файл предоставляется с одним из следующих типов контента:
- пустая строка
- "text/plain"
- "application/octet-stream"
- "неизвестно/неизвестно"
- "приложение/неизвестно"
- "*/*"
- Файл не передается с HTTP-заголовком
Наиболее распространенная причина, по которой установочный файл не распознается, заключается в том, что сервер отправляет заголовок X-Content-Type-Options: nosniff . Вторая по распространенности причина — отправка сервером неизвестного типа контента, которого нет в предыдущем списке. Чтобы исправить проблему с HTTP-заголовком, либо измените конфигурацию сервера, либо попробуйте разместить файл .crx на другом сервере.
Обновление
Каждые несколько часов браузер проверяет установленные расширения на наличие URL-адреса обновления. Для каждого обновления он отправляет запрос по этому URL-адресу в поисках XML-файла манифеста обновления.
- Результатом проверки обновлений является XML-документ манифеста обновления , содержащий список последних версий расширения.
Если в манифесте обновления указана более новая версия, чем установленная, браузер загружает и устанавливает новую версию. Как и при ручном обновлении, новый файл .crx должен быть подписан тем же закрытым ключом, что и текущая установленная версия.
Обновить URL
Расширения, размещенные на серверах вне Chrome Webstore, должны включать поле update_url в свой файл manifest.json .
{
"name": "My extension",
...
"update_url": "https://myhost.com/mytestextension/updates.xml",
...
}
Обновить манифест
Обновление, возвращаемое сервером, должно представлять собой XML-документ.
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='https://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
</app>
</gupdate>
Этот XML-формат заимствован из формата, используемого Omaha , инфраструктурой обновлений Google. Система расширений использует следующие атрибуты для элементов <app> и <updatecheck> манифеста обновления:
| аппид | Идентификатор расширения генерируется на основе хеша открытого ключа, как описано в разделе «Упаковка» . Идентификатор расширения отображается на странице управления расширениями. |
| кодовая база | HTTPS-адрес файла .crx . |
| версия | Используется клиентом для определения того, следует ли загружать файл .crx , указанный в codebase . Значение должно совпадать со значением "version" в файле manifest.json , содержащем этот файл .crx . |
XML-файл манифеста обновления может содержать информацию о нескольких расширениях путем включения нескольких элементов <app>.
Тестирование
По умолчанию проверка обновлений выполняется каждые несколько часов, но обновление можно принудительно запустить с помощью кнопки «Обновить расширения сейчас» на странице управления расширениями.

Это запустит проверку всех установленных расширений.
Расширенные возможности использования: параметры запроса
Базовый механизм автоматического обновления разработан таким образом, чтобы работа на стороне сервера была максимально простой: достаточно просто разместить статический XML-файл на любом обычном веб-сервере, например, Apache, и обновлять этот XML-файл по мере выхода новых версий расширений.
Разработчики, размещающие несколько расширений, могут проверять параметры запроса, которые указывают идентификатор и версию расширения в запросе на обновление. Включение этих параметров позволяет расширениям обновляться с одного и того же URL-адреса, используя динамический серверный код, а не статический XML-файл.
Формат параметров запроса следующий:
?x=EXTENSION_DATA
Где EXTENSION_DATA — это строка, закодированная в формате URL:
id=EXTENSION\_ID&v=EXTENSION\_VERSION
Например, два расширения указывают на один и тот же URL-адрес обновления ( https://test.com/extension_updates.php ):
- Расширение 1
- ID: "ааааааааааааааааааааааа"
- Версия: "1.1"
- Расширение 2
- ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
- Версия: "0.4"
Запрос на обновление каждого отдельного расширения будет выглядеть следующим образом:
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1
и
https://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
В одном запросе для каждого уникального URL-адреса обновления можно указать несколько расширений. В приведенном выше примере, если у пользователя установлены оба расширения, то два запроса объединяются в один:
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
Если количество установленных расширений, использующих один и тот же URL-адрес обновления, достаточно велико, чтобы URL-адрес GET-запроса оказался слишком длинным (более 2000 символов), проверка обновлений при необходимости отправляет дополнительные GET-запросы.
Расширенные возможности использования: минимальная версия браузера
По мере добавления новых API в систему расширений может выпускаться обновленная версия расширения, которая будет работать только с более новыми версиями браузера. Хотя сам Google Chrome обновляется автоматически, может потребоваться несколько дней, прежде чем большинство пользователей обновятся до той или иной новой версии. Чтобы гарантировать, что данное обновление будет применяться только к версиям Google Chrome, отличным от указанной, добавьте атрибут "prodversionmin" к файлу расширений.
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' prodversionmin='3.0.193.0'/>
</app>
</gupdate>
Это обеспечит автоматическое обновление до версии 2 только в том случае, если пользователи используют Google Chrome 3.0.193.0 или более позднюю версию.