避坑指南:在Ubuntu 24.04上为紫光FPGA PCIe驱动签名(解决Secure Boot报错)

张开发
2026/4/13 22:31:28 15 分钟阅读

分享文章

避坑指南:在Ubuntu 24.04上为紫光FPGA PCIe驱动签名(解决Secure Boot报错)
紫光FPGA PCIe驱动Secure Boot签名实战Ubuntu 24.04避坑全记录当你在Ubuntu 24.04上调试紫光FPGA的PCIe驱动时突然遭遇Secure Boot的拦截——那个刺眼的Required key not available错误提示是否让你瞬间血压升高这并非个例。随着Linux内核安全机制的持续强化特别是Ubuntu从22.04 LTS开始对Secure Boot的严格执行驱动签名已成为FPGA开发者必须掌握的生存技能。本文将带你深入问题本质从密钥生成到自动化脚本部署构建一套完整的解决方案。1. Secure Boot拦截驱动的本质解析现代Ubuntu系统默认启用的Secure Boot机制本质上是通过密码学手段验证内核模块的合法性。其工作原理可概括为启动链验证从UEFI固件到GRUB引导程序再到Linux内核每个环节都需经过数字签名验证内核模块强制检查加载任何内核模块.ko文件时系统会校验其签名是否存在于以下白名单发行版内置签名如Canonical官方签名用户注册的MOKMachine Owner Key列表紫光FPGA驱动的困境由于厂商提供的驱动未经过公开签名导致直接被Secure Boot拦截典型错误场景重现$ sudo insmod pango_pci_driver.ko insmod: ERROR: could not insert module pango_pci_driver.ko: Required key not available通过内核日志可获取更详细的信息$ dmesg | tail -n 10 [ 3245.678901] module: x86/modules: Loading of unsigned module is rejected [ 3245.678902] module: pango_pci_driver: module verification failed: signature and/or required key missing2. 完整签名解决方案实施步骤2.1 准备工作与环境配置首先确保系统已安装必要的工具链sudo apt update sudo apt install -y \ mokutil \ openssl \ sbsigntool \ linux-headers-$(uname -r)创建专用工作目录建议在用户主目录下mkdir -p ~/driver_signing cd ~/driver_signing2.2 密钥对生成与管理系统生成符合Secure Boot要求的密钥对有效期10年openssl req -new -x509 \ -newkey rsa:4096 \ # 推荐使用4096位密钥提高安全性 -keyout MOK.priv \ -outform DER -out MOK.der \ -nodes \ -days 3650 \ -subj /CNPango_FPGA_Driver_Signing_Key/密钥文件说明MOK.priv私钥文件必须严格保密权限设置为600MOK.der公钥文件将注册到系统MOK列表设置文件权限chmod 600 MOK.priv chmod 644 MOK.der2.3 MOK密钥注册流程将公钥导入系统MOK数据库sudo mokutil --import MOK.der此时会提示设置临时密码注意这个密码仅用于后续的MOK管理界面与用户密码无关。建议使用简单易记的临时密码如TempPass123因为后续步骤需要输入。关键操作提示必须立即重启系统以完成注册流程延迟重启可能导致注册失败重启后系统会自动进入蓝色MOK管理界面通常在GRUB之后按以下步骤操作选择Enroll MOK → Continue选择Yes确认导入密钥输入之前设置的临时密码选择OK完成注册并继续启动验证密钥是否成功注册$ sudo mokutil --list-enrolled | grep Pango SHA1 Fingerprint: 12:34:56:78:90:AB:CD:EF:12:34:56:78:90:AB:CD:EF:12:34:56:78 CNPango_FPGA_Driver_Signing_Key2.4 驱动签名实战操作定位需要签名的驱动文件假设路径为~/pango_driver/pango_pci_driver.kosudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file \ sha256 \ ~/driver_signing/MOK.priv \ ~/driver_signing/MOK.der \ ~/pango_driver/pango_pci_driver.ko验证签名是否成功$ modinfo ~/pango_driver/pango_pci_driver.ko | grep sig sig_id: PKCS#7 signer: Pango_FPGA_Driver_Signing_Key sig_hashalgo:sha256加载已签名的驱动sudo insmod ~/pango_driver/pango_pci_driver.ko检查驱动加载状态$ lsmod | grep pango pango_pci_driver 32768 03. 自动化部署与进阶技巧3.1 开机自动签名脚本创建服务脚本/usr/local/bin/sign_pango_driver.sh#!/bin/bash DRIVER_PATH/home/$USER/pango_driver/pango_pci_driver.ko PRIV_KEY/home/$USER/driver_signing/MOK.priv PUB_KEY/home/$USER/driver_signing/MOK.der /usr/src/linux-headers-$(uname -r)/scripts/sign-file \ sha256 $PRIV_KEY $PUB_KEY $DRIVER_PATH exit 0设置可执行权限sudo chmod x /usr/local/bin/sign_pango_driver.sh创建systemd服务单元/etc/systemd/system/pango-driver-sign.service[Unit] DescriptionSign Pango FPGA PCIe Driver Afternetwork.target [Service] Typeoneshot ExecStart/usr/local/bin/sign_pango_driver.sh Userroot [Install] WantedBymulti-user.target启用并启动服务sudo systemctl daemon-reload sudo systemctl enable --now pango-driver-sign.service3.2 多驱动批量签名方案当需要管理多个驱动模块时建议使用以下批量签名脚本batch_sign_drivers.sh#!/bin/bash SIGN_TOOL/usr/src/linux-headers-$(uname -r)/scripts/sign-file KEY_DIR$HOME/driver_signing DRIVER_DIR$HOME/pango_drivers find $DRIVER_DIR -name *.ko -print0 | while IFS read -r -d $\0 driver; do echo Signing $(basename $driver)... sudo $SIGN_TOOL sha256 \ $KEY_DIR/MOK.priv \ $KEY_DIR/MOK.der \ $driver done3.3 内核更新时的应对策略Ubuntu自动更新内核时已签名的驱动可能需要重新编译。建议创建hook脚本/etc/kernel/postinst.d/pango-driver#!/bin/bash KERNEL_VERSION$1 DRIVER_SRC/path/to/driver/source # 重新编译驱动 make -C $DRIVER_SRC KERNELDIR/lib/modules/$KERNEL_VERSION/build # 重新签名 /usr/src/linux-headers-$KERNEL_VERSION/scripts/sign-file \ sha256 \ ~/driver_signing/MOK.priv \ ~/driver_signing/MOK.der \ $DRIVER_SRC/pango_pci_driver.ko设置可执行权限sudo chmod x /etc/kernel/postinst.d/pango-driver4. 故障排查与常见问题4.1 典型错误与解决方案问题1MOK注册后仍然提示签名无效$ sudo insmod pango_pci_driver.ko insmod: ERROR: could not insert module: Operation not permitted解决步骤检查Secure Boot状态$ mokutil --sb-state SecureBoot enabled确认密钥已正确注册$ sudo mokutil --list-enrolled | grep Pango验证驱动签名使用的密钥与注册密钥一致$ modinfo pango_pci_driver.ko | grep signer问题2系统更新后签名失效解决方案重新安装内核头文件sudo apt install --reinstall linux-headers-$(uname -r)重新执行签名流程4.2 调试工具与技巧内核模块加载调试# 详细加载日志 sudo dmesg -C sudo insmod pango_pci_driver.ko dmesg签名验证工具# 检查ELF文件签名 pesign -S -i pango_pci_driver.ko # 验证签名证书 openssl x509 -inform DER -in MOK.der -noout -text4.3 安全注意事项私钥保护永远不要将MOK.priv上传到版本控制系统建议加密存储私钥gpg --symmetric --cipher-algo AES256 MOK.priv密钥轮换每年更新一次签名密钥旧密钥需通过mokutil手动删除sudo mokutil --delete MOK.der审计日志记录所有签名操作echo $(date): Signed $(basename $DRIVER) /var/log/driver_signing.log

更多文章