嵌入式Linux
在一般得嵌入式Linux中,默认驱动签名是不打开的,所以驱动程序编写完成后,直接sudo insmod xxx.ko
就可以使用了。
但是在Ubuntu等成品系统中,因为安全和引导问题,大多是开启的,所以所有的驱动都要经过签名才能使用。
Ubuntu驱动签名历史
内核从3.7后开始支持模块签名,这个功能使能以后,内核只允许安装特定key签名的模块。
在安全启动模式下,是不能加载未签名或由未注册的密钥签名的内核模块的。
系统配置
内核在编译的时候,启动相关配置(.config),内核才会启动内核签名功能
# /boot/config-$(uname -r)
# 启用内核签名
CONFIG_MODULE_SIG=y
# 表示开启了签名机制,但是这时候模块签名或不签名都可以使用
CONFIG_MODULE_SIG_FORCE=y
# 模块必须有正确的签名才能正常使用
CONFIG_MODULE_SIG_ALL=y
如何查看驱动是否加入签名
查看驱动程序,最后面数据是否是MODULE_SIG_STRING("~Module signature appended~\n")
# 有驱动签名
root:~$ hexdump -C ./crc32c-intel.ko | tail
000055f0 c6 5b 16 42 16 79 2a f8 5e bb b1 50 cf 7f 2b 73 |.[.B.y*.^..P..+s|
00005600 b6 0d 26 0e 63 f9 2f 46 2a 11 b7 61 b4 8d 61 46 |..&.c./F*..a..aF|
00005610 13 16 5f 09 97 c9 a9 84 61 0a a4 bc 60 03 48 92 |.._.....a...`.H.|
00005620 c3 62 20 03 43 36 eb c6 44 3a d4 fd 1c 03 14 ff |.b .C6..D:......|
00005630 d5 c8 03 5a 07 5f 58 30 1e 7f d4 66 59 b4 14 c2 |...Z._X0...fY...|
00005640 98 b8 b2 6a 45 d6 13 54 cc 01 04 01 2b 14 00 00 |...jE..T....+...|
00005650 00 00 00 01 82 7e 4d 6f 64 75 6c 65 20 73 69 67 |.....~Module sig|
00005660 6e 61 74 75 72 65 20 61 70 70 65 6e 64 65 64 7e |nature appended~|
00005670 0a |.|
00005671
# 无驱动签名
root:~$ hexdump -C ./ahci.ko | tail
00017370 00 00 00 00 00 00 00 00 c1 00 00 00 01 00 00 00 |................|
00017380 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00017390 10 6a 01 00 00 00 00 00 14 00 00 00 00 00 00 00 |.j..............|
000173a0 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 |................|
000173b0 00 00 00 00 00 00 00 00 51 00 00 00 03 00 00 00 |........Q.......|
000173c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000173d0 24 6a 01 00 00 00 00 00 4d 01 00 00 00 00 00 00 |$j......M.......|
000173e0 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 |................|
签名Demo
假设驱动 hello.ko 已经写好,然后按照如下步骤进行签名:
- 生成密钥
需要生成私钥(sig.key)和公钥(sig.der), 证书名字为 hello driver sign
openssl req -new -x509 -newkey rsa:2048 -keyout sign.key -outform DER -out sign.der -nodes -days 36500 -subj "/CN=hello driver sign"
- 导入密钥到MOK证书列表
sudo mokutil --import ./sign.der
, 通过mokutil --list-enrolled
来查看证书是否导入成功 - 对驱动签名
/usr/src/linux-headers-xxxx/scripts/sign-file sha256 sign.key sign.der hello.ko
, 然后通过hexdump -C hello.ko | tail
查看是否有Module signature appended
。 - 安装和加载模块
sudo insmode hello.ko
,sudo modprobe -a hello.ko
,sudo lsmod | grep hello
参考链接:
- https://www.cnblogs.com/imagineAct/p/11296563.html
- https://askubuntu.com/questions/1023036/how-to-install-nvidia-driver-with-secure-boot-enabled/1049479#1049479
- https://sourceware.org/systemtap/wiki/SecureBoot
- https://www.jianshu.com/p/215eee5dbb05