เหตุใดฉันจึงได้รับ“ คีย์ที่ต้องการไม่สามารถใช้งานได้” เมื่อติดตั้งโมดูลเคอร์เนลของบุคคลที่สามหรือหลังการอัพเกรดเคอร์เนล


79

ปัญหานี้เกิดขึ้นเฉพาะในระบบ UEFI ที่เปิดใช้งาน Secure Boot

เมื่อฉันพยายามติดตั้งโมดูล DKMS เช่นไดรเวอร์ VirtualBox, Nvidia หรือ Broadcom พวกเขาจะไม่ติดตั้งและฉันจะได้รับRequired key not availableเมื่อฉันลองmodprobeพวกเขา

VirtualBox บ่นvboxdrvว่าไม่ได้โหลด

wlไดรเวอร์Broadcom แสดงlspci -kเป็นโมดูลเคอร์เนล แต่ไม่ได้ใช้งาน พ่นsudo modprobe wlRequired key not available

ปัญหานี้อาจเกิดขึ้นเมื่อฉันติดตั้งโมดูลเคอร์เนลบางส่วนจากแหล่ง git

ปัญหานี้อาจปรากฏขึ้นหลังจากการอัปเดตเคอร์เนลเป็นอะแดปเตอร์ไร้สายที่ปิดใช้งานหน้าจอสีดำหลังจากรีบูตเป็นต้น

ฉันจะแก้ไขได้อย่างไร


ที่คล้ายกัน: askubuntu.com/questions/760671/…
Tor Klingberg

คำตอบ:


85

ตั้งแต่เคอร์เนล Ubuntu 4.4.0-20 การตั้งค่าEFI_SECURE_BOOT_SIG_ENFORCEเคอร์เนลได้รับการเปิดใช้งาน ซึ่งจะป้องกันไม่ให้โหลดโมดูลบุคคลที่สามที่ไม่ได้ลงชื่อหากเปิดใช้งาน UEFI Secure Boot

วิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้คือการปิดใช้งานการตั้งค่าความปลอดภัยในการตั้งค่า UEFI (BIOS)

ในกรณีส่วนใหญ่คุณสามารถเข้าสู่การตั้งค่า UEFI โดยใช้เมนูด้วง กดESCปุ่มเพื่อบูทเข้าเมนูด้วงแล้วเลือกการตั้งค่าระบบ ตัวเลือก Secure Boot ควรอยู่ในส่วน "Security" หรือ "Boot" ของ UEFI

คุณสามารถเข้าสู่ UEFI ได้โดยตรง แต่ขึ้นอยู่กับฮาร์ดแวร์ของคุณ อ่านคู่มือคอมพิวเตอร์ของคุณเพื่อดูวิธีเดินทาง มันอาจจะเป็นDelหรือF2ในการบูตหรืออย่างอื่น

mokutilทางเลือกคือการปิดการใช้งานการรักษาความปลอดภัยโดยใช้ Boot

เนื่องจากเคอร์เนล Ubuntu สร้าง 4.4.0-21.37 สิ่งนี้สามารถแก้ไขได้โดยการเรียกใช้

sudo apt install mokutil
sudo mokutil --disable-validation

มันจะต้องมีการสร้างรหัสผ่าน รหัสผ่านควรมีความยาวอย่างน้อย 8 ตัวอักษร หลังจากที่คุณเริ่มระบบใหม่ UEFI จะถามว่าคุณต้องการเปลี่ยนการตั้งค่าความปลอดภัยหรือไม่ เลือก "ใช่"

จากนั้นคุณจะถูกขอให้ป้อนรหัสผ่านที่สร้างขึ้นก่อนหน้านี้ เฟิร์มแวร์ UEFI บางตัวจะไม่ขอรหัสผ่านเต็มรูปแบบ แต่จะต้องป้อนตัวอักษรบางตัวเช่นที่ 1, 3 เป็นต้นโปรดระวัง บางคนไม่เข้าใจสิ่งนี้ ฉันไม่ได้รับมันตั้งแต่ครั้งแรกที่ ;-)

อัปเดต:ตอนนี้การตั้งค่าเคอร์เนลนี้เปิดใช้งานในเคอร์เนล Ubuntu ที่รองรับทั้งหมด Ubuntu 16.04, 15.10 และ 14.04 ได้รับผลกระทบ


มันไม่ได้ผลสำหรับฉัน @Sputnik ตอบไม่ได้ แต่ถึงกระนั้นฉันต้องการที่จะรู้ว่าทำไม mokutil ถามรหัสผ่านของฉันและเมื่อฉันต้องการมันได้หรือไม่
Alwin Kesler

8
@AlwinKesler มันถามรหัสผ่านซึ่งมันจะตรวจสอบหลังจากรีบูตก่อนที่จะมีการดำเนินการเปลี่ยนแปลงฐานข้อมูล MOK หากไม่มีสิ่งนี้กระบวนการโกงสามารถเปลี่ยนคีย์ในฐานข้อมูล MOK ซึ่งจะมีผลบังคับใช้หลังจากรีบูตครั้งถัดไป นอกจากนี้ในตอนนี้แพลตฟอร์ม 'รู้' ว่าบุคคลที่ร้องขอการเปลี่ยนแปลงนั้นเป็นบุคคลเดียวกันกับที่ปรากฏตัวทางกายภาพหลังจากรีบูตและจะผ่านมาตรการรักษาความปลอดภัยของฮาร์ดแวร์เช่นการเข้าถึงเครื่องและการรู้รหัสผ่านของระบบเวลาบู๊ต .
zwets

@ Pilot6: ฉันยังอยู่ใน Ubuntu 14.04 LTS เนื่องจากปัญหาทางเทคนิคบางอย่าง ขอบคุณมากสำหรับการปรับปรุงคำตอบ
Ravi Joshi

3
ทำงานกับฉันใน Ubuntu 18.04 ไม่สามารถคิดได้ว่าชีวิตของฉันทำไมการติดตั้งไดรเวอร์ของ nvidia ไม่ทำงานด้วยวิธีการใด ๆ หรือแม้กระทั่งย้อนกลับไปเป็น 16.04 Gah! มันคงที่ เสียเวลามาก
เนท

1
ระบบ Ubuntu ของฉันล้าหลังมาก ไม่มีเหตุผลเพราะนี่เป็นแล็ปท็อปใหม่เอี่ยม ตอนนี้ฉันรู้ว่าซีพียูกำลังทำทุกอย่างและการ์ดของฉันก็ไม่ได้ทำงานตลอดเวลา ลิงค์นี้ช่วยด้วย - linuxbabe.com/ubuntu/install-nvidia-driver-ubuntu-18-04
Peter Drinnan

32

ตามคำแนะนำของผู้ใช้ @zwets ฉันกำลังคัดลอก (พร้อมแก้ไข) คำตอบที่นี่:

ตั้งแต่เคอร์เนลเวอร์ชัน 4.4.0-20 จะมีการบังคับใช้ว่าโมดูลเคอร์เนลที่ไม่ได้ลงชื่อจะไม่ได้รับอนุญาตให้เรียกใช้เมื่อเปิดใช้งาน Secure Boot หากคุณต้องการเก็บ Secure Boot และใช้งานโมดูลเหล่านี้ขั้นตอนต่อไปคือการเซ็นชื่อโมดูลเหล่านั้น

ลองทำดู

  1. สร้างคีย์การเซ็นชื่อ

    openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"
    
  2. เซ็นชื่อโมดูล

    sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /path/to/module
    

หมายเหตุ 1 : อาจมีหลายไฟล์ที่จะเซ็นชื่อสำหรับไดรเวอร์ / โมดูลเดียวดังนั้น/path/to/moduleอาจจำเป็นต้องเปลี่ยนด้วย$(modinfo -n <modulename>)เช่น$(modinfo -n vboxdrv)

หมายเหตุ 2 : sudo kmodsign sha512 ./MOK.priv ./MOK.der /path/to/moduleเป็นทางเลือกถ้าsign-fileไม่พร้อมใช้งาน

  1. ลงทะเบียนปุ่มเพื่อ Secure Boot

    sudo mokutil --import MOK.der
    

    ระบุรหัสผ่านเพื่อใช้ในภายหลังหลังจากรีบูต

  2. Rebootและทำตามคำแนะนำในการลงทะเบียน MOK (รหัสเจ้าของเครื่อง) นี่คือตัวอย่างที่มีรูปภาพ ระบบจะรีบูตอีกครั้ง

sudo mokutil --list-enrolledถ้าคีย์ที่ได้รับการลงทะเบียนอย่างถูกต้องก็จะแสดงขึ้นภายใต้

โปรดแจ้งให้เราทราบหากโมดูลของคุณจะทำงานด้วยวิธีนี้บน Ubuntu 16.04 (บนเคอร์เนล 4.4.0-21 ฉันเชื่อว่า)

ทรัพยากร: บทความเว็บไซต์โดยละเอียดสำหรับการใช้งานFedoraและUbuntuของการเซ็นชื่อโมดูล (พวกเขาได้ทำงานกับมัน) ;-)

ทรัพยากรเพิ่มเติม:ฉันสร้างสคริปต์ทุบตีเพื่อการใช้งานของตัวเองทุกครั้งที่virtualbox-dkmsอัพเกรดและดังนั้นจึงเขียนทับโมดูลที่เซ็นชื่อ ตรวจสอบของฉันvboxsignขึ้นบน GitHub

หมายเหตุเพิ่มเติมสำหรับการรักษาความปลอดภัย (พิเศษ -) สติ: ;-)

เนื่องจากรหัสส่วนตัวที่คุณสร้างขึ้น ( MOK.privในตัวอย่างนี้) สามารถใช้ได้กับทุกคนที่สามารถเข้าถึงได้จึงเป็นวิธีปฏิบัติที่ดีในการรักษาความปลอดภัย คุณอาจchmodเข้ารหัส ( gpg) มันหรือเก็บไว้ที่อื่นที่ปลอดภัย (r) หรือตามที่ระบุไว้ในความคิดเห็นนี้ให้ลบตัวเลือก-nodesในหมายเลขขั้นตอนที่ 1 ซึ่งจะเข้ารหัสคีย์ด้วยข้อความรหัสผ่าน


ใน Ubuntu 14.10 ฉันยังคงเห็น 'คีย์ที่ต้องการไม่พร้อมใช้งาน' พยายามติดตั้งไดรเวอร์ Broadcom ที่คอมไพล์จากแหล่งที่มาแม้ว่าจะลงทะเบียนคีย์และลงนามไดรเวอร์แล้ว ปิดใช้งานการตรวจสอบความถูกต้องทำงาน
มาร์ค

1
สิ่งนี้ใช้ได้กับฉันสำหรับ VirtualBox และ Ubuntu 16.04
YtvwlD

1
ฉันได้รับข้อผิดพลาดต่อไปนี้ในขั้นตอนที่ 3: "ระบบ EFI ไม่รองรับตัวแปรนี้" "dmesg" ไม่มีรายการ efi ("dmesg | grep efi" ไม่มีผลลัพธ์) ฉันจะทำอะไรได้อีก ขอบคุณ
musbach

คุณสามารถแทนที่เส้นทางด้วย $ (modinfo -n modulename)
Shane

บน Ubuntu 18.04 ที่นี่ insmod สำหรับโมดูล talpa_syscallhook.ko ยังคงพูดว่า "คีย์ที่จำเป็นไม่พร้อมใช้งาน" แม้ฉันจะได้ลงนามโมดูลนั้นและโมดูลอื่น ๆ ทั้งหมดในไดเรกทอรีเดียวกันสำหรับ Sophos AV ในกรณีที่ รหัสได้รับการลงทะเบียนเรียบร้อยแล้วเนื่องจากฉันสามารถดูได้เมื่อฉันแสดงรายการปุ่ม mok ทั้งหมด มีความคิดเห็นเกี่ยวกับวิธีการดำเนินการอย่างไร
Fran Marzoa

6

คุณสามารถปิดการใช้งาน Secure Boot (UEFI) ใน BIOS ด้วยขั้นตอนต่อไปนี้:

  1. รีบูตเครื่องของคุณและเข้าสู่เมนู BIOS (ในกรณีของฉันกด F2)

  2. ค้นหา Secure Boot และเปลี่ยนเป็น Legacy

ในเมนบอร์ด ASUS:

  • ไปที่โหมดขั้นสูง (F7)
  • ไปที่ตัวเลือก Secure Boot ใต้หัวข้อ Boot
  • เปลี่ยน "โหมด Windows UEFI" ด้วย "ระบบปฏิบัติการอื่น"
  • บันทึกและรีสตาร์ทเพื่อใช้การตั้งค่า (F10)

2
Secure Boot และ "Legacy" เป็นการตั้งค่าที่แตกต่างกัน
Pilot6

แต่ถ้าคุณเปิดใช้งาน "การเริ่มระบบดั้งเดิม" แทน UEFI นั่นหมายความว่า Secure Boot ไม่ได้เปิดใช้งานหรือไม่
Supernormal

@ ปกติ, ใช่นี่คือสิ่งที่ฉันเข้าใจ
Sputnik

3

นอกจากนี้คุณยังสามารถปิดการใช้งานการรักษาความปลอดภัยใน Boot sudo update-secureboot-policyชิมเซ็นสัญญาทำงาน นี้หน้าวิกิพีเดียอธิบายวิธีการนี้:

  • เปิดเทอร์มินัล (Ctrl + Alt + T) และดำเนินการ sudo update-secureboot-policy จากนั้นเลือกใช่
  • ป้อนรหัสผ่านชั่วคราวระหว่าง 8 ถึง 16 หลัก (ตัวอย่างเช่น 12345678 เราจะใช้รหัสผ่านนี้ในภายหลัง
  • ป้อนรหัสผ่านเดิมอีกครั้งเพื่อยืนยัน
  • รีบูทระบบและกดปุ่มใด ๆ เมื่อคุณเห็นหน้าจอสีน้ำเงิน (การจัดการ MOK
  • เลือกเปลี่ยนสถานะ Boot ปลอดภัย
  • ป้อนรหัสผ่านที่คุณเลือกในขั้นตอนที่ 2 และกด Enter
  • เลือกใช่เพื่อปิดใช้งาน Secure Boot ในแบบลงชื่อ
  • กดปุ่ม Enter เพื่อเสร็จสิ้นขั้นตอนทั้งหมด

คุณยังสามารถเปิดใช้งาน Secure Boot ในแบบลงชื่ออีกครั้ง เพียงแค่รัน

sudo update-secureboot-policy - เปิดใช้งานแล้วทำตามขั้นตอนข้างต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.