Linux 是唯一可讓 Chrome 使用者安裝非由 Chrome 線上應用程式商店代管的擴充功能的平台。本文將說明如何從通用網路伺服器封裝、代管及更新 crx
檔案。如果您只透過 Chrome 線上應用程式商店發布擴充功能或主題,請參閱「Webstore 代管和更新」一文。
套件
擴充功能和主題會以 .crx
檔案的形式提供。透過 Chrome 開發人員資訊主頁上傳時,資訊主頁會自動建立 crx
檔案。如果是在個人伺服器上發布,就必須在本機建立 crx
檔案,或從 Chrome 線上應用程式商店下載。
從 Chrome 線上應用程式商店下載 .crx
如果擴充功能由 Chrome 線上應用程式商店代管,您可以從開發人員資訊主頁下載 .crx
檔案。在「你的商家資訊」下方找到擴充功能,然後點選「更多資訊」。在彈出式視窗中,按一下藍色的 main.crx
連結即可下載。
下載的檔案可託管在個人伺服器上。這是在本機代管擴充功能的最安全方式,因為 Chrome 線上應用程式商店會為擴充功能內容簽署。這有助於偵測潛在的攻擊和竄改行為。
在本機建立 .crx
擴充功能目錄會在「擴充功能管理」頁面中轉換成 .crx
檔案。前往網址列中的 chrome://extensions/
,或按一下 Chrome 選單,將遊標懸停在「更多工具」上,然後選取「擴充功能」。
在「擴充功能管理」頁面上,按一下「開發人員模式」旁的切換鈕,即可啟用開發人員模式。接著選取「擴充套裝」按鈕。
在「Extension root directory」欄位中指定擴充功能資料夾的路徑,然後按一下「PACK EXTENSION」按鈕。對於首次上傳的套件,請忽略「Private key」欄位。
Chrome 會建立兩個檔案:一個 .crx
檔案,以及一個包含擴充功能私密金鑰的 .pem
檔案。
請勿遺失私密金鑰!將 .pem
檔案存放在安全的地方;需「更新」擴充功能。
更新 .crx 套件
如要更新擴充功能的 .crx
檔案,請在 manifest.json
中增加版本號碼。
{
...
"version": "1.5",
...
}
}
{
...
"version": "1.6",
...
}
}
返回「Extensions Management Page」,然後按一下「PACK EXTENSION」按鈕。指定擴充功能目錄的路徑以及私密金鑰的位置。
這個頁面會提供更新後的封裝擴充功能路徑。
透過指令列建立套件
叫用 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
。第二個最常見的原因是伺服器傳送的內容類型不明,不在先前的清單中。如要修正 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>
Google 的更新基礎架構 Omaha 已借用這個 XML 格式。擴充功能系統會針對更新資訊清單的 <app>
和 <updatecheck>
元素使用下列屬性:
- appid
- 擴充功能 ID 會根據公開金鑰的雜湊值產生,如包裝一節所述。擴充功能 ID 會顯示在「擴充功能管理」頁面。
- 程式碼集
.crx
檔案的 HTTPS 網址。- 版本
- 供用戶端使用,以便判斷是否應下載
codebase
指定的.crx
檔案。這個值應與.crx
檔案的manifest.json
檔案中「version」的值相符。
更新資訊清單 XML 檔案可能會包含多個擴充功能的資訊,方法是加入多個 <app>
元素。
測試
預設的更新檢查頻率為幾小時,但您可以使用「Extension Management」(擴充功能管理) 頁面上的「Update extensions now」按鈕強制更新。
系統將開始檢查所有已安裝的擴充功能。
進階用法:要求參數
基本自動更新機制旨在讓伺服器端作業變得簡單,只要將靜態 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。