Linux 的自托管

Chrome 用户只能通过 Linux 安装 Chrome 应用商店。本文介绍了如何打包、托管和更新 crx 来自通用网络服务器的文件。如果您仅分发扩展程序或主题 访问 Chrome 应用商店,请查阅应用商店托管和 正在更新

软件包

扩展程序和主题以 .crx 文件的形式提供。通过 Chrome 开发者工具上传 信息中心,则信息中心会自动创建 crx 文件。如果已发布 在个人服务器上,则需要在本地创建 crx 文件,或者从 Chrome 中下载该文件 应用商店。

从 Chrome 应用商店下载 .crx

如果扩展程序托管在 Chrome 应用商店中,则可从以下网址下载 .crx 文件: 开发者信息中心。在“您的商品详情”下方找到相应扩展程序然后点击“详情”在 弹出式窗口,点击蓝色的 main.crx 链接即可下载。

从开发者信息中心下载 .crx

下载的文件可以托管在个人服务器上。这是托管 因为 Chrome 应用商店会对扩展程序的内容进行签名。这个 有助于检测潜在的攻击和篡改。

在本地创建 .crx

扩展程序目录会在“扩展程序管理”页面上转换为 .crx 文件。导航到 chrome://extensions/,或者点击 Chrome 菜单,然后将鼠标指针悬停在“更多工具”上然后 选择“扩展程序”。

在“扩展程序管理”页面上,点击“扩展程序”旁边的切换开关 开发者模式。然后选择软件包扩展按钮。

已选中开发者模式,然后点击“打包扩展程序”

在“扩展程序根目录”字段中指定扩展程序文件夹的路径,然后点击 软件包扩展按钮。对于首次使用的文件包,请忽略私钥字段。

指定扩展程序路径,然后点击“打包扩展程序”

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"
    • "unknown/unknown"
    • "application/unknown"
    • "\*/\*"

无法识别可安装文件的最常见原因是,服务器发送了 标题 X-Content-Type-Options: nosniff。第二种最常见的原因是 未知内容类型 - 不在前一个列表中的内容类型。要修复 HTTP 标头问题,您可以将 服务器配置,或尝试在其他服务器上托管 .crx 文件。

更新

浏览器每隔几小时就会检查已安装的扩展程序是否有更新网址。对于每一个事件,都会生成一个 请求,以查找更新清单 XML 文件。

  • 更新检查返回的内容是一个更新清单 XML 文档,其中列出了 扩展程序版本

如果更新清单提及的版本高于安装的版本, 下载并安装新版本。与手动更新一样,必须为新的 .crx 文件签名 拥有与当前安装的版本相同的私钥。

注意:为了保护用户隐私,Google Chrome 不会随自动更新清单请求发送任何 Cookie 标头,并会忽略对这些请求的响应中的任何 Set-Cookie 标头。

更新网址

如果扩展程序托管在 Chrome 应用商店之外的服务器上,则必须在update_urlmanifest.json 文件。

{
  "name": "My extension",
  ...
  "update_url": "https://myhost.com/mytestextension/updates.xml",
  ...
}

更新清单

服务器返回的更新清单应为 XML 文档。

 version='1.0' encoding='UTF-8'?>
 xmlns='http://www.google.com/update2/response' protocol='2.0'>
   appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
     codebase='https://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
  

此 XML 格式借用了 Google 的更新基础架构 Omaha 所使用的格式。通过 扩展系统为 元素 更新清单:

appid
扩展程序 ID 基于公钥的哈希值生成,如打包中所述。扩展程序的 ID 就显示在“扩展程序管理”页面上。
代码库
指向 .crx 文件的 HTTPS 网址。
版本
供客户端用于确定是否应下载 codebase 指定的 .crx 文件。它应该与“version”的值一致位于 .crx 文件的 manifest.json 文件中。

更新清单 XML 文件可能包含关于多个扩展名的信息 元素。

测试

默认的更新检查频率为几小时,但可以使用更新 扩展程序管理页面上的“立即扩展程序”按钮

立即更新扩展程序

系统会开始检查所有已安装的扩展程序。

高级用法:请求参数

基本的自动更新机制旨在使服务器端工作变得简单,就像直接丢弃一个 将静态 XML 文件复制到任何普通 Web 服务器(如 Apache)上,然后将该 XML 文件更新为新的 扩展程序版本发布。

托管多个扩展程序的开发者可能会检查请求参数,这些参数表示扩展程序 ID 和版本信息添加这些参数可让扩展程序从 运行动态服务器端代码而不是静态 XML 文件的相同网址。

请求参数的格式为:

?x=EXTENSION_DATA

其中,EXTENSION_DATA 是以下格式的网址编码字符串:

id=EXTENSION_ID&v=EXTENSION_VERSION

例如,两个扩展程序指向同一个更新网址 (https://test.com/extension_updates.php):

  • 扩展程序 1
    • ID:“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”
    • 版本:“1.1”
  • 扩展程序 2
    • ID:“bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb”
    • 版本:“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 添加到扩展程序系统中,扩展程序的更新版本也会 但只有较新版本的浏览器才能发布虽然 Chrome 浏览器是自动更新的 绝大多数用户可能需要几天时间才会更新到任何特定的新版本。接收者 确保特定更新仅适用于 添加“prodversionmin”属性添加到更新响应中的 元素。

 version='1.0' encoding='UTF-8'?>
 xmlns='http://www.google.com/update2/response' protocol='2.0'>
   appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
     codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' prodversionmin='3.0.193.0'/>
  

这样可以确保用户只有在运行 Google Chrome 时才会自动更新到版本 2 3.0.193.0 或更高版本。