美文网首页
给Linux模块签名

给Linux模块签名

作者: 锱三石五 | 来源:发表于2017-04-23 13:32 被阅读0次

整篇文章经由对[Signing Kernel Moudles For Security Boot][1]实践整理而成。如果能看懂原版的话,建议看该网页
[1]: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-signing-kernel-modules-for-secure-boot.html "RedHat的建议"

在我们安装一个自己编译的模块包后,需要modprobe xx 然而,可能出现required key not available这样的提示。

这是由于采用EFI的Linux系统限制只有通过签名的模块才能加载运行。如果你是安装自己编译的模块,就需要自己签名了。

1.需要安装依赖的工具:

sudo yum install openssl
sudo yum install kernel-devel
sudo yum install perl
sudo yum install mokutil
sudo yum install keyutils

2.对于System Key Rings的解释:

咱们的X.509 Keys放在哪儿呢?请看下表

Source of X.509 Keys User Ability to Add Keys Keys Loaded During Boot
UEFI Secure Boot "db" Limited .system_keyring
UEFI Secure Boot "dbx" Limited .system_keyring
Machine Owner Key (MOK) list Yes .system_keyring

密钥要经过系统验证,也就是说咱们的一对密钥中的公钥要加载进MOK中

3.检查自己是否是EFI

sudo keyctl list %:.system_keyring

你看到的就是MOK list
如果是EFI,你可以看到包含 EFI 字样的keyring。咱们在安装过程中,也要把自己的keyring也加到里面去。

4.生成自己的密钥对

生成密钥配置文件

sudo cat << EOF > configuration_file.config
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
O = <你的签名key的名字>
emailAddress = <你的E-mail>

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid
EOF

你的名字和E-mail地址这些东西是为了标识你的签名密钥,毕竟是自己做的作品嘛。你还可以在* [req_distinguished_name] *部分添加更多信息,也可以删减。

生成密钥

sudo openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 \
-batch -config configuration_file.config -outform DER \
-out public_key.der \  
-keyout private_key.priv

5.登记你的公钥

公钥要登记在MOK list里

Centos7、RedHat EL7系系统,可以使用mokutil

sudo mokutil --import my_signing_key_pub.der

这时系统会要你为MOK登记设置一个密码
设置完密码后,重启:

sudo reboot```
重启过程中会进入EFI的确认界面,输入刚刚设置的密码,一直确认就行
重启后,输入
```c
sudo keyctl list %:.system_keyring

你会发现MOK list比以前多了一项,也就是你的签名

6.给你的模块签名

这里我结合我自己给wl模块签名的实例
这里 我的wl模块 来源于我安装了一个叫wl-kmod的包,这是无线网卡驱动,为了找到模块位置,我先输入:

rpm -ql kmod-wl

找到了wl.ko的位置在/lib/modules/3.10.0-514.10.2.el7.x86_64/extra/wl/wl.ko
如果能给安装包直接签名貌似更好,但是我是已经安装完才进行补救的
那么就是给wl.ko签名啦:

sudo perl /usr/src/kernels/$(uname -r)/scripts/sign-file \
sha256 \
/home/feyan/feyan_signing_key_pub.der\     #公钥文件(位置和名称视具体情况)
/home/fayan/feyan_signing_key.priv\        #私钥文件(位置和名称视具体情况)
/lib/modules/3.10.0-514.10.2.el7.x86_64/extra/wl/wl.ko   #模块文件

签名成功后,输入

sudo modprobe wl```
**载入模块没有问题,说明我的签名成功了**

相关文章

网友评论

      本文标题:给Linux模块签名

      本文链接:https://www.haomeiwen.com/subject/enzezttx.html