Linux 自行託管

在 Linux 系統中,Chrome 使用者可以安裝非託管於 Chrome 線上應用程式商店本文說明如何封裝、代管及更新 crx 來自一般用途網路伺服器的檔案如果您僅發布擴充功能或主題 請透過 Chrome 線上應用程式商店諮詢線上應用程式商店代管服務, 更新中

套件

擴充功能和主題會以 .crx 檔案的形式提供。透過 Chrome Developer 上傳時 資訊主頁,資訊主頁就會自動建立 crx 檔案。如已發布 如果是個人伺服器,crx 檔案必須在本機建立,或透過 Chrome 下載 。

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

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

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

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

在本機建立 .crx

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

在「擴充功能管理」頁面上,按一下 開發人員模式:然後選取「PACK EXTENSION」按鈕。

已勾選開發人員模式,然後點選「封裝擴充功能」

在「擴充功能根目錄」欄位中指定擴充功能資料夾的路徑,然後按一下 [封裝擴充功能] 按鈕,忽略首次套件的「Private key」欄位。

指定擴充功能路徑,然後按一下 [ 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 提供
    • 這類檔案會搭配下列其中一種內容類型提供:
    • 空字串
    • "text/plain"
    • "application/octet-stream"
    • "unknown/unknown"
    • "application/unknown"
    • "\*/\*"

無法識別可安裝檔案最常見的原因,就是伺服器會將 標頭 X-Content-Type-Options: nosniff。第二個最常見的原因是 未知的內容類型— 一個不在上述清單中。如要修正 HTTP 標頭問題,請 伺服器的設定,或嘗試在其他伺服器代管 .crx 檔案。

更新

瀏覽器每隔幾小時就會檢查已安裝的擴充功能是否有更新網址。每個 Pod 都會 要求給該網址,尋找更新資訊清單 XML 檔案。

  • 更新檢查傳回的內容是更新資訊清單 XML 文件,其中列出 。

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

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

更新網址

如果擴充功能是由 Chrome 線上應用程式商店以外的伺服器代管,請務必在路徑中加入 update_url 欄位 對方的 manifest.json 檔案。

{
  "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 檔案。它應該與「version」的值相符位於 .crx 檔案的 manifest.json 檔案中。

更新資訊清單 XML 檔案可能包含多個副檔名的資訊,方法是加入多個 <app> 元素。

測試

預設的更新檢查頻率為數小時,但您可以使用更新 擴充功能管理頁面按鈕。

立即更新擴充功能

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

進階用法:要求參數

基本的自動更新機制是為了讓伺服器端正常運作,如同 安裝到任何純文字伺服器 (如 Apache),然後將該 XML 檔案更新為 發布擴充功能版本。

代管多個擴充功能的開發人員可能會檢查要求參數 (指出擴充功能 ID) 更新要求中的版本和版本只要加入這些參數,擴充功能就能從 執行動態伺服器端程式碼 (而非靜態 XML 檔案) 的「同一個網址」。

要求參數的格式如下:

?x=EXTENSION_DATA

其中 EXTENSION_DATA 是採用以下格式的網址編碼字串:

id=EXTENSION_ID&v=EXTENSION_VERSION

例如,兩個副檔名指向同一個更新網址 (https://test.com/extension_updates.php):

  • 擴充功能 1
    • ID:「aaaaaaaaaaaaaaaaaaaaaaaaaaaa」
    • 版本:「1.1」
  • 擴充功能 2
    • ID:"bbbbbbbbbbbbbbbbbbbbbbbb 更改</b]
    • 版本:「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 或更高版本 版本,請加上「prodversionmin」屬性設為更新回應中的 <app> 元素。

<?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 的情況下,使用者才會自動更新至第 2 版 3.0.193.0 以上版本。