在 Linux 上安裝擴充功能

非由 Chrome 線上應用程式商店代管的擴充功能只能由 Linux 使用者安裝。本文說明如何從個人伺服器封裝、託管及更新 .crx 檔案。如果只透過 Chrome 線上應用程式商店發布擴充功能或主題,請參閱「網路商店代管與更新」一文。

包裝

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

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

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

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

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

在本機建立 .crx

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

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

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

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

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

Chrome 會建立兩個檔案:.crx 檔案和 .pem 檔案,其中包含擴充功能的私密金鑰。

封裝的擴充功能檔案

別遺失私密金鑰!.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"
    • 「不明/不明」
    • 「應用程式/未知」
    • "*/*"

無法辨識可安裝檔案的最常見原因,就是伺服器傳送標頭 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 網址。
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:「aaaaaaaaaaaaaaaaaaaaaaaa」
    • 版本:「1.1」
  • 擴充功能 2
    • ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 後布鏡效果 ID>
    • 版本:「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 要求網址太長 (超過 2,000 個字元),更新檢查會在必要時發出額外的 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>

這樣可確保使用者只有在執行 Google Chrome 3.0.193.0 以上版本時,才會自動更新至第 2 版。