https://github.com/jakeday/linux-surface/blob/master/SIGNING.mdมีคำแนะนำเฉพาะเพิ่มเติมเกี่ยวกับการลงชื่อเคอร์เนล (ดัดแปลงมาจากบทแนะนำเดียวกันที่เชื่อมโยงกับคำตอบที่ยอมรับ) คำแนะนำจะทำซ้ำทั้งหมดดังนี้:
การลงนามเคอร์เนลที่กำหนดเองสำหรับ Secure Boot
คำแนะนำสำหรับอูบุนตู แต่ควรทำงานคล้ายกับ distros อื่น ๆ หากใช้ shim และ grub เป็น bootloader หาก distro ของคุณไม่ได้ใช้ shim (เช่น Linux Foundation Preloader) ควรมีขั้นตอนที่คล้ายกันเพื่อให้การลงชื่อ (เช่น HashTool แทน MokUtil สำหรับ LF Preloader) หรือคุณสามารถติดตั้ง shim เพื่อใช้แทน แพคเกจ ubuntu สำหรับ shim นั้นถูกเรียกใช้shim-signed
แต่โปรดแจ้งให้คุณทราบถึงวิธีการติดตั้งอย่างถูกต้องดังนั้นคุณจะไม่ทำให้ bootloader เสีย
ตั้งแต่การอัปเดต GRUB2 ล่าสุด (2.02 + dfsg1-5ubuntu1) ใน Ubuntu, GRUB2 จะไม่โหลดเคอร์เนลที่ไม่ได้ลงชื่ออีกต่อไปตราบใดที่เปิดใช้งาน Secure Boot ผู้ใช้งาน Ubuntu 18.04 จะได้รับแจ้งระหว่างการอัพเกรดแพ็คเกจ grub-efi ซึ่งเคอร์เนลนี้ไม่ได้ลงนามและการอัพเกรดจะยกเลิก
ดังนั้นคุณมีสามตัวเลือกในการแก้ปัญหานี้:
- คุณลงนามเคอร์เนลด้วยตัวคุณเอง
- คุณใช้เคอร์เนลทั่วไปของ distro ของคุณ
- คุณปิดใช้งาน Secure Boot
เนื่องจากตัวเลือกที่สองและสามไม่สามารถใช้งานได้จริงเหล่านี้เป็นขั้นตอนในการเซ็นชื่อเคอร์เนลด้วยตัวคุณเอง
คำแนะนำในการดัดแปลงมาจากบล็อกอูบุนตู ก่อนที่จะติดตามโปรดสำรองข้อมูลไดเรกทอรี / boot / EFI ของคุณเพื่อให้คุณสามารถกู้คืนทุกสิ่งได้ ทำตามขั้นตอนเหล่านี้ด้วยความเสี่ยงของคุณเอง
- สร้างการกำหนดค่าเพื่อสร้างคีย์การลงนามบันทึกเป็น mokconfig.cnf:
# This definition stops the following lines failing if HOME isn't
# defined.
HOME = .
RANDFILE = $ENV::HOME/.rnd
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = v3
string_mask = utf8only
prompt = no
[ req_distinguished_name ]
countryName = <YOURcountrycode>
stateOrProvinceName = <YOURstate>
localityName = <YOURcity>
0.organizationName = <YOURorganization>
commonName = Secure Boot Signing Key
emailAddress = <YOURemail>
[ v3 ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage = codeSigning,1.3.6.1.4.1.311.10.3.6
nsComment = "OpenSSL Generated Certificate"
ปรับทุกส่วนตามรายละเอียดของคุณ
- สร้างพับลิกคีย์สาธารณะและไพรเวตสำหรับการลงชื่อเคอร์เนล:
openssl req -config ./mokconfig.cnf \
-new -x509 -newkey rsa:2048 \
-nodes -days 36500 -outform DER \
-keyout "MOK.priv" \
-out "MOK.der"
- แปลงคีย์เป็นรูปแบบ PEM (mokutil ต้องการ DER, sbsign ต้องการ PEM):
openssl x509 -in MOK.der -inform DER -outform PEM -out MOK.pem
- ลงทะเบียนกุญแจเพื่อติดตั้งชิมของคุณ:
sudo mokutil --import MOK.der
คุณจะถูกถามรหัสผ่านคุณจะใช้เพื่อยืนยันการเลือกกุญแจของคุณในขั้นตอนถัดไปดังนั้นเลือกใด ๆ
รีสตาร์ทระบบของคุณ คุณจะพบหน้าจอสีน้ำเงินของเครื่องมือชื่อ MOKManager เลือก "ลงทะเบียน MOK" แล้วเลือก "ดูปุ่ม" ตรวจสอบให้แน่ใจว่าเป็นกุญแจสำคัญที่คุณสร้างขึ้นในขั้นตอนที่ 2 หลังจากนั้นให้ทำตามขั้นตอนต่อไปและคุณจะต้องป้อนรหัสผ่านที่คุณระบุไว้ในขั้นตอนที่ 4 ทำการบูตระบบของคุณต่อไป
ตรวจสอบว่าคีย์ของคุณลงทะเบียนผ่าน:
sudo mokutil --list-enrolled
- เซ็นชื่อเคอร์เนลที่ติดตั้ง (ควรอยู่ที่ / boot / vmlinuz- [KERNEL-VERSION] -surface-linux-surface):
sudo sbsign --key MOK.priv --cert MOK.pem /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface --output /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface.signed
- คัดลอก initram ของเคอร์เนลที่ไม่ได้ลงชื่อดังนั้นเราจึงมี initram สำหรับเคอร์เนลที่ลงชื่อ
sudo cp /boot/initrd.img-[KERNEL-VERSION]-surface-linux-surface{,.signed}
- อัปเดต grub-config ของคุณ
sudo update-grub
- รีบูตระบบของคุณและเลือกเคอร์เนลที่ลงนามแล้ว หากการบูทใช้งานได้คุณสามารถลบเคอร์เนลที่ไม่ได้ลงชื่อ:
sudo mv /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface{.signed,}
sudo mv /boot/initrd.img-[KERNEL-VERSION]-surface-linux-surface{.signed,}
sudo update-grub
ตอนนี้ระบบของคุณควรทำงานภายใต้เคอร์เนลที่ลงนามแล้วและการอัพเกรด GRUB2 ทำงานอีกครั้ง หากคุณต้องการอัพเกรดเคอร์เนลแบบกำหนดเองคุณสามารถลงชื่อเวอร์ชันใหม่ได้อย่างง่ายดายโดยทำตามขั้นตอนข้างต้นอีกครั้งจากขั้นตอนที่เจ็ด ดังนั้นการสำรองคีย์ MOK (MOK.der, MOK.pem, MOK.priv)