整篇文章经由对[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```
**载入模块没有问题,说明我的签名成功了**