Linux 自行託管

只有 Linux 平台允許 Chrome 使用者安裝不是由 Chrome 線上應用程式商店代管的擴充功能。本文說明如何封裝、託管及更新一般用途網路伺服器的 crx 檔案。如果只透過 Chrome 線上應用程式商店發布擴充功能或主題,請參閱線上應用程式商店主機和更新

套件

擴充功能和主題會以 .crx 檔案的形式提供。透過 Chrome 開發人員資訊主頁上傳時,資訊主頁會自動建立 crx 檔案。如果發布至個人伺服器,則必須在本機建立 crx 檔案,或從 Chrome 線上應用程式商店下載。

從 Chrome 線上應用程式商店下載 .crx 檔案

如果擴充功能是由 Chrome 線上應用程式商店代管,可以從開發人員資訊主頁下載 .crx 檔案。在「你的商家資訊」下方找到擴充功能,然後按一下「更多資訊」。在彈出式視窗中,按一下藍色的 main.crx 連結即可下載。

從開發人員資訊主頁下載 .crx 檔案

下載的檔案可以託管在個人伺服器上。這是最安全的擴充功能本機代管方式,因為擴充功能的內容會由 Chrome 線上應用程式商店簽署。這有助於偵測潛在攻擊和竄改行為。

在本機建立 .crx

擴充功能目錄會在「擴充功能管理」頁面轉換為 .crx 檔案。前往網址列中的 chrome://extensions/,或按一下 Chrome 選單,將指標懸停在「更多工具」上,然後選取「擴充功能」。

在「擴充功能管理」頁面中,按一下「開發人員模式」旁的切換按鈕,啟用開發人員模式。然後選取「套件擴充功能」按鈕。

勾選「開發人員模式」,然後按一下「封裝擴充功能」

在「Extension root directory」欄位中指定擴充功能資料夾的根目錄路徑,然後按一下「PACK EXTENSION」按鈕。如果是首次封裝,請忽略「私密金鑰」欄位。

指定擴充功能路徑,然後按一下「封裝擴充功能」

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 提供
    • 系統會以下列其中一種內容類型提供檔案 is
    • 空字串
    • "text/plain"
    • "application/octet-stream"
    • "unknown/unknown"
    • "application/unknown"
    • "\*/\*"

無法辨識可安裝檔案最常見的原因,是伺服器傳送標頭 X-Content-Type-Options: nosniff。第二常見的原因是伺服器傳送不明內容類型 (不在上述清單中)。如要修正 HTTP 標頭問題,請變更伺服器設定,或嘗試在其他伺服器上代管 .crx 檔案。

更新

瀏覽器每隔幾小時就會檢查已安裝擴充功能的更新網址。並向該網址發出要求,尋找更新資訊清單 XML 檔案。

  • 更新檢查傳回的內容是更新資訊清單 XML 文件,列出擴充功能的最新版本。

如果更新資訊清單提及的版本比已安裝的版本新,瀏覽器就會下載並安裝新版本。與手動更新一樣,新的 .crx 檔案必須使用與目前安裝版本相同的私密金鑰簽署。

注意:為維護使用者隱私,Google Chrome 不會隨自動更新資訊清單要求傳送任何 Cookie 標頭,且會忽略這些要求回應中的任何 Set-Cookie 標頭。

更新網址

如果擴充功能代管在 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 網址。
版本
:用戶端會使用這個值判斷是否應下載 codebase 指定的 .crx 檔案。這個值應與 .crx 檔案的 manifest.json 檔案中「版本」的值相符。

更新資訊清單 XML 檔案可包含多個 <app> 元素,因此可提供多個擴充功能的相關資訊。

測試

系統預設每隔數小時檢查一次更新,但您可以使用「擴充功能管理」頁面上的「立即更新擴充功能」按鈕,強制更新擴充功能。

立即更新擴充功能

系統會開始檢查所有已安裝的擴充功能。

進階用法:要求參數

基本自動更新機制旨在簡化伺服器端作業,只要將靜態 XML 檔案放到任何純網路伺服器 (例如 Apache),並在發布新擴充功能版本時更新該 XML 檔案即可。

如果開發人員代管多個擴充功能,可以檢查要求參數,瞭解更新要求中的擴充功能 ID 和版本。加入這些參數後,擴充功能就能從執行動態伺服器端程式碼的相同網址更新,而非靜態 XML 檔案。

要求參數的格式如下:

?x=EXTENSION_DATA

其中 EXTENSION_DATA 是網址編碼字串,格式如下:

id=EXTENSION_ID&v=EXTENSION_VERSION

舉例來說,兩個擴充功能指向相同的更新網址 (https://test.com/extension_updates.php):

  • 分機 1
    • ID:「aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa」
    • 版本:「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

每個不重複的更新網址,單一要求中可列出多個擴充功能。以上述範例來說,如果使用者同時安裝這兩個擴充功能,這兩項要求就會合併為單一要求:

https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4

如果使用相同更新網址安裝的擴充功能數量過多,導致 GET 要求網址過長 (超過 2000 個字元),更新檢查會視需要發出額外的 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。