Linux は、Chrome ウェブストア以外でホストされている拡張機能を Chrome ユーザーがインストールできる唯一のプラットフォームです。この記事では、汎用ウェブサーバーの crx
ファイルをパッケージ化、ホスト、更新する方法について説明します。拡張機能またはテーマを Chrome ウェブストアでのみ配布する場合は、ウェブストアのホスティングと更新をご覧ください。
パッケージ
拡張機能とテーマは .crx
ファイルとして提供されます。Chrome デベロッパー ダッシュボードからアップロードすると、ダッシュボードによって crx
ファイルが自動的に作成されます。個人用サーバーで公開する場合は、crx
ファイルをローカルに作成するか、Chrome ウェブストアからダウンロードする必要があります。
Chrome ウェブストアから .crx をダウンロードする
拡張機能が Chrome ウェブストアでホストされている場合は、デベロッパー ダッシュボードから .crx
ファイルをダウンロードできます。[リスティング] で該当する広告表示オプションを見つけて、[詳細] をクリックします。ポップアップ ウィンドウで、青い main.crx
リンクをクリックしてダウンロードします。
ダウンロードしたファイルは、個人のサーバーにホストできます。これは、拡張機能のコンテンツが Chrome ウェブストアによって署名されるため、拡張機能をローカルでホストする最も安全な方法です。これにより、潜在的な攻撃や改ざんを検出できます。
ローカルで .crx を作成する
拡張機能のディレクトリは、拡張機能管理ページで .crx
ファイルに変換されます。オームニボックスで chrome://extensions/
に移動するか、Chrome メニューをクリックして [その他のツール] にポインタを合わせ、[拡張機能] を選択します。
拡張機能管理ページで、[デベロッパー モード] の横にある切り替えスイッチをクリックして、デベロッパー モードを有効にします。[PACK EXTENSION] ボタンを選択します。
[Extension root directory] フィールドに拡張機能のフォルダのパスを指定し、[PACK EXTENSION] ボタンをクリックします。初回パッケージの場合は、[秘密鍵] フィールドは無視します。
Chrome は、拡張機能の秘密鍵を含む .crx
ファイルと .pem
ファイルの 2 つのファイルを作成します。
秘密鍵を紛失しないでください。.pem
ファイルは非公開で安全な場所に保管してください。拡張子の更新が必要になります。
.crx パッケージを更新する
manifest.json
のバージョン番号を増やして、拡張機能の .crx
ファイルを更新します。
{
...
"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"
"unknown/unknown"
"application/unknown"
"\*/\*"
- ファイルが HTTP ヘッダー
インストール可能なファイルを認識できない理由として最もよくあるのが、サーバーによる X-Content-Type-Options: nosniff
ヘッダーの送信です。2 番目に多い理由は、サーバーによる未知のコンテンツ タイプ、つまり前のリストにないコンテンツ タイプの送信です。HTTP ヘッダーの問題を解決するには、サーバーの構成を変更するか、別のサーバーで .crx
ファイルをホストしてみてください。
更新
ブラウザは数時間ごとに、インストールされている拡張機能の更新 URL を確認します。それぞれについて、その URL にリクエストを送信し、更新マニフェスト XML ファイルを探します。
- 更新チェックによって返されるコンテンツは、拡張機能の最新バージョンを一覧表示する更新マニフェスト XML ドキュメントです。
更新マニフェストに、インストールされているバージョンより新しいバージョンが記載されている場合、ブラウザは新しいバージョンをダウンロードしてインストールします。手動での更新と同様に、新しい .crx
ファイルは、現在インストールされているバージョンと同じ秘密鍵で署名する必要があります。
URL を更新する
Chrome ウェブストア以外のサーバーでホストされている拡張機能は、manifest.json
ファイルに update_url
フィールドを含める必要があります。
{
"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 形式は、Google の更新インフラストラクチャである Omaha で使用されている形式を借用しています。拡張機能システムは、アップデート マニフェストの <app>
要素と <updatecheck>
要素に次の属性を使用します。
- appid
- 拡張機能 ID は、パッケージ化で説明されているように、公開鍵のハッシュに基づいて生成されます。拡張機能の ID は、拡張機能の管理ページに表示されます。
- コードベース
.crx
ファイルへの HTTPS URL。- version
codebase
で指定された.crx
ファイルをダウンロードするかどうかを決定するためにクライアントによって使用されます。これは、.crx
ファイルのmanifest.json
ファイルの「version」の値と一致している必要があります。
更新マニフェスト XML ファイルには、複数の <app>
要素を含めることで、複数の拡張機能に関する情報を含めることができます。
テスト
デフォルトの更新チェック頻度は数時間ですが、拡張機能管理ページの [拡張機能を今すぐ更新] ボタンを使用して強制的に更新できます。
これにより、インストールされているすべての拡張機能のチェックが開始されます。
高度な使用方法: リクエスト パラメータ
基本的な自動更新メカニズムは、サーバー側の作業が簡単になるように設計されています。単に静的 XML ファイルを Apache などのプレーン ウェブサーバーにドロップし、新しい拡張機能バージョンがリリースされるたびにその XML ファイルを更新するだけです。
複数の拡張機能をホストしているデベロッパーは、更新リクエストで拡張機能 ID とバージョンを示すリクエスト パラメータをチェックできます。これらのパラメータを指定すると、拡張機能は静的 XML ファイルではなく、動的なサーバーサイド コードを実行する同じ URL から更新できます。
リクエスト パラメータの形式は次のとおりです。
?x=EXTENSION_DATA
ここで、EXTENSION_DATA
は次の形式の URL エンコードされた文字列です。
id=EXTENSION_ID&v=EXTENSION_VERSION
たとえば、2 つの拡張機能が同じ更新 URL(https://test.com/extension_updates.php
)を指している場合:
- 拡張機能 1
- ID: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- バージョン: "1.1"
- 拡張機能 2
- ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
- バージョン: "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
1 つのリクエストで、一意の更新 URL ごとに複数の拡張機能を指定できます。上記の例では、ユーザーが両方の拡張機能をインストールしている場合、2 つのリクエストが 1 つのリクエストにマージされます。
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
同じ更新 URL を使用するインストール済み拡張機能の数が多く、GET リクエスト URL が長すぎる(2,000 文字を超える)場合、更新チェックは必要に応じて追加の GET リクエストを発行します。
上級者向け: ブラウザの最小バージョン
拡張機能システムに API が追加されるにつれて、新しいバージョンのブラウザでのみ動作する拡張機能の更新バージョンがリリースされる場合があります。Google Chrome 自体は自動更新されますが、ユーザーベースの大部分が特定の新しいリリースに更新されるまでに数日かかることがあります。特定の更新を特定のバージョン以上の Google Chrome バージョンにのみ適用するには、更新レスポンスの <app>
要素に「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>
これにより、ユーザーが Google Chrome 3.0.193.0 以降を実行している場合にのみ、バージョン 2 に自動更新されるようになります。