insmod or modprobe 出現 Required key not available 錯誤

之前沒遇過下面的問題

# modprobe lustre
modprobe: ERROR: could not insert 'lustre': Required key not available

一直以為是哪裡有安裝錯誤,後來才發現因為系統 UEFI Secure Boot enabled 然後 kernel 也啟動了 module.sig_enforce=1 設定,所以會出現無法安裝第三方的 kernel module

解決方式 1 : 停止使用 secure boot

這其實不是很安全 但是但是比較容易 XD 先安裝 mokutil

# dnf install mokutil

設定停用驗證

# mokutil --disable-validation

會要求你輸入  8-16 字的密碼,最好抄下來 以免等一下忘了

之後重新開機

# reboot

進入 Change Secure Boot state 設定

然後輸入剛剛輸入的密碼第 n 個字,只要一個字就好

反覆輸入後就可以關閉 Secure Boot

某天你想要啟動就用下面的指令

# mokutil --enable-validation

解決方式 2 : 手動為 kernel module 簽名

這個步驟我測試失敗,不過我還是先做一下筆記

先安裝好要用的工具

# dnf install mokutil openssl -y

產生設定檔案 把 req_distinguished_name 改成你要的字串及相對應的 O, CN email

# 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 = Organization
CN = Organization signing key
emailAddress = E-mail address

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

然後產生 keys

# openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config configuration_file.config -outform DER -out my_signing_key_pub.der -keyout my_signing_key.priv

匯入 key

# mokutil --import my_signing_key_pub.der

然後重新開機

# reboot

選 “Enroll MOK”

選 “Continue”

選 “Yes”

敲密碼然後重新開機

準備簽署 kernel 檔案,假設遇到有壓縮的檔案解開

# xz --decompress $(modinfo -n lustre)

然後再簽署 kernel module

# /usr/src/kernels/$(uname -r)/scripts/sign-file sha256 my_signing_key.priv my_signing_key_pub.der /lib/modules/$(uname -r)/extra/lustre.ko

部署

# depmod -a

檢查簽署狀態

# modinfo lustre
(omit)
signer: LIHO Kernel signing key
sig_key: 6B:CA:D7:CE:B1:D1:04:9E:59:50:12:A9:D3:42:C1:4F:A7:11:83:A3
sig_hashalgo: sha256
signature: 77:75:39:B4:09:46:DD:11:99:53:CB:CD:58:7A:DF:74:C9:7B:31:A8:
37:7C:EC:E2:EA:36:23:88:17:F5:17:5F:B5:E3:D6:52:68:14:1F:7E:

如果想要把 kernel 壓縮回去,記得再部署

# xz --compress $(modinfo -n lustre)
# depmod -a

我部署完還是有錯誤

# modprobe lustre
modprobe: ERROR: could not insert 'lustre': Required key not available

補充說明:dkms 有工具可以簽署 但是名稱要改成 dkms.key dkms.der XD

# cat /etc/dkms/sign_helper.sh
#!/bin/sh
/lib/modules/"$1"/build/scripts/sign-file sha512 /root/dkms.key /root/dkms.der "$2"

參考:https://access.redhat.com/documentation/zh-tw/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/signing-kernel-modules-for-secure-boot_managing-monitoring-and-updating-the-kernel