7. SquashFS RootFS 签名与内核验签

7.1. 整体目标

  • 目的:保证设备上 mtdblock6 等设备节点对应的 SquashFS rootfs(分区号以板级为准)未被篡改,内核在挂载前对其做签名验证,失败则拒绝挂载。

  • 实现方式:构建时对 mksquashfs 产出的镜像做 SHA256裸 RSA 签名,并追加自定义签名块;内核挂载前按同一规则验签。

7.2. 使用与排查建议

日常使用可归纳为:

  1. menuconfig->Kernel options->Enable kernel secure boot。

  2. 执行 build_all

  3. 烧录生成的镜像,将 install/.../rootfs.spinor (路径随板型变化)写入 ROOTFS 分区。

可选:用 check_rootfs_sig.sh 确认 rootfs 已签名(sig_len>0)。更换证书时需同时更新 linux_5.10/certs/cert.pem 与构建端 -c / -k 参数。

  • 验签成功:日志出现 VFS: Mounted root (squashfs filesystem) readonly on device 31:6. ,随后 /sbin/init 正常启动。

  • error -126:若日志出现 SquashFS raw signature requires cert with 'SquashFS Root Signing' ,则 get_squashfs_x509_key() 为 NULL。通过 fallback 修改后,单证书(如 “Internet Widgits Pty Ltd”)会被用作 SquashFS key,此错误可消除。

  • error -129 (仅旧 PKCS#7 路径):若日志出现 Message digest doesn't match 或提示 error -129,多为设备上前 bytes_used 字节与签名时 payload 不一致;当前已用自定义 raw 格式,无此 PKCS#7 摘要比较。

7.3. 相关文件

用途

路径(相对仓库根)

私钥(签名)

ramdisk/keys/test_reeos.key

证书(验签)

linux_5.10/certs/cert.pem

签名脚本

build/scripts/append_squashfs_sig.py

检查脚本

build/scripts/check_rootfs_sig.sh

内核验签

linux_5.10/fs/squashfs/verification.c

证书加载

linux_5.10/certs/system_keyring.c

SquashFS key 接口

linux_5.10/security/keys/key.c

证书通过 CONFIG_SYSTEM_TRUSTED_KEYS 编入内核;构建时用上述私钥对 rootfs 签名。