Linux 自行託管

Linux 是唯一可供 Chrome 使用者安裝非 Chrome 線上應用程式商店代管的擴充功能的平台。本文說明如何從一般用途的網路伺服器封裝、託管及更新 crx 檔案。如果您只透過 Chrome 線上應用程式商店發布擴充功能或主題,請參閱這篇文章,瞭解如何代管及更新網路商店。

套件

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

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

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

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

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

在本機建立 .crx

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

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

已勾選開發人員模式,然後點選 Pack 擴充功能

在「Extension root」目錄欄位中指定擴充功能資料夾的路徑,然後按一下「PACK EXTENSION」按鈕。忽略第一次套件的「私密金鑰」欄位。

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

Chrome 會建立兩個檔案:.crx 檔案,以及一個含有擴充功能私密金鑰的 .pem 檔案。

封裝的擴充功能檔案

請勿遺失私密金鑰!.pem 檔案存放在安全的地方,需要更新副檔名。

更新 .crx 套件

增加 manifest.json 中的版本號碼,以更新擴充功能的 .crx 檔案。

{
  ...
  "version": "1.5",
  ...
  }
}
{
  ...
  "version": "1.6",
  ...
  }
}

返回擴充功能管理頁面,然後按一下「PACK 擴充功能」按鈕。請指定擴充功能目錄的路徑和私密金鑰的位置。

更新擴充功能檔案

這個頁面會提供已更新封裝擴充功能的路徑。

更新擴充功能檔案

透過指令列封裝

叫用 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"
    • "\*/\*"

無法辨識可安裝檔案的最常見原因是伺服器傳送 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 格式會沿用自 Omaha (Google 的更新基礎架構) 所用的格式。擴充功能系統會針對更新資訊清單的 <app><updatecheck> 元素使用下列屬性:

appid
擴充功能 ID 是根據公開金鑰的雜湊值產生,如封裝中所述。擴充功能 ID 會顯示在「擴充功能管理」頁面中。
程式碼集
.crx 檔案的 HTTPS 網址。
version
用戶端可用於判斷是否應下載 codebase 指定的 .crx 檔案。該值應與 .crx 檔案 manifest.json 檔案中的「version」值相符。

更新資訊清單 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:「aaaaaaaaaaaaaaaaaaaaaaa」
    • 版本:「1.1」
  • 擴充功能 2
    • ID:《bbbbbbbbbbbbbbbbbbbb》(:行銷共行銷 b 共雜花形布形 bb)》
    • 版本:「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 版。