在 Linux 下“驱动签名”通常指内核模块(.ko 文件)的签名,用于满足 Secure Boot / 模块签名校验 的要求。下面按常见场景系统说明。
CONFIG_MODULE_SIG=yCONFIG_MODULE_SIG_FORCE=y(强制校验).ko 模块将无法加载(insmod 失败)如果你自己编译内核,模块会在编译时自动签名:
make modules
make modules_install
签名使用的密钥由内核构建系统生成:
certs/signing_key.pemcerts/signing_key.x509)✅ 适合:自己编译内核 + 自己写驱动
scripts/sign-file 手动签名适用于:
/usr/src/linux-headers-$(uname -r)/scripts/sign-file \
sha256 \
private_key.pem \
public_key.x509 \
your_driver.ko
验证签名:
modinfo your_driver.ko
应看到:
sig_id: PKCS#7
signer: Your Name
openssl req -new -x509 -newkey rsa:2048 \
-keyout private_key.pem -out public_key.x509 \
-days 3650 -nodes -subj "/CN=My Kernel Signing Key"
sudo mokutil --import public_key.der
需要
.der格式:
openssl x509 -in public_key.x509 -out public_key.der -outform DER
重启 → 进入 MOK 管理界面 → 确认导入
需 sbverify / sbsign,修改 Shim / GRUB
以 NVIDIA / VirtualBox 为例:
sudo apt install linux-headers-$(uname -r)
sudo mokutil --import my_key.der
DKMS 可在 /etc/dkms/framework.conf 中配置:
SIGN_MODULES="yes"
SIGN_TOOL="/usr/src/linux-headers-$(uname -r)/scripts/sign-file"
modinfo your_driver.ko | grep sig
或:
hexdump -C your_driver.ko | tail
签名数据在模块尾部(PKCS#7)
module verification failedKey was rejected by serviceUnknown symbol| 场景 | 推荐方式 |
|---|---|
| 自编译内核 | 自动签名 |
| 发行版内核 + 第三方驱动 | sign-file |
| Secure Boot | MOK 导入公钥 |
| DKMS 驱动 | DKMS 自动签名 |
如果你愿意,可以告诉我:
我可以直接给你可复制的命令流程。