温馨提示×

linux drivers如何签名

小樊
32
2026-10-03 15:42:53
栏目: 智能运维

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


一、为什么需要签名

启用以下任一机制时,未签名或被篡改的驱动无法加载:

  • UEFI Secure Boot
  • 内核开启 CONFIG_MODULE_SIG
  • 发行版策略(如 RHEL、Ubuntu、SUSE)

常见报错:

module verification failed: signature and/or required key missing

二、两种方式总览

方式 适用场景
内核自带签名(推荐) 自己编译内核或使用发行版工具
第三方 / MOK 签名 NVIDIA、VMware、自定义闭源驱动

三、方式一:使用内核自带签名(最标准)

1. 准备密钥

openssl req -new -x509 \
  -newkey rsa:2048 \
  -keyout signing_key.priv \
  -out signing_key.x509 \
  -nodes -days 36500 \
  -subj "/CN=My Kernel Module Signing Key/"

2. 使用 scripts/sign-file

内核源码中自带:

./scripts/sign-file sha256 \
  signing_key.priv \
  signing_key.x509 \
  mydriver.ko

验证:

modinfo mydriver.ko | grep signer

四、方式二:使用 MOK(Machine Owner Key)签名(Secure Boot)

适用于 已启用 Secure Boot 的发行版。

1. 生成 MOK 密钥

openssl req -new -x509 \
  -newkey rsa:2048 \
  -keyout MOK.priv \
  -out MOK.der \
  -nodes -days 36500 \
  -subj "/CN=My MOK Key/"

2. 注册公钥到系统

sudo mokutil --import MOK.der

重启 → 进入 MOK Management → Enroll MOK

3. 签名驱动

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file \
  sha256 MOK.priv MOK.der mydriver.ko

五、DKMS + 自动签名(推荐长期方案)

以 Ubuntu 为例:

sudo apt install dkms

在 DKMS 配置中启用签名(示例):

/sbin/sign-file sha256 /path/MOK.priv /path/MOK.der $module.ko

很多驱动(如 NVIDIA)支持:

sudo apt install nvidia-dkms-*

六、常见发行版说明

Ubuntu

  • 默认 Secure Boot 开启
  • 使用 mokutil
  • NVIDIA 官方 .run 需手动签名

RHEL / CentOS

  • 使用 kmodsign
sudo yum install kmod
sudo /usr/src/kernels/$(uname -r)/scripts/sign-file ...

SUSE

  • 使用 sign-file + mokutil

七、注意点

  • ❌ 不能对 已加载模块 签名
  • ✅ 签名必须在加载前完成
  • 内核版本、签名算法必须匹配
  • Secure Boot 下 内核也要签名

八、最小可用示例(快速验证)

# 生成密钥
openssl req -new -x509 -newkey rsa:2048 \
  -keyout key.priv -out key.der -nodes \
  -subj "/CN=test/"

# 签名
./scripts/sign-file sha256 key.priv key.der test.ko

# 加载
sudo insmod test.ko

如果你能告诉我:

  • 发行版(Ubuntu / RHEL / Arch)
  • 是否启用 Secure Boot
  • 是源码驱动还是闭源 .run

我可以给你 精确的一步一步命令。

0 踩