Android下的配置管理之道之对 OTA 更新包进行签名

对要发布的版本进行签名

Android 操作系统映像在两个地方使用加密签名:

  • 映像中的所有 .apk 文件都必须经过签名。Android 软件包管理器通过下列两种方式使用 .apk 签名:

更换应用时,必须使用与旧应用相同的密钥对其签名,才能存取旧应用的数据。无论是通过覆盖 .apk 来更新用户应用,还是使用安装在 /data
下的新版本应用来覆盖系统应用,这一点都适用。 如果两个或多个应用想要共享同一个用户
ID(方便共享数据等),则必须使用相同的密钥对它们进行签名。

  • 必须使用符合系统预期的密钥对 OTA 更新包进行签名,否则在安装过程中 OTA 更新包将被拒绝。

发布密钥

Android 树的 build/target/product/security 目录中提供了测试密钥。使用 make 编译 Android 操作系统映像便可使用这些测试密钥对所有 .apk 文件进行签名。由于这些测试密钥是公开的,任何人都可以使用相同的密钥对他们自己的 .apk 文件签名,这样他们就能够替换或盗用您的操作系统映像中编译的系统应用。因此,您必须使用只有您自己才能访问的特殊“发布密钥”集对公开发布或部署的 Android 操作系统映像进行签名。

要生成您自己的唯一发布密钥集,请在 Android 树的根目录下运行以下命令:

subject='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/[email protected]'
mkdir ~/.android-certs
for x in releasekey platform shared media; do \
    ./development/tools/make_key ~/.android-certs/$x "$subject"; \
  done

您需要对 $subject 进行更改以反映贵组织的信息。您可以使用任何目录,但要注意选择一个已备份且安全的位置。部分供应商会使用强密码加密私钥,并将其存储在源代码控制系统中;其他供应商则将他们的发布密钥完全存储在其他地方,如气隙阻隔的计算机上。

要生成发布映像,请使用以下命令:

make dist
./build/tools/releasetools/sign_target_files_apks \
    -o \    # explained in the next section
    --default_key_mappings ~/.android-certs out/dist/*-target_files-*.zip \
    signed-target_files.zip

sign_target_files_apks 脚本将目标文件 .zip 作为输入文件,并生成一个新的目标文件 .zip,其中所有的 .apk 文件都已使用新密钥签名。您可以在 signed-target_files.zip 中的 IMAGES/ 目录下找到新签名的映像。

对 OTA 更新包进行签名

您可以按照以下步骤将已签名的目标文件 zip 转换为已签名的 OTA 更新 zip:

./build/tools/releasetools/ota_from_target_files \
    --key_mapping ~/.android-certs/releasekey \
    signed-target_files.zip \
    signed-ota_update.zip

签名和旁加载

旁加载不会绕过 Recovery 流程中的正常软件包签名验证机制。在安装一个软件包之前,Recovery 会验证该软件包是否由与 Recovery 分区中存储的公钥相匹配的私钥进行签名,这与利用无线方式传输的软件包的处理方式一样。

从主系统收到的更新包通常要经过两次验证:一次是由主系统使用 Android API 中的 RecoverySystem.verifyPackage() 方法进行验证,另一次是通过 Recovery 进行验证。RecoverySystem API 对照存储在主系统 /system/etc/security/otacerts.zip 文件(默认情况下)中的公钥对签名进行检查。Recovery 对照存储在 Recovery 分区 RAM 磁盘中的 /res/keys 文件中的公钥对签名进行检查。

默认情况下,由此版本生成的目标文件 .zip 会将 OTA 证书设置为与测试密钥相匹配。在发布的映像上,必须使用不同的证书,这样设备才能验证更新包的真实性。如前面一部分所示,将 -o 标志传递到 sign_target_files_apks 即可将测试密钥证书替换成您的证书目录中的发布密钥证书。

通常情况下,系统映像和 Recovery 映像存储的是相同的 OTA 公钥集。通过将密钥仅添加至 Recovery 密钥集,可对只能通过旁加载安装的 apk 包(假设主系统的更新下载机制正确地对照 otacerts.zip 进行验证)签名。您可以通过在产品定义中设置 PRODUCT_EXTRA_RECOVERY_KEYS 变量来指定其他仅可纳入 Recovery 中的密钥:

vendor/yoyodyne/tardis/products/tardis.mk
 [...]

PRODUCT_EXTRA_RECOVERY_KEYS := vendor/yoyodyne/security/tardis/sideload

其中包括 Recovery 密钥文件中的公钥 vendor/yoyodyne/security/tardis/sideload.x509.pem,因此它可以安装用此公钥签名的 apk 包。但 otacerts.zip 中不包含额外的密钥,因此正确验证下载包的系统不会针对用此密钥签名的 apk 包调用 Recovery。

证书和私钥

每个密钥都包含两个文件:一个是扩展名为 .x509.pem 的证书,另一个是扩展名为 .pk8 的私钥。私钥需要加以保密,并用于对 apk 包进行签名。密钥本身也可能受密码保护。相比之下,证书只包含公开的一半密钥,因此可以大范围地分发。证书被用于验证某个 apk 包是否由相应的私钥进行签名。

标准 Android 版本使用四个密钥,所有这些密钥都位于 build/target/product/security 中:

  • testkey 适用于未另外指定密钥的 apk 包的通用默认密钥。
  • 平台 适用于核心平台所包含的 apk 包的测试密钥。
  • 共享 适用于家庭/联系人进程中的共享内容的测试密钥。
  • 媒体 适用于媒体/下载系统所包含的 apk 包的测试密钥。

单个 apk 包通过在其 Android.mk 文件中设置 LOCAL_CERTIFICATE 来指定其中一个密钥。(如果未设置此变量,则使用 testkey。)您还可以通过路径名指定完全不同的密钥,例如:

device/yoyodyne/apps/SpecialApp/Android.mk
 [
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值