SakuraKyuo(讨论 | 贡献) (首次创建) |
SakuraKyuo(讨论 | 贡献) 无编辑摘要 |
||
第23行: | 第23行: | ||
openssl genrsa -out oem_cert_pri.pem 2048 | openssl genrsa -out oem_cert_pri.pem 2048 | ||
openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem | openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem | ||
私钥可能无法访问,并且只保存在[[wikipedia:Hardware_security_module|硬件安全模块 (HSM)]] 中。在这种情况下,密钥生成后可能会提供 x509 公钥证书。如需了解如何通过 x509 证书生成 AVB | 私钥可能无法访问,并且只保存在[[wikipedia:Hardware_security_module|硬件安全模块 (HSM)]] 中。在这种情况下,密钥生成后可能会提供 x509 公钥证书。如需了解如何通过 x509 证书生成 AVB 公钥,请参阅将[[Dynamic System Updates#将配对公钥添加到 ramdisk|配对公钥添加到 ramdisk]] 部分。 | ||
如需将 x509 证书转换为 PEM 格式,请运行以下命令: | 如需将 x509 证书转换为 PEM 格式,请运行以下命令: |
2024年8月6日 (二) 13:51的最新版本
Dynamic System Updates(DSU)是谷歌在Android 10中引入的一项创新功能。它允许用户在设备上加载和运行新的Android系统映像,作为当前操作系统的替代,而无需擦除现有系统。这意味着用户可以轻松地尝试下一个Android版本或测试不同的Android体验,而不会破坏他们现有系统。
DSU的功能和优势:
- 无需擦除现有系统: DSU允许用户加载新的Android系统映像,而不会擦除当前的操作系统和数据。这种无缝切换的能力使得用户可以灵活地管理和测试不同版本的Android系统。
- 灵活性和便捷性: 用户可以根据需要随时启用或禁用DSU功能。这为开发者、测试人员和普通用户提供了便利,他们可以在不影响现有配置的情况下,尝试和评估新的Android版本或功能。
- 安全性保障: DSU依赖于device-mapper-verity(dm-verity)内核功能来验证新加载的Android系统映像。这种安全性措施确保系统映像的完整性和安全性,防止恶意软件或损坏的系统映像被加载和运行。
DSU的实现要求:
- 为了启用DSU功能,系统必须配置以下内核选项:
CONFIG_DM_VERITY=y CONFIG_DM_VERITY_FEC=y
- Google为了存储与已安装DSU镜像相关的数据需要使用
metadata
分区,这要求机器必须为动态分区(Dynamic Partition)
DSU 流程
本部分介绍如何执行多个 DSU 配置流程。
生成新的密钥对
使用 openssl
命令生成 .pem
格式的 RSA 私钥/公钥对(例如,大小为 2048 位):
openssl genrsa -out oem_cert_pri.pem 2048 openssl rsa -in oem_cert_pri.pem -pubout -out oem_cert_pub.pem
私钥可能无法访问,并且只保存在硬件安全模块 (HSM) 中。在这种情况下,密钥生成后可能会提供 x509 公钥证书。如需了解如何通过 x509 证书生成 AVB 公钥,请参阅将配对公钥添加到 ramdisk 部分。
如需将 x509 证书转换为 PEM 格式,请运行以下命令:
openssl x509 -pubkey -noout -in oem_cert_pub.x509.pem > oem_cert_pub.pem
将配对公钥添加到 ramdisk
oem_cert.avbpubkey
必须放在 /avb/*.avbpubkey
下,以验证已签名的 DSU 软件包。首先,将 PEM 格式的公钥转换为 AVB 公钥格式:
avbtool extract_public_key --key oem_cert_pub.pem --output oem_cert.avbpubkey
然后,按照以下步骤在第一阶段 ramdisk 中添加公钥。
- 1. 添加一个预构建模块以复制
avbpubkey
。例如,使用如下内容可添加device/<company>/<board>/oem_cert.avbpubkey
和device/<company>/<board>/avb/Android.mk
:
include $(CLEAR_VARS) LOCAL_MODULE := oem_cert.avbpubkey LOCAL_MODULE_CLASS := ETC LOCAL_SRC_FILES := $(LOCAL_MODULE) ifeq ($(BOARD_USES_RECOVERY_AS_BOOT),true) LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/first_stage_ramdisk/avb else LOCAL_MODULE_PATH := $(TARGET_RAMDISK_OUT)/avb endif include $(BUILD_PREBUILT)
- 2. 让 droidcore 目标依赖于添加的
oem_cert.avbpubkey
:
droidcore: oem_cert.avbpubkey
在 JSON 描述符中生成 AVB 公钥属性
oem_cert.avbpubkey
采用 AVB 公钥二进制格式。在将它放入 JSON 描述符之前,使用 SHA-1 使其可读。
sha1sum oem_cert.avbpubkey | cut -f1 -d ' ' 3e62f2be9d9d813ef5........866ac72a51fd20
以下将是 JSON 描述符的 pubkey
属性的内容。
"images":[ { ... "pubkey":"3e62f2be9d9d813ef5........866ac72a51fd20", ... },
对 DSU 软件包进行签名
使用下列方法之一对 DSU 软件包进行签名:
- 方法 1:重复使用通过原始 AVB 签名流程创建的工件创建 DSU 软件包。一种替代方式是从发布软件包中提取已签名的映像,并使用提取的映像直接创建 ZIP 文件。
- 方法 2:在私钥可用时使用以下命令对 DSU 分区进行签名。DSU 软件包(ZIP 文件)中的每个
img
均会单独签名:
key_len=$(openssl rsa -in oem_cert_pri.pem -text | grep Private-Key | sed -e 's/.*(\(.*\) bit.*/\1/') for partition in system product; do avbtool add_hashtree_footer \ --image ${OUT}/${partition}.img \ --partition_name ${partition} \ --algorithm SHA256_RSA${key_len} \ --key oem_cert_pri.pem done
如需详细了解如何使用 avbtool
添加 add_hashtree_footer
,请参阅使用 avbtool。
在本地验证 DSU 软件包
建议您使用以下命令对照配对公钥验证所有本地映像:
for partition in system product; do avbtool verify_image --image ${OUT}/${partition}.img --key oem_cert_pub.pem done
预期的输出如下所示:
Verifying image dsu/system.img using key at oem_cert_pub.pem vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/system.img : Successfully verified sha1 hashtree of dsu/system.img for image of 898494464 bytes Verifying image dsu/product.img using key at oem_cert_pub.pem vbmeta: Successfully verified footer and SHA256_RSA2048 vbmeta struct in dsu/product.img : Successfully verified sha1 hashtree of dsu/product.img for image of 905830400 bytes
创建 DSU 软件包
以下示例将展示如何创建一个包含 system.img
和 product.img
的 DSU 软件包:
dsu.zip { - system.img - product.img }
在两个映像均已签名后,使用以下命令创建 ZIP 文件:
mkdir -p dsu cp ${OUT}/system.img dsu cp ${OUT}/product.img dsu cd dsu && zip ../dsu.zip *.img && cd -
自定义一键式 DSU
默认情况下,DSU 加载器指向 GSI 映像的元数据,即 https://...google.com/.../gsi-src.json
。
OEM 可以通过定义指向其 JSON 描述符的 persist.sys.fflag.override.settings_dynamic_system.list
属性来覆盖该列表。例如,OEM 可能会提供包含 GSI 和 OEM 专有映像的 JSON 元数据,如下所示:
{ "include": ["https://dl.google.com/.../gsi-src.JSON"] "images":[ { "name":"OEM image", "os_version":"10", "cpu_abi": "arm64-v8a", "details":"...", "vndk":[ 27, 28, 29 ], "spl":"...", "pubkey":"", "uri":"https://.../....zip" }, }
OEM 可以链接已发布的 DSU 元数据,如图所示。