Почему я получаю «Обязательный ключ недоступен» при установке сторонних модулей ядра или после обновления ядра?

79

Эта проблема возникает только в системах UEFI с включенной безопасной загрузкой.

Когда я пытаюсь установить модули DKMS, такие как драйверы VirtualBox, Nvidia или Broadcom, они не устанавливаются, и я получаю, Required key not availableкогда пытаюсь modprobeих установить .

VirtualBox жалуется, что vboxdrvне загружен.

wlДрайвер Broadcom показан lspci -kкак модуль ядра, но не используется. sudo modprobe wlброски Required key not available.

Также эта проблема может возникнуть при установке некоторых модулей ядра из исходников git.

Эта проблема может появиться после обновления ядра в виде отключенного беспроводного адаптера, черного экрана после перезагрузки и т. Д.

Как я могу это исправить?

Pilot6
источник
Аналогично: askubuntu.com/questions/760671/…
Тор Клингберг

Ответы:

85

Начиная с ядра Ubuntu 4.4.0-20 EFI_SECURE_BOOT_SIG_ENFORCEконфигурация ядра была включена. Это предотвращает загрузку неподписанных сторонних модулей, если включена UEFI Secure Boot.

Самый простой способ решить эту проблему - отключить безопасную загрузку в настройках UEFI (BIOS).

В большинстве случаев вы можете войти в настройки UEFI, используя меню grub. Нажмите ESCкнопку при загрузке, войдите в меню grub и выберите System Setup. Опция Безопасная загрузка должна быть в разделе «Безопасность» или «Загрузка» UEFI.

Вы можете войти в UEFI напрямую, но это зависит от вашего оборудования. Прочтите руководство к компьютеру, чтобы узнать, как туда добраться. Это может быть Delили F2при загрузке, или что-то еще.

Альтернативный способ - отключить безопасную загрузку с помощью mokutil.

Начиная с сборки ядра 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 затронуты.

Pilot6
источник
Это не работает для меня. @Sputnik ответ делает. Но все же я хотел бы знать, почему mokutil запрашивает у меня пароль и когда он мне нужен?
Алвин Кеслер
8
@AlwinKesler Он запрашивает пароль, который он подтвердит после перезагрузки, прежде чем изменения в базе данных MOK будут фактически выполнены. Без этого мошеннический процесс может изменить ключи в базе данных MOK, которые вступят в силу после следующей перезагрузки. Кроме того, теперь платформа «знает», что лицо, запрашивающее изменение, - это тот же человек, который физически присутствует после перезагрузки, и, таким образом, прошел аппаратные меры безопасности, такие как физический доступ к компьютеру и знание системного пароля во время загрузки. ,
zwets
@ Pilot6: я все еще на Ubuntu 14.04 LTS из-за некоторых технических проблем. Большое спасибо за обновление ответа.
Рави Джоши
3
Работал для меня на Ubuntu 18.04. Не могу понять, почему установка драйверов nvidia не работала ни при каких обстоятельствах, ни даже при возврате к 16.04. Г! Это исправило это. Так много времени было потрачено впустую.
Нейт
1
Моя система Ubuntu была очень медленной. Не было никакого смысла, так как это был новый ноутбук. Теперь я понимаю, что процессор все делал, и моя видеокарта все время простаивала. Эта ссылка также помогла - linuxbabe.com/ubuntu/install-nvidia-driver-ubuntu-18-04
Питер Дриннан
32

По предложению пользователя @zwets, я копирую (с правками) ответ здесь:

Начиная с версии ядра 4.4.0-20 было принудительно запрещено запускать неподписанные модули ядра с включенной безопасной загрузкой. Если вы хотите сохранить 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. Зарегистрируйте ключи для безопасной загрузки

    sudo mokutil --import MOK.der
    

    Введите пароль для последующего использования после перезагрузки

  2. Rebootи следуйте инструкциям, чтобы зарегистрировать MOK (ключ владельца машины). Вот образец с картинками. Система перезагрузится еще раз.

Если ключ был зарегистрирован правильно, он будет отображаться под sudo mokutil --list-enrolled.

Пожалуйста, дайте мне знать, будут ли ваши модули работать таким образом в Ubuntu 16.04 (на ядре 4.4.0-21, я считаю).

Ресурсы: Подробная статья на сайте для реализации подписания модулей в Fedora и Ubuntu . (они работали над этим) ;-)

Дополнительный ресурс: я создавал bash-скрипт для собственного использования каждый раз при virtualbox-dkmsобновлении и, таким образом, переписывал подписанные модули. Проверьте мой vboxsignпервоначально на GitHub .

Дополнительное примечание для безопасности (экстра) сознательно: ;-)

Поскольку созданный вами закрытый ключ ( MOK.privв этом примере) может использовать любой, кто имеет к нему доступ, рекомендуется сохранить его в безопасности. Вы можете chmodэто сделать, зашифровать ( gpg) или сохранить в другом безопасном месте (r). Или, как отмечено в этом комментарии , удалите параметр -nodesв шаге 1. Это зашифрует ключ с помощью ключевой фразы.

Majal
источник
В Ubuntu 14.10 я продолжал видеть, что «требуемый ключ недоступен», пытаясь установить драйвер Broadcom, скомпилированный из исходного кода, несмотря на предварительную регистрацию ключа и подпись драйвера. Отключение проверки работало.
Марк
1
Это сработало для меня для VirtualBox и Ubuntu 16.04.
YtvwlD
1
Я получаю следующую ошибку на шаге 3: «Переменные EFI не поддерживаются в этой системе». "dmesg" не имеет записей efi ("dmesg | grep efi" не имеет результатов) Что еще я могу сделать? Спасибо
musbach
Вы можете заменить путь с помощью $ (modinfo -n modulename)
Шейн
В Ubuntu 18.04 здесь модуль insmod для модуля talpa_syscallhook.ko продолжает говорить «Обязательный ключ недоступен», несмотря на то, что я подписал этот модуль и все остальные модули в том же каталоге для Sophos AV на всякий случай. Ключ был успешно зарегистрирован, как я вижу, когда я перечисляю все ключи mok. Есть идеи, как поступить?
Фран Марзоа
6

Вы можете отключить безопасную загрузку (UEFI) в BIOS, выполнив следующие действия:

  1. Перезагрузите компьютер и войдите в меню BIOS (в моем случае нажмите F2)

  2. Ищите безопасную загрузку и переходите на Legacy

В материнской плате ASUS:

  • Перейти в расширенный режим (F7)
  • Зайдите в опцию Secure Boot в разделе Boot
  • Измените «Режим Windows UEFI» на «Другие ОС»
  • Сохраните и перезапустите, чтобы применить настройки (F10)
Спутник
источник
2
Secure Boot и «Legacy» - это разные настройки.
Pilot6
Но если вместо UEFI включена «традиционная загрузка», означает ли это, что безопасная загрузка не включена?
Сверхъестественное
@ Сверхъестественно, да, это то, что я понимаю.
Спутник
3

Вы также можете отключить безопасную загрузку в режиме работы с подписью sudo update-secureboot-policy. Эта вики-страница объясняет этот метод:

  • Откройте терминал (Ctrl + Alt + T), выполните команду sudo update-secureboot-policy и выберите «Да».
  • Введите временный пароль от 8 до 16 цифр. (Например, 12345678, мы будем использовать этот пароль позже
  • Введите тот же пароль еще раз для подтверждения.
  • Перезагрузите систему и нажмите любую клавишу, когда появится синий экран (управление МОК
  • Выберите Изменить состояние безопасной загрузки.
  • Введите пароль, который вы выбрали на шаге 2, и нажмите Enter.
  • Выберите Да, чтобы отключить безопасную загрузку в Shim-Sign.
  • Нажмите клавишу Enter, чтобы завершить всю процедуру.

Вы по-прежнему можете включить безопасную загрузку в Shim-Sign снова. Просто выполнить

sudo update-secureboot-policy --enable и затем выполните шаги, описанные выше

Кент Лин
источник