安全启动与加密
目标平台: RK3576 | NPU 算力: 6 TOPS | 文档版本: V1.0
适用板型: C-3576BQ 核心板 + M4-R2 底板
最后更新: 2026-10-23
1. 概述
1.1 功能简介
RK3576 安全启动与加密功能为嵌入式 Linux 系统提供完整的安全防护体系。该体系包含三大核心机制:
- 安全启动(Secure Boot):通过 Boot ROM 验证签名链,确保从硬件到操作系统的每一级引导镜像均经过授权签名,防止未授权固件被篡改或刷入。
- 硬件加密引擎:集成加密协处理器支持能力,支持 AES-128/192/256、SHA-256/MD5、RSA-2048/4096 等算法(具体支持情况与实际功能以实际发布的 RK3576 SDK 为准),用于磁盘加密、镜像签名验证和安全通信。
- ARM TrustZone:通过 ARM TrustZone 架构实现 EL3/EL1 安全隔离,支持安全世界(Secure World)与普通世界(Normal World)的硬件级隔离。
此外,RK3576 还提供 OTP(One-Time Programmable)一次性可编程存储 用于安全密钥存储,以及 TRNG(True Random Number Generator)真随机数生成器(具体外设能力以实际 SDK 为准)用于密码学安全随机数生成。
1.2 应用场景
- 工业控制设备:防止未授权固件刷入,保护产线安全和知识产权
- 智能家居网关:保障设备身份认证和数据传输安全
- 车载信息娱乐系统:满足汽车功能安全对安全启动的要求
- 金融支付终端:保护交易密钥和用户敏感数据
- 物联网边缘设备:远程 OTA 升级时验证固件完整性
- 国防与安全通信:满足等保/密评等安全合规要求
1.3 工作原理
RK3576 安全启动采用逐级验证签名链机制,从 Boot ROM 硬件信任根开始,依次验证 Bootloader、内核和根文件系统的完整性:
┌─────────────────────────────────────────────────────────┐
│ 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.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3576BQ 核心板 + ShimetaPi M4-R2 底板 | 1 | 已烧录 Linux 系统 |
| 调试串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| 电源 | 5V/2A(Type-C 或 6pin) | 1 | 空载最小 1000mA |
| USB 烧录线 | USB-A to USB-C | 1 | 用于 OTG 烧录(底板接口位置以原理图 S-04 为准) |
| eMMC 模块 | 32GB(板载,标配) | 1 | 支持 eMMC 加密功能 |
C-3576BQ 核心板内置 RK3576 SoC,集成硬件加密引擎和 TrustZone 支持(具体安全特性以核心板规格书 S-02 和实际 SDK 为准)。 ShimetaPi M4-R2 底板提供调试接口和电源管理。
2.2 硬件确认
上电后通过串口终端确认 RK3576 安全相关硬件信息:
# 通过串口登录后,检查加密硬件是否存在
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 安全工具安装
# 安装加密相关工具链
sudo apt update
sudo apt install -y \
openssl \
cryptsetup \
libssl-dev \
libcrypto++-dev \
pinentry-curses \
gnupg2
# 安装 Rockchip 安全工具(签名工具)
# 位于实际发布 SDK 的 tools 目录
cd <以实际发布的 RK3576 SDK 为准>
cd tools/linux/Linux_Sign_Tool/
sudo dpkg -i linux_Sign_Tool.deb
# 验证签名工具安装
secure_tool --version3.2 内核配置
RK3576 Linux 6.1 内核需要启用以下安全相关配置(配置项名称以实际发布的 RK3576 SDK 内核为准):
# 进入内核源码目录
cd <以实际发布的 RK3576 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 支持(可选,以实际 SDK 为准)
CONFIG_TPM=y
CONFIG_TPM2_TIS_CORE=y
# Secure JTAG 控制
CONFIG_ROCKCHIP_SECURE=y将上述配置写入 defconfig 后重新编译内核:
# 应用配置并编译
make ARCH=arm64 rockchip_linux_defconfig
make ARCH=arm64 -j$(nproc)4. 操作步骤
4.1 密钥生成
RK3576 安全启动需要生成多级密钥对。密钥层级如下:
Root Key (根密钥)
└── SPL 签名密钥
└── U-Boot 签名密钥
└── Kernel 签名密钥生成根密钥对:
# 创建密钥工作目录
mkdir -p ~/rk3576_secure_keys && cd ~/rk3576_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"生成 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=RK3576 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=RK3576 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=RK3576 Kernel Signing Key/O=ShimetaPi"4.2 签名镜像
RK3576 使用 Rockchip 官方签名工具对各级镜像进行签名(工具具体用法与参数以实际发布的 RK3576 SDK 为准):
# 切换到签名工具目录
cd <以实际发布的 RK3576 SDK 为准>/tools/linux/Linux_Sign_Tool
# 签名 SPL 镜像(TPL/SPL)
./secure_tool \
--bit0 \
--bburn \
--chip rk3576 \
--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 rk3576 \
--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 rk3576 \
--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 烧录安全镜像
# 使用 upgrade_tool 烧录安全镜像到 eMMC(分区偏移以实际 SDK 分区表为准)
# 注意:安全镜像必须使用签名版本
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 卡(起始偏移以实际 SDK 分区表为准)
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
sync4.4 TrustZone 配置
RK3576 的 TrustZone 功能通过 OP-TEE OS 实现,需要在 U-Boot 及设备树中配置(节点名与 compatible 以实际 SDK 为准):
# 在 U-Boot 设备树中启用 TrustZone
# 文件:arch/arm64/dts/rk3576-xxx.dts(以实际 SDK 为准)
# 添加 OP-TEE 节点(通用示例,以实际 SDK 为准)
optee: optee {
compatible = "rockchip,rk3576-optee";
method = "smc";
status = "okay";
};
# 在 U-Boot 环境变量中配置安全启动参数
setenv secure_boot 1
setenv verify 1
saveenvOP-TEE 测试程序:
# 编译 OP-TEE 测试(路径以实际 SDK 为准)
cd <以实际发布的 RK3576 SDK 为准>/optee
make -C optee_examples TEEC_EXPORT=/path/to/out TEEC_HOST_CROSS_COMPILE=aarch64-linux-gnu-
# 运行加密测试
/optee_test/xtest/crypto4.5 磁盘加密
RK3576 支持 eMMC 全盘加密和分区加密两种方式。
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检查 RK3576 硬件加速情况:
# 检查硬件加速是否生效(实际加密吞吐量以板端实测为准)
cryptsetup benchmark
# 查看加密设备
dmsetup status encrypted_data5. 代码详解
5.1 安全启动流程
RK3576 Boot ROM 安全启动验证流程如下(伪代码表示,实际细节以 Rockchip 安全文档为准):
/* RK3576 Boot ROM 安全启动验证流程(简化表示) */
int rk3576_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) {
/* 根公钥哈希不匹配,启动失败 */
rk3576_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) {
rk3576_boot_fail("SPL signature verification failed");
return -1;
}
/* Step 5: SPL 加载并验证 U-Boot */
/* ... 类似流程 ... */
return 0; /* 安全启动验证通过 */
}5.2 加密 API
RK3576 Linux 6.1 内核提供以下加密 API 接口(OpenSSL 通用接口):
/* 用户态加密 API 示例 (libcrypto) */
#include <openssl/evp.h>
#include <openssl/aes.h>
#include <openssl/rand.h>
#include <openssl/err.h>
/* AES-256-XTS 加密(与 dm-crypt 兼容的加密方式) */
int rk3576_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 rk3576_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(One-Time Programmable)存储用于烧录安全密钥,是安全启动的信任根(地址分布与工具用法以实际 RK3576 SDK 为准):
# 读取 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 关键区域地址(通用示例,具体分布以实际 RK3576 SDK 为准):
# 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 0x01OTP 编程注意事项:
# 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
# 确认是 RK3576 芯片 IDSecure JTAG 禁用(生产环境):
# 禁用 JTAG 调试接口(生产安全需求)
# 注意:禁用后无法通过 JTAG 调试,需谨慎操作
otp_tool writeotp -f /dev/otp0 -a 0x14 -d 0x03 # 禁用 JTAG(地址以实际 SDK 为准)
# 验证 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 rk3576 --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 解密性能差
现象: 加密分区读写速度明显下降。
原因: 未启用 RK3576 硬件加密加速(或当前内核未启用对应 ARM64 CE 模块)。
解决方案:
# 1. 确认硬件加速模块已加载
lsmod | grep cryptodev
modprobe cryptodev
# 2. 验证硬件加速是否生效(实际吞吐量以板端实测为准)
cryptsetup benchmark
# 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 镜像是否存在(分区号以实际分区表为准)
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/rk3576.dtb -o rk3576.dts
grep -A 5 "optee" rk3576.dts
# 3. 重新烧录 OP-TEE 镜像(偏移以实际 SDK 为准)
upgrade_tool wl 0x4000 /path/to/tee.bin
# 4. 修复设备树后重新编译
make ARCH=arm64 rk3576-xxx.dtb
cp arch/arm64/boot/dts/rockchip/rk3576-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 前,先读取当前状态确认
otp_tool readotp -f /dev/otp0 -a 0x14 -l 4 # 读取当前状态
# 确认调试接口状态后再决定是否禁用问题 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. 相关文档
| 文档名称 | 路径 | 说明 |
|---|---|---|
| OTA 远程升级 | OTA远程升级 | 固件签名与安全升级 |
| RTOS 与 Linux 协同 | RTOS与Linux协同 | TrustZone/AMP 安全隔离 |
| 内核配置与裁剪 | 内核配置与裁剪 | 内核安全相关配置 |
| 系统启动与基础操作 | 系统启动与基础操作 | 串口登录与基础操作 |
| 调试工具使用指南 | 调试工具使用指南 | JTAG 与调试接口使用 |
| SDK 编译 | Linux SDK编译 | SDK 获取与镜像编译 |
软件文档《Rockchip_Developer_Guide_Linux_Security_CN》(RK3576 安全启动与加密详细指南)与《OP-TEE_OS_Integration_Guide》以实际发布的 RK3576 SDK 文档为准。
