温馨提示×

linux drivers怎么签名

小樊
38
2026-09-27 19:03:24
栏目: 智能运维

在 Linux 下“给驱动签名”通常有两种语境,取决于你指的是 内核模块(.ko)签名 还是 UEFI / 安全启动相关的驱动/二进制签名。下面分别说明。


一、Linux 内核模块(Kernel Module, .ko)签名

1. 为什么需要签名

  • 启用 Secure Boot 时,未签名或被禁止的内核模块无法加载
  • 内核开启 CONFIG_MODULE_SIG_FORCE 后,只允许加载已签名模块

2. 使用内核自带签名工具(推荐)

内核源码中提供:

scripts/sign-file

基本用法

./scripts/sign-file sha256 private_key.pem public_key.x509 module.ko

示例:

./scripts/sign-file sha256 signing_key.pem signing_cert.crt mydriver.ko

签名后:

modinfo mydriver.ko

可以看到 signature 字段。


3. 生成签名密钥(自签名)

openssl req -new -x509 -newkey rsa:2048 \
    -keyout private_key.pem -out public_key.pem \
    -days 3650 -nodes

然后在编译内核时:

  • 将公钥加入内核(CONFIG_MODULE_SIG_KEY)
  • 或用于 MOK(Machine Owner Key)(见下)

4. Secure Boot 场景(最重要)

情况 A:使用发行版签名(如 Ubuntu / Fedora)

  • 使用 kmodsign
sudo kmodsign sha512 private.key public.crt mydriver.ko

情况 B:自签名 + 注册 MOK

  1. 生成密钥
  2. 签名模块
  3. 注册公钥到 UEFI(MOK)
sudo mokutil --import public_key.der
  1. 重启并完成 MOK 注册

二、UEFI / 安全启动层面的“驱动签名”

如果你指的是 EFI 驱动(.efi) 或 bootloader:

1. 使用 sbsign 签名

sbsign --key key.pem --cert cert.pem \
    --output signed.efi input.efi

2. 使用 shim + MOK(常见方案)

  • shim 由 Microsoft 签名
  • 你用自己的 MOK 签名内核 / 驱动

三、常见问题

Q:签名后还是加载不了?

  • 确认 Secure Boot 状态:
mokutil --sb-state
  • 确认内核配置:
CONFIG_MODULE_SIG=y
CONFIG_MODULE_SIG_FORCE=y

Q:能不能绕过签名?

  • 关闭 Secure Boot(不推荐生产环境)
  • 或使用已签名内核 + DKMS(部分发行版支持)

四、总结

场景 工具
内核模块签名 sign-file / kmodsign
UEFI 驱动签名 sbsign
Secure Boot MOK + 自签名
发行版支持 DKMS / 官方签名

如果你能说明:

  • 是 内核模块 还是 EFI 驱动
  • 是否启用 Secure Boot
  • 使用的 发行版 / 内核版本

我可以给你更精确的步骤。

0 踩