一、简介:安全启动为什么关乎“实时性”
实时系统(RT Linux)常用于工业控制、车载 ECU、医疗机器人。
若启动链被篡改(恶意内核、Rootkit),攻击者可在 RT 任务开始前注入代码,导致确定性调度失效,甚至人身安全事故。
传统“关防火墙”式防护无法抵御物理接触攻击;安全启动(Secure Boot)+ 固件加密升级是业界主流方案。
掌握本技能 = 让你的 RT 系统同时满足“硬实时”+“高安全”双重要求。
二、核心概念:5 个关键词一次看懂
| 关键词 | 一句话解释 | 本文出现形式 |
|---|---|---|
| UEFI Secure Boot | 固件验证 EFI 可执行文件(bootloader、内核)签名合法性 | 开启/关闭命令 |
| MOK (Machine Owner Key) | 用户导入的证书,用于签名内核,固件信任 | mokutil --import |
| shim | 微软签名的第一级引导,允许加载用户自定义 grub | shim-signed 包 |
| sbupdate | 自动化内核签名工具,支持 pacman/apt | 脚本调用 |
| AES-256-CBC | 对称加密算法,用于固件包加密传输 | OpenSSL 命令行 |
三、环境准备:10 分钟搭好实验台
硬件
x86_64 台式机/笔记本(支持 UEFI,可关闭 Secure Boot 做对比实验)
空 U 盘 ≥8 GB(做恢复盘)
软件
OS:Ubuntu 22.04 LTS(实时内核
linux-image-5.15.0-rt)包列表:
sudo apt update sudo apt install -y shim-signed grub-efi-amd64-signed mokutil sbsigntool openssl
检查当前启动模式
[ -d /sys/firmware/efi ] && echo "UEFI 模式" || echo "Legacy 模式"
四、实战 1:开启 UEFI Secure Boot
步骤 1:进入固件 Setup
重启按F2/Del→ 找到Secure Boot→ 设为Enabled
(不同主板菜单位置略有差异,可搜索“主板型号 + Secure Boot”)
步骤 2:验证系统是否启用
mokutil --sb-state
输出SecureBoot enabled表示成功。
注意:首次开启后,未签名的内核将无法启动,请先完成后续签名再 reboot。
五、实战 2:生成密钥对并签名内核
生成 2048 位 RSA 私钥 + 证书
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -out MOK.pem -nodes -days 3650 -subj "/CN=RT Linux Secure Boot/"导入证书到固件
sudo mokutil --import MOK.pem提示输入临时密码(如 12345678)→ 重启进入蓝色 MOK 管理界面 → 选择 “Enroll MOK” → 输入刚才的密码 → 完成导入。
签名内核与 grub
KVER=$(uname -r) sudo sbsign --key MOK.priv --cert MOK.pem \ /boot/vmlinuz-$KVER --output /boot/vmlinuz-${KVER}.signed sudo sbsign --key MOK.priv --cert MOK.pem \ /boot/efi/EFI/ubuntu/grubx64.efi --output /boot/efi/EFI/ubuntu/grubx64.efi.signed更新 grub 配置
sudo grub-mkconfig -o /boot/grub/grub.cfg sudo cp /boot/vmlinuz-${KVER}.signed /boot/vmlinuz-$KVER sudo cp /boot/efi/EFI/ubuntu/grubx64.efi.signed /boot/efi/EFI/ubuntu/grubx64.efi重启验证
reboot dmesg | grep -i secure出现
Secure boot enabled即成功。
六、实战 3:签名内核模块(RT 驱动案例)
场景:实时驱动rt_can.ko未被签名,加载失败ERROR: required key not available。
一次签名所有模块(懒人法)
sudo find /lib/modules/$(uname -r) -name \*.ko -exec \ /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 \ MOK.priv MOK.pem {} \;自动化工具(推荐)
Ubuntu 安装sudo apt install dkms→ 在/etc/dkms/sign_helper.sh调用sign-file,DKMS 每次编译 RT 驱动即自动签名。验证
sudo modprobe rt_can lsmod | grep rt_can无错误信息即加载成功。
七、实战 4:加密固件升级(OpenSSL + AES-256-CBC)
目标:通过 HTTP 下发固件,即使被截获也无法解密。
生成一次性随机密钥
openssl rand -hex 32 > fw.key openssl rand -hex 16 > fw.iv加密固件包
openssl enc -aes-256-cbc -in firmware.bin -out firmware.bin.enc \ -K $(cat fw.key) -iv $(cat fw.iv)用 MOK 公钥加密密钥(PKCS#7)
openssl smime -encrypt -aes-256-cbc -in fw.key -out fw.key.enc \ -outform DER MOK.pem升级脚本(设备端)
#!/bin/bash # decrypt_key.sh openssl smime -decrypt -in fw.key.enc -inkey MOK.priv -out fw.key openssl enc -d -aes-256-cbc -in firmware.bin.enc -out firmware.bin \ -K $(cat fw.key) -iv $(cat fw.iv) # 刷写固件(示例:MCU 通过 dfu-util) dfu-util -a 0 -D firmware.bin密钥只存内存,掉电即失,防止逆向。
八、常见问题与解答
| 问题 | 现象 | 解决 |
|---|---|---|
| mokutil 导入后无蓝色界面 | 主板 Fast Boot 开启 | 关闭 Fast Boot,保存重启 |
| 签名内核后无法启动 | 未签名 grub | 需同时签名 grubx64.efi |
| 模块加载仍提示 key rejected | 模块未重新签名 | 用sign-file再签,或检查 MOK 是否导入成功 |
| Secure Boot 开启后 QEMU 无法嵌套 | OVMF 未含证书 | 使用OVMF_CODE.secboot.fd+ 导入相同 MOK |
| 固件解密失败 | key/iv 大小写错误 | 确认openssl rand -hex输出 64/32 位 hex |
九、实践建议与最佳实践
双密钥策略:开发密钥(daily)+ 产品密钥(release),后者离线保存。
CI 集成:GitHub Action 调用
sbsign+openssl自动签名内核与固件。回滚机制:固件升级包携带版本号,失败自动退回上一版本,保证 RT 任务不中断。
测量启动(Measured Boot):结合 TPM 2.0 将哈希扩展到 PCR,远程证明系统完整性。
调试技巧:
临时关闭 Secure Boot 排错 → 对比签名前后日志差异。
dmesg -w实时查看内核验证失败提示。
十、总结与应用场景
安全启动确保 RT 系统从 BIOS→grub→kernel→驱动的完整信任链,防止恶意代码在实时任务启动前插入。
加密固件升级保障远程更新过程机密性+完整性,即使网络被监听也无法还原固件。
适用场景:
工业实时控制器(PLC、运动控制)
车载 ECU(ADAS、底盘控制)
医疗机器人(手术臂、影像实时处理)
把本文脚本纳入你的 Yocto/Buildroot CI 流水线,即可在下次量产烧录时默认开启 Secure Boot,让“硬实时”与“高安全”不再二选一。祝你玩得开心,启动安全到毫秒级!