温馨提示×

linux驱动如何签名

小樊
76
2026-09-09 15:00:59
栏目: 智能运维

在 Linux 下“驱动签名”通常指内核模块(.ko 文件)的签名,用于满足 Secure Boot / 模块签名校验 的要求。下面按常见场景系统说明。


一、为什么要签名 Linux 驱动

  • 内核启用了:
    • CONFIG_MODULE_SIG=y
    • CONFIG_MODULE_SIG_FORCE=y(强制校验)
  • 系统开启了 UEFI Secure Boot
  • 未签名或被篡改的 .ko 模块将无法加载(insmod 失败)

二、内核自带的模块签名机制(最常见)

1. 内核构建时自动签名

如果你自己编译内核,模块会在编译时自动签名:

make modules
make modules_install

签名使用的密钥由内核构建系统生成:

  • 私钥:certs/signing_key.pem
  • 公钥:内置进内核(certs/signing_key.x509)

✅ 适合:自己编译内核 + 自己写驱动


2. 使用 scripts/sign-file 手动签名

适用于:

  • 使用发行版内核
  • 已加载第三方驱动(如 NVIDIA、虚拟化驱动)

示例(内核源码提供工具)

/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

三、生成签名密钥(自建 CA)

1. 生成私钥和证书

openssl req -new -x509 -newkey rsa:2048 \
  -keyout private_key.pem -out public_key.x509 \
  -days 3650 -nodes -subj "/CN=My Kernel Signing Key"

2. 将公钥导入系统(Secure Boot 必需)

方式一:MOK(推荐,Ubuntu / Fedora)

sudo mokutil --import public_key.der

需要 .der 格式:

openssl x509 -in public_key.x509 -out public_key.der -outform DER

重启 → 进入 MOK 管理界面 → 确认导入

方式二:直接签内核(不推荐,复杂)

需 sbverify / sbsign,修改 Shim / GRUB


四、DKMS 驱动自动签名(实战常见)

以 NVIDIA / VirtualBox 为例:

Ubuntu 自动签名 DKMS 模块

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 failed

  • 模块未签名
  • 公钥未导入 MOK

❌ Key was rejected by service

  • Secure Boot 未信任该密钥
  • 使用了错误证书

❌ Unknown symbol

  • 与当前内核版本不匹配(不是签名问题)

七、总结

场景 推荐方式
自编译内核 自动签名
发行版内核 + 第三方驱动 sign-file
Secure Boot MOK 导入公钥
DKMS 驱动 DKMS 自动签名

如果你愿意,可以告诉我:

  • 用的是 Ubuntu / CentOS / 麒麟 / 产线系统?
  • 是否开启 Secure Boot?
  • 是 自己写的内核模块 还是 NVIDIA / 网卡 / 自定义驱动?

我可以直接给你可复制的命令流程。

0 踩