安全启动与加密
1. 概述
1.1 功能简介
RK3588 安全启动与加密功能为嵌入式 Linux 系统提供一套完整的安全防护体系,包含三大核心机制:
- 安全启动(Secure Boot):开机时由芯片内固化的 Boot ROM 逐级验证签名链,确保从硬件到操作系统的每一级引导镜像都经过授权签名,防止固件被篡改或刷入未授权镜像。
- 硬件加密引擎:芯片内部集成的加密协处理器,支持 AES-128/192/256、SHA-256/MD5、RSA-2048/4096 等算法,用于磁盘加密、镜像签名验证和安全通信。
- ARM TrustZone:ARM 处理器自带的硬件隔离技术,把芯片分成安全世界(Secure World)和普通世界(Normal World)两个运行环境,敏感代码和数据放在安全世界,普通世界无法访问。RK3588 通过 ARM CCA(Confidential Compute Architecture)架构实现 EL3/EL1 安全隔离。
此外,RK3588 还提供 OTP(One-Time Programmable,一次性可编程存储,写入后无法再改)用于安全密钥存储,以及 TRNG(True Random Number Generator,真随机数生成器)用于生成密码学安全的随机数。
1.2 应用场景
- 工业控制设备:防止未授权固件刷入,保护产线安全和知识产权
- 智能家居网关:保障设备身份认证和数据传输安全
- 车载信息娱乐系统:满足汽车功能安全(ISO 26262)对安全启动的要求
- 金融支付终端:保护交易密钥和用户敏感数据
- 物联网边缘设备:远程 OTA 升级时验证固件完整性
- 国防与安全通信:满足等保/密评等安全合规要求
1.3 工作原理
RK3588 安全启动采用逐级验证签名链的机制:从 Boot ROM 这个硬件信任根开始,每一级先验证下一级的签名,通过后才把控制权交给下一级,一直接力到内核和根文件系统。任何一级验签失败,启动流程都会中断:
┌─────────────────────────────────────────────────────────┐
│ Boot ROM (硬件) │
│ 验证一级引导加载器签名 │
│ 信任根:OTP 中烧录的根公钥哈希 │
├─────────────────────────────────────────────────────────┤
│ TPL → SPL (U-Boot) │
│ 验证 U-Boot 主程序签名 │
│ 验证内核镜像签名 │
├─────────────────────────────────────────────────────────┤
│ U-Boot 主程序 │
│ 加载并验证 Linux Kernel │
├─────────────────────────────────────────────────────────┤
│ Linux Kernel 6.1 │
│ 验证根文件系统完整性 │
│ dm-crypt / LUKS 磁盘加密 │
├─────────────────────────────────────────────────────────┤
│ 根文件系统 (Rootfs) │
│ 应用层安全服务 │
└─────────────────────────────────────────────────────────┘TrustZone 的分离架构如下图,左列跑在安全世界,右列跑在普通世界,两边互不可见:
┌──────────────────────┬──────────────────────┐
│ Secure World │ Normal World │
│ (EL3 / EL1) │ (EL1 / EL0) │
├──────────────────────┼──────────────────────┤
│ OP-TEE OS │ Linux Kernel 6.1 │
│ Secure Monitor │ U-Boot │
│ 密钥管理 │ 应用程序 │
│ OTP 访问控制 │ 普通外设驱动 │
│ 加密加速器 │ 文件系统 │
└──────────────────────┴──────────────────────┘2. 硬件准备
2.3 运行环境(本机)
下表是本机结果:
| 项 | 实际值 |
|---|---|
| OP-TEE | 在运行:optee: revision 3.13 (1e844e4c),dynamic shared memory enabled |
| TEE 设备节点 | /dev/tee0、/dev/teepriv0 存在 |
| 内核配置 | CONFIG_TEE=y、CONFIG_OPTEE=y(另有 SCMI/HWRNG 的 OPTEE 通道) |
| 固件链版本(cmdline 实录) | fwver=ddr-v1.21, spl-v1.14, bl31-v1.54, bl32-v1.20, uboot-250929(bl32 即 OP-TEE) |
| Verified Boot 状态 | androidboot.verifiedbootstate=orange,即 bootloader 处于解锁态,签名校验未强制 |
| openssl | 3.0.20(/usr/bin/openssl,可用) |
| mkimage / certtool | 未安装(签名镜像需装 u-boot-tools 等) |
| cryptsetup | 未安装(磁盘加密 4.5 节需 apt install cryptsetup) |
| OP-TEE CA/TA | /usr/lib/optee_armtz 不存在(无预装普通世界 TA) |
结论:本机 BL32(OP-TEE)已加载,TEE 设备节点可用,安全世界已经就绪;但
verifiedbootstate=orange说明 bootloader 处于解锁态,签名校验未强制,Secure Boot 链路没有闭环。要跑通 4.2/4.3 节的签名、烧录、验证流程,需要先在 maskrom 模式下烧写签名的 loader 并锁机。
2.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3588LQ 核心板 + SHIMETAPI-M5-R2A 底板 | 1 | 已烧录 Linux 系统 |
| 调试串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| 电源适配器 | 4V/5A DC | 1 | 误差 ±5% |
| USB 数据线 | USB-A to USB-C | 1 | 用于 OTG 烧录(底板 J6 口) |
| eMMC 模块 | 32GB+ | 1 | 支持 eMMC 加密功能 |
C-3588LQ 核心板内置 RK3588 SoC,集成硬件加密引擎和 TrustZone 支持;SHIMETAPI-M5-R2A 底板提供调试接口和电源管理。
2.2 硬件确认
上电后通过串口终端登录,逐项确认加密相关硬件是否存在:
# 通过串口登录后,检查加密硬件是否存在
ls /dev/crypto 2>/dev/null && echo "硬件加密引擎可用" || echo "未检测到加密引擎"
# 检查 TrustZone 状态
dmesg | grep -i "tee\|trustzone\|optee"
# 查看 OTP 设备节点
ls /dev/otp* 2>/dev/null
# 检查 TRNG
cat /sys/class/misc/hw_random/rng_available 2>/dev/null3. 软件准备
3.1 安全工具安装
先装好主机侧的加密工具链和 Rockchip 签名工具,后面生成密钥、签名镜像都要用到:
# 安装加密相关工具链
sudo apt update
sudo apt install -y \
openssl \
cryptsetup \
dm-crypt \
lUKS \
libssl-dev \
libcrypto++-dev \
pinentry-curses \
gnupg2
# 安装 Rockchip 安全工具(签名工具)
# 位于 SDK tools 目录
cd /path/to/rk3588_linux_sdk
cd tools/linux/Linux_Sign_Tool/
sudo dpkg -i linux_Sign_Tool.deb
# 验证签名工具安装
secure_tool --version最后一条命令能输出版本号,说明签名工具装好了。
3.2 内核配置
RK3588 Linux 6.1 内核需要启用以下安全相关配置:
# 进入内核源码目录
cd /path/to/rk3588_linux_sdk/kernel
# 打开内核配置菜单
make ARCH=arm64 rockchip_linux_defconfig
make ARCH=arm64 menuconfig关键内核配置项:
# 加密文件系统支持
CONFIG_DM_CRYPT=y
CONFIG_BLK_DEV_DM=y
CONFIG_CRYPTO_AES=y
CONFIG_CRYPTO_AES_ARM64_CE=y
CONFIG_CRYPTO_XTS=y
CONFIG_CRYPTO_SHA256=y
CONFIG_CRYPTO_SHA256_ARM64_CE=y
# LUKS 支持
CONFIG_BLK_DEV_DM_CRYPT=y
CONFIG_DM_CRYPTO=y
# TrustZone / OP-TEE 支持
CONFIG_TEE=y
CONFIG_OPTEE=y
CONFIG_ARM_SMCCC=y
# 硬件随机数
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_ROCKCHIP=y
# TPM 支持(可选)
CONFIG_TPM=y
CONFIG_TPM2_TIS_CORE=y
CONFIG_TPM_ROCKCHIP=y
# Secure JTAG 控制
CONFIG_ROCKCHIP_SECURE=y将上述配置写入 defconfig 后重新编译内核:
# 应用配置并编译
make ARCH=arm64 rockchip_linux_defconfig
make ARCH=arm64 -j$(nproc)4. 操作步骤
4.1 密钥生成
安全启动的密钥是一层层签发下去的:根密钥最关键,它的公钥哈希要烧进 OTP;再由各级密钥分别签名 SPL、U-Boot 和内核。层级关系如下:
Root Key (根密钥)
└── SPL 签名密钥
└── U-Boot 签名密钥
└── Kernel 签名密钥生成根密钥对:
# 创建密钥工作目录
mkdir -p ~/rk3588_secure_keys && cd ~/rk3588_secure_keys
# 生成 RSA-4096 根私钥(用于签名 SPL)
openssl genrsa -out root_private.pem 4096
# 导出根公钥
openssl rsa -in root_private.pem -pubout -out root_public.pem
# 计算公钥 SHA-256 哈希(用于烧录到 OTP)
openssl dgst -sha256 root_public.pem | awk '{print $2}' > root_public.sha256
echo "根密钥对已生成:"
echo " 私钥: root_private.pem"
echo " 公钥: root_public.pem"
echo " 公钥哈希: root_public.sha256"执行完成后,工作目录里应出现 root_private.pem、root_public.pem 和 root_public.sha256 三个文件。私钥务必妥善保管,泄露等于安全启动失效。
生成 SPL 签名密钥:
# 生成 SPL 签名密钥对
openssl genrsa -out spl_private.pem 4096
openssl rsa -in spl_private.pem -pubout -out spl_public.pem
# 生成 SPL 签名的签发证书(使用根密钥签发)
openssl req -new -x509 -key spl_private.pem \
-out spl_certificate.pem \
-days 3650 \
-subj "/CN=RK3588 SPL Signing Key/O=ShimetaPi"
# 使用根私钥签发 SPL 证书
openssl x509 -req \
-in <(openssl x509 -in spl_certificate.pem -outform DER | \
openssl dgst -sha256 -binary - | \
openssl asn1parse -inform DER -offset 2 -in /dev/stdin) \
-CA root_certificate.pem \
-CAkey root_private.pem \
-out spl_certificate_signed.pem生成 U-Boot 签名密钥:
# 生成 U-Boot 签名密钥对
openssl genrsa -out uboot_private.pem 4096
openssl rsa -in uboot_private.pem -pubout -out uboot_public.pem
# 生成签名证书
openssl req -new -x509 -key uboot_private.pem \
-out uboot_certificate.pem \
-days 3650 \
-subj "/CN=RK3588 U-Boot Signing Key/O=ShimetaPi"生成内核签名密钥:
# 生成内核签名密钥对
openssl genrsa -out kernel_private.pem 4096
openssl rsa -in kernel_private.pem -pubout -out kernel_public.pem
# 生成签名证书
openssl req -new -x509 -key kernel_private.pem \
-out kernel_certificate.pem \
-days 3650 \
-subj "/CN=RK3588 Kernel Signing Key/O=ShimetaPi"4.2 签名镜像
RK3588 使用 Rockchip 官方签名工具对各级镜像进行签名,SPL、U-Boot、内核各签一次:
# 切换到签名工具目录
cd /path/to/rk3588_linux_sdk/tools/linux/Linux_Sign_Tool
# 签名 SPL 镜像(TPL/SPL)
./secure_tool \
--bit0 \
--bburn \
--chip rk3588 \
--fxl boot_images \
--key /path/to/spl_private.pem \
--cert /path/to/spl_certificate_signed.pem \
--secure_boot_enable \
--otsp [OTP_VALUE] \
--infile /path/to/spl.bin \
--outfile /path/to/spl_signed.bin
# 签名 U-Boot 镜像
./secure_tool \
--bit0 \
--bburn \
--chip rk3588 \
--fxl loader \
--key /path/to/uboot_private.pem \
--cert /path/to/uboot_certificate.pem \
--secure_boot_enable \
--infile /path/to/u-boot.bin \
--outfile /path/to/u-boot_signed.bin
# 签名内核镜像(boot.img)
./secure_tool \
--bit0 \
--bburn \
--chip rk3588 \
--fxl boot \
--key /path/to/kernel_private.pem \
--cert /path/to/kernel_certificate.pem \
--secure_boot_enable \
--infile /path/to/boot.img \
--outfile /path/to/boot_signed.img如果不想用官方工具,也可以用 openssl 手动签名(替代方案):
# 对内核镜像进行 SHA-256 签名
openssl dgst -sha256 -sign kernel_private.pem \
-out boot.img.sig boot.img
# 验证签名
openssl dgst -sha256 -verify kernel_public.pem \
-signature boot.img.sig boot.img
echo "签名验证结果: $?"4.3 烧录安全镜像
把签名后的镜像烧进 eMMC。注意必须烧签名版本,未签名的镜像在安全启动启用后无法通过验证:
# 使用 upgrade_tool 烧录安全镜像到 eMMC
# 注意:安全镜像必须使用签名版本
upgrade_tool wl 0 /path/to/spl_signed.bin # SPL (Block 0)
upgrade_tool wl 0x40 /path/to/u-boot_signed.bin # U-Boot (Block 0x40)
upgrade_tool wl 0x4000 /path/to/boot_signed.img # Kernel (Block 0x4000)
# 或者使用统一固件烧录
upgrade_tool uf /path/to/update_signed.img
# 验证烧录结果(串口查看启动日志)
# 安全启动启用后,日志中应包含:
# Secure Boot: enabled
# Signature verification: passedSD 卡烧录方式:
# 将签名镜像写入 SD 卡
sudo dd if=spl_signed.bin of=/dev/sdX bs=4096 seek=64
sudo dd if=u-boot_signed.bin of=/dev/sdX bs=4096 seek=16384
sudo dd if=boot_signed.img of=/dev/sdX bs=4096 seek=32768
sync烧录完重启,通过串口日志确认:安全启动启用后应能看到 "Secure Boot: enabled" 和 "Signature verification: passed" 两行,出现即表示闭环成功。
4.4 TrustZone 配置
RK3588 的 TrustZone 功能通过 OP-TEE OS(跑在安全世界里的小型操作系统)实现,需要在 U-Boot 中做配置:
# 在 U-Boot 设备树中启用 TrustZone
# 文件:arch/arm64/dts/rk3588-xxx.dts
# 添加 OP-TEE 节点
optee: optee {
compatible = "rockchip,rk3588-optee";
method = "smc";
status = "okay";
};
# 在 U-Boot 环境变量中配置安全启动参数
setenv secure_boot 1
setenv verify 1
setenv fdt_addr_r 0x0a100000
saveenv配置完成后,编译并运行 OP-TEE 自带的测试程序验证:
# 编译 OP-TEE 测试
cd /path/to/rk3588_linux_sdk/optee
make -C optee_examples TEEC_EXPORT=/path/to/out TEEC_HOST_CROSS_COMPILE=aarch64-linux-gnu-
# 运行加密测试
/optee_test/xtest/crypto4.5 磁盘加密
RK3588 支持 eMMC 全盘加密和分区加密两种方式。下面以 LUKS(Linux Unified Key Setup,Linux 下标准的磁盘加密格式)为例,先手工走一遍流程:
LUKS 全盘加密:
# 1. 创建加密分区(假设 /dev/mmcblk0p7 为数据分区)
sudo cryptsetup luksFormat /dev/mmcblk0p7
# 输入加密密码并确认
# 2. 打开加密分区
sudo cryptsetup luksOpen /dev/mmcblk0p7 encrypted_data
# 3. 创建文件系统
sudo mkfs.ext4 /dev/mapper/encrypted_data
# 4. 挂载使用
sudo mount /dev/mapper/encrypted_data /mnt/data
# 5. 关闭加密分区
sudo umount /mnt/data
sudo cryptsetup luksClose encrypted_datadm-crypt 自动挂载配置: 用密钥文件代替手工输密码,开机自动解密挂载:
# 创建密钥文件
dd if=/dev/urandom of=/root/.crypt_key bs=1 count=256
chmod 600 /root/.crypt_key
# 使用密钥文件加密
sudo cryptsetup luksFormat --key-file /root/.crypt_key /dev/mmcblk0p7
# 配置 /etc/crypttab
echo "encrypted_data /dev/mmcblk0p7 /root/.crypt_key luks" | sudo tee -a /etc/crypttab
# 配置 /etc/fstab
echo "/dev/mapper/encrypted_data /mnt/data ext4 defaults 0 2" | sudo tee -a /etc/fstab
# 启动时自动解密
sudo update-initramfs -u配置完成后重启一次:如果 /mnt/data 自动挂载成功、不需要人工输密码,说明配置生效。
使用 RK3588 硬件加速器加速 dm-crypt:
# 检查硬件加速是否生效
cryptsetup benchmark
# 应能看到 AES-XTS 硬件加速结果
# 查看加密设备
dmsetup status encrypted_data5. 代码详解
5.1 安全启动流程
RK3588 Boot ROM 安全启动验证流程如下(伪代码表示),可以对照 4.1 节的密钥层级阅读:
/* RK3588 Boot ROM 安全启动验证流程(简化表示) */
int rk3588_secure_boot_verify(void)
{
/* Step 1: 从 OTP 读取根公钥哈希 */
uint8_t otp_root_key_hash[SHA256_SIZE];
otp_read(OTP_ROOT_KEY_HASH_ADDR, otp_root_key_hash, SHA256_SIZE);
/* Step 2: 加载 SPL 镜像到 SRAM */
uint8_t *spl_image = (uint8_t *)SRAM_BASE_ADDR;
emmc_read(SPL_BLOCK_OFFSET, spl_image, SPL_IMAGE_SIZE);
/* Step 3: 验证 SPL 签名 */
uint8_t spl_pub_key_hash[SHA256_SIZE];
sha256_compute(spl_certificate->public_key, spl_pub_key_hash);
if (memcmp(otp_root_key_hash, spl_pub_key_hash, SHA256_SIZE) != 0) {
/* 根公钥哈希不匹配,启动失败 */
rk3588_boot_fail("Root key hash mismatch");
return -1;
}
/* Step 4: 使用 SPL 公钥验证 SPL 签名 */
uint8_t *spl_data = spl_image + sizeof(spl_signature_t);
uint32_t spl_data_size = spl_image_size - sizeof(spl_signature_t);
if (rsa_verify(spl_certificate->public_key,
spl_data, spl_data_size,
spl_signature->data, spl_signature->sig_size) != 0) {
rk3588_boot_fail("SPL signature verification failed");
return -1;
}
/* Step 5: SPL 加载并验证 U-Boot */
/* ... 类似流程 ... */
return 0; /* 安全启动验证通过 */
}5.2 加密 API
RK3588 Linux 6.1 内核提供以下加密 API 接口:
/* 用户态加密 API 示例 (libcrypto) */
#include <openssl/evp.h>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <openssl/err.h>
/* AES-256-XTS 加密(与 dm-crypt 兼容的加密方式) */
int rk3588_aes256_xts_encrypt(
const unsigned char *plaintext, int plaintext_len,
const unsigned char *key, /* 512-bit key (256+256) */
const unsigned char *tweak, /* 128-bit tweak */
unsigned char *ciphertext)
{
EVP_CIPHER_CTX *ctx;
int len, ciphertext_len;
ctx = EVP_CIPHER_CTX_new();
if (!ctx) return -1;
/* 初始化 AES-256-XTS 加密上下文 */
if (EVP_EncryptInit_ex(ctx, EVP_aes_256_xts(), NULL, key, tweak) != 1)
goto err;
/* 执行加密 */
if (EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len) != 1)
goto err;
ciphertext_len = len;
if (EVP_EncryptFinal_ex(ctx, ciphertext + len, &len) != 1)
goto err;
ciphertext_len += len;
EVP_CIPHER_CTX_free(ctx);
return ciphertext_len;
err:
EVP_CIPHER_CTX_free(ctx);
return -1;
}
/* RSA-4096 签名验证 */
int rk3588_rsa4096_verify(
const unsigned char *data, int data_len,
const unsigned char *signature, int sig_len,
const unsigned char *pubkey_pem)
{
EVP_PKEY *pkey = NULL;
EVP_MD_CTX *mdctx = NULL;
FILE *fp;
int result = -1;
/* 加载公钥 */
fp = fopen("pubkey.pem", "rb");
if (!fp) return -1;
pkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL);
fclose(fp);
if (!pkey) return -1;
/* 创建验证上下文 */
mdctx = EVP_MD_CTX_new();
if (!mdctx) goto cleanup;
/* 初始化验证 */
if (EVP_DigestVerifyInit(mdctx, NULL, EVP_sha256(), NULL, pkey) != 1)
goto cleanup;
/* 更新待验证数据 */
if (EVP_DigestVerifyUpdate(mdctx, data, data_len) != 1)
goto cleanup;
/* 执行验证 */
result = EVP_DigestVerifyFinal(mdctx, signature, sig_len);
cleanup:
EVP_MD_CTX_free(mdctx);
EVP_PKEY_free(pkey);
return (result == 1) ? 0 : -1;
}5.3 OTP 编程
OTP 存储用于烧录安全密钥,是安全启动的信任根:
# 读取 OTP 内容(需要 root 权限)
otp_tool readotp -f /dev/otp0 -a 0x00 -l 256 -o otp_dump.bin
# 查看 OTP 区域分布
otp_tool show_info -f /dev/otp0
# OTP 关键区域地址(RK3588):
# 0x00-0x0F: 芯片 ID
# 0x10-0x1F: 锁定位
# 0x20-0x3F: 根公钥哈希(Secure Boot 信任根)
# 0x40-0x7F: 板级密钥
# 0x80-0xFF: 用户自定义区域
# 烧录根公钥哈希到 OTP(谨慎操作,OTP 只能写入一次!)
otp_tool writeotp -f /dev/otp0 -a 0x20 -d root_public.sha256
# 锁定 OTP 安全区域(防止后续修改)
otp_tool writeotp -f /dev/otp0 -a 0x10 -d 0x01注意:OTP 写入是不可逆操作,烧错了芯片就废了。执行前务必依次做完三件事,备份、核对、确认芯片型号:
# OTP 写入是不可逆操作!执行前务必:
# 1. 备份当前 OTP 内容
otp_tool readotp -f /dev/otp0 -a 0x00 -l 512 -o otp_backup_$(date +%Y%m%d).bin
# 2. 验证公钥哈希正确性
sha256sum root_public.pem
# 对比烧录值是否一致
# 3. 确认芯片型号正确
otp_tool readotp -f /dev/otp0 -a 0x00 -l 16 -o chip_id.bin
hexdump -C chip_id.bin
# 确认是 RK3588 芯片 IDSecure JTAG 禁用(生产环境):
# 禁用 JTAG 调试接口(生产安全需求)
# 注意:禁用后无法通过 JTAG 调试,需谨慎操作
otp_tool writeotp -f /dev/otp0 -a 0x14 -d 0x03 # 禁用 JTAG
# 验证 JTAG 状态
otp_tool readotp -f /dev/otp0 -a 0x14 -l 46. 常见问题
问题 1:安全启动验证失败,设备无法启动
现象: 串口日志显示 "Secure Boot: verification failed",设备停止启动。
原因: 签名镜像与 OTP 中存储的公钥不匹配。
解决方案:
# 1. 检查签名工具是否使用正确的密钥
secure_tool --check /path/to/spl_signed.bin
# 2. 确认 OTP 中的根公钥哈希
otp_tool readotp -f /dev/otp0 -a 0x20 -l 32 -o otp_key_hash.bin
sha256sum root_public.pem
# 对比两者是否一致
# 3. 重新生成签名镜像
cd tools/linux/Linux_Sign_Tool
./secure_tool --chip rk3588 --fxl boot_images \
--key root_private.pem --infile spl.bin --outfile spl_signed.bin
# 4. 临时关闭安全启动进行调试(仅开发环境)
# 在 U-Boot 命令行中
setenv secure_boot 0
saveenv
reset问题 2:dm-crypt 解密性能差
现象: 加密分区读写速度明显下降。
原因: 未使用 RK3588 硬件加密加速器。
解决方案:
# 1. 确认硬件加速模块已加载
lsmod | grep cryptodev
modprobe cryptodev
# 2. 验证硬件加速是否生效
cryptsetup benchmark | grep AES-XTS
# 硬件加速下 AES-256-XTS 应达到 500MB/s 以上
# 3. 检查内核配置
zcat /proc/config.gz | grep CRYPTO_AES_ARM64
# 应显示 CONFIG_CRYPTO_AES_ARM64_CE=y
# 4. 如果未启用,重新编译内核
make ARCH=arm64 menuconfig
# Cryptographic options → AES: ARM64 CE 模块问题 3:OP-TEE 启动失败
现象: 串口日志显示 "OP-TEE: initialization failed"。
原因: OP-TEE 镜像未正确烧录或设备树配置错误。
解决方案:
# 1. 检查 OP-TEE 镜像是否存在于 eMMC
mmc_part=mmcblk0p4 # OP-TEE 分区
dd if=/dev/$mmc_part of=tee.bin bs=1M count=4
hexdump -C tee.bin | head -1
# 应能看到 OP-TEE 魔数
# 2. 验证设备树 OP-TEE 节点
dtc -I dtb -O dts /path/to/rk3588.dtb -o rk3588.dts
grep -A 5 "optee" rk3588.dts
# 3. 重新烧录 OP-TEE 镜像
upgrade_tool wl 0x4000 /path/to/tee.bin
# 4. 修复设备树后重新编译
make ARCH=arm64 rk3588-xxx.dtb
cp arch/arm64/boot/dts/rockchip/rk3588-xxx.dtb /path/to/overlays/问题 4:LUKS 密钥丢失,无法解密分区
现象: 系统启动时提示输入解密密码,但忘记密码。
原因: 未备份 LUKS 头部或恢复密钥。
解决方案(预防措施):
# 1. 创建时备份 LUKS 头部(强烈建议!)
cryptsetup luksHeaderBackup /dev/mmcblk0p7 \
--header-backup-file /path/to/luks_header_backup.img
# 2. 添加恢复密钥
cryptsetup luksAddKey /dev/mmcblk0p7 --key-file /root/.crypt_key
# 3. 生成恢复码并安全存储
cryptsetup luksDump /dev/mmcblk0p7 | grep "Key Slot"
# 记录 Key Slot 信息
# 紧急恢复(如果有备份密钥)
cryptsetup luksOpen --key-file /root/.crypt_key \
/dev/mmcblk0p7 encrypted_data问题 5:Secure JTAG 禁用后无法调试
现象: 禁用 Secure JTAG 后,JTAG 调试器无法连接芯片。
原因: OTP 中 JTAG 锁定位已设置。
解决方案:
# 1. OTP 中的 JTAG 禁用是永久性的
# 2. 如需调试,需使用未禁用 JTAG 的芯片
# 3. 生产前建议先完成所有调试工作
# 预防措施:在禁用 JTAG 前,先启用 SWD 调试
otp_tool readotp -f /dev/otp0 -a 0x14 -l 4 # 读取当前状态
# 确认调试接口状态后再决定是否禁用这个问题没有真正的解法,只能预防:JTAG 锁定写进 OTP 后不可逆,量产前先把调试工作做完。
问题 6:加密分区无法自动挂载
现象: 系统启动后加密分区未自动挂载,需要手动输入密码。
原因: /etc/crypttab 配置错误或密钥文件权限问题。
解决方案:
# 1. 检查 crypttab 配置
cat /etc/crypttab
# 确保格式正确:名称 设备 密钥文件 选项
# 2. 检查密钥文件权限
ls -la /root/.crypt_key
# 必须是 600 权限且属于 root
# 3. 修复权限
chmod 600 /root/.crypt_key
chown root:root /root/.crypt_key
# 4. 更新 initramfs
update-initramfs -u -k all
# 5. 手动测试解锁
cryptsetup luksOpen /dev/mmcblk0p7 encrypted_data --key-file /root/.crypt_key
mount /dev/mapper/encrypted_data /mnt/data7. 相关文档
| 文档名称 | 说明 |
|---|---|
| 《Rockchip_Developer_Guide_Linux_Security_CN》 | RK3588 安全启动与加密详细指南 |
| 《Rockchip_Developer_Guide_Linux_Software_CN》 | Linux SDK 开发指南,含安全相关章节 |
| 《OP-TEE_OS_Integration_Guide》 | OP-TEE OS 集成指南 |
| 《ARM_TrustZone_Technology_Overview》 | ARM TrustZone 架构概述 |
| 《C-3588LQ核心板硬件规格书》 | 核心板硬件规格,含安全模块说明 |
| 《SHIMETAPI-M5-R2A底板原理图》 | 底板原理图,含调试接口定义 |
