启用CONFIG_MODULE_SIG_FORCE是强制模块签名验证的前提,需先检查/boot/config-$(uname -r)中CONFIG_MODULE_SIG=y且CONFIG_MODULE_SIG_FORCE=y,再通过/proc/sys/module/verify_signature确认状态,最后通过GRUB参数module.sig_enforce=1永久生效。

确认当前内核是否已启用模块签名验证
执行 grep CONFIG_MODULE_SIG /boot/config-$(uname -r),若输出含 CONFIG_MODULE_SIG=y 且 CONFIG_MODULE_SIG_FORCE=y,说明内核编译时已支持强制签名;若仅显示 =m 或 =n,则需重新编译内核或更换启用了该选项的麒麟V10 SP1+ HWE内核版本。
这一步不能跳过——【未启用CONFIG_MODULE_SIG_FORCE的内核,无论后续如何配置都无法触发强制验签】。很多用户在/sys/kernel/security/kysec下反复修改策略却无效,根源就在这里。
启用内核级模块签名强制模式
第一步:检查当前模块加载策略状态:cat /proc/sys/module/verify_signature 2>/dev/null || echo "not supported"
返回值为 1 表示已强制验签,0 表示仅校验不拒绝,空输出表示内核未暴露该接口。
第二步:临时启用强制模式(重启失效):echo 1 | sudo tee /proc/sys/module/verify_signature
第三步:永久生效——向GRUB启动参数注入内核指令:
编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 行末尾追加 module.sig_unenforce=0 module.sig_enforce=1,然后执行 sudo update-grub && sudo reboot。
注意:module.sig_unenforce=0 是关键开关,设为 1 将直接关闭强制行为,与文档常见误写相反。
加载麒麟官方签名密钥到内核密钥环
方法一:使用系统预置密钥(推荐)sudo keyctl padd asymmetric "%:db" .builtin_trusted_keys <br>
该密钥由麒麟CA签发,用于验证所有官方内核模块签名,路径可能因V10/V11版本略有差异,可通过 <code>find /usr -name "*kernel*ca*.der" 2>/dev/null 确认。
方法二:手动导入自签名密钥(仅限测试环境)
先生成密钥对:openssl req -new -x509 -newkey rsa:4096 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=My Kernel Module Key/";
再加载:sudo keyctl padd asymmetric "%:db" .builtin_trusted_keys 。
必须确保密钥格式为DER而非PEM,否则 keyctl 加载后无法被内核识别——【PEM格式密钥会导致dmesg中持续报错"Invalid key signature"却无明确提示】。
验证签名验证机制是否真实生效
执行 sudo dmesg -t | grep -i "module verification",正常应看到类似 [123.456789] module: verification of 'mydriver.ko' failed: signature and/or required key missing 的拦截日志。
构造一个未签名模块快速验证:echo 'obj-m := dummy.o' > Makefile && echo 'int init_module(void) { return 0; } void cleanup_module(void) {}' > dummy.c && make -C /lib/modules/$(uname -r)/build M=$(pwd) modules;
然后尝试加载:sudo insmod dummy.ko —— 若返回 Operation not permitted 且 dmesg 出现验签失败记录,则机制已真实启用。
这一步操作起来很简单,但务必在重启后执行,否则可能仍在旧内核上下文中运行。

















