只有 Linux 平台允許 Chrome 使用者安裝不是由 Chrome 線上應用程式商店代管的擴充功能。本文說明如何封裝、託管及更新一般用途網路伺服器的 crx 檔案。如果只透過 Chrome 線上應用程式商店發布擴充功能或主題,請參閱線上應用程式商店主機和更新。
套件
擴充功能和主題會以 .crx 檔案的形式提供。透過 Chrome 開發人員資訊主頁上傳時,資訊主頁會自動建立 crx 檔案。如果發布至個人伺服器,則必須在本機建立 crx 檔案,或從 Chrome 線上應用程式商店下載。
從 Chrome 線上應用程式商店下載 .crx 檔案
如果擴充功能是由 Chrome 線上應用程式商店代管,可以從開發人員資訊主頁下載 .crx 檔案。在「你的商家資訊」下方找到擴充功能,然後按一下「更多資訊」。在彈出式視窗中,按一下藍色的 main.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""\*/\*"
- 檔案未透過 HTTP 標頭
無法辨識可安裝檔案最常見的原因,是伺服器傳送標頭 X-Content-Type-Options: nosniff。第二常見的原因是伺服器傳送不明內容類型 (不在上述清單中)。如要修正 HTTP 標頭問題,請變更伺服器設定,或嘗試在其他伺服器上代管 .crx 檔案。
更新
瀏覽器每隔幾小時就會檢查已安裝擴充功能的更新網址。並向該網址發出要求,尋找更新資訊清單 XML 檔案。
- 更新檢查傳回的內容是更新資訊清單 XML 文件,列出擴充功能的最新版本。
如果更新資訊清單提及的版本比已安裝的版本新,瀏覽器就會下載並安裝新版本。與手動更新一樣,新的 .crx 檔案必須使用與目前安裝版本相同的私密金鑰簽署。
更新網址
如果擴充功能代管在 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。