Как стать автором
Обновить

Загрузка Windows 7 в режиме SecureBoot

Многие в курсе, что официально поддержка SecureBoot внедрена в операционные системы компании Microsoft начиная с Windows 8. Однако пользователи не спешат переходить с проверенной "семерки", благо расширенная поддержка этой ОС будет осуществляться до 2020 года. Поскольку 64-битные версии Windows 7 способны загружаться в режиме UEFI, возникает вопрос: что нужно сделать, чтобы включение SecureBoot не сломало загрузку?


Ответ на этот вопрос в технической части полностью раскрыт вот здесь. Если вкратце, в UEFI есть несколько хранилищ сертификатов шифрования: PK, KEK, db и dbx. Сертификатом из PK проверяются KEK, сертификатами из KEK проверяются db и dbx, а сертификатами из db и dbx проверяются загрузчики. Если ключ, которым подписан загрузчик, содержится в db и не содержится в dbx, то загрузка разрешается. Изначально ваш новенький (или старенький, но раз уж вы читаете эту статью, поддерживающий SecureBoot) компьютер находится в режиме настройки, т. е. в PK, KEK, db и dbx находятся ключи, которые туда заранее положил производитель вашего ПК. При сбросе настроек SecureBoot они восстановятся, но в принципе обычно вы можете сохранить их куда-нибудь при помощи интерфейса вашего UEFI.


Поскольку мы немного параноики (если совсем не параноики, можно отключить SecureBoot и прочитать эту статью просто для развлечения), мы хотим доверять только нашим ключам, а не каким-то чужим. Поэтому нам нужно прописать свои сертификаты в PK и KEK, и подписать нашим KEK-сертификатом сертификат загрузчика. Как и чем это всё можно сделать, включая создание сертификатов, прекрасно и подробно описано в уже упомянутой статье. Если нет линукса, можно взять лайв-образ или виртуалку, но у меня уже была готовая ОС, так что с подготовкой сертификатов и файлов PK и KEK проблем не возникло. А вот при создании DB мы натыкаемся на одну маленькую загвоздку: в поиске не удается найти сертификат от Microsoft, которым подписан загрузчик от Windows 7 (файл называется bootmgfw.efi).


В принципе, ничего страшного в этом нет. С ходу в голову приходят несколько вариантов решения проблемы без отключения БезопаснойЗагрузки и не имея сертификата:


  1. Создать свой собственный сертификат DB и подписать им загрузчик
  2. Взять загрузчик от Windows 8
  3. Погуглить еще
  4. В принципе в db и dbx можно кроме сертификатов запихать также хэш от файла загрузчика, как описано вот здесь. Правда, описан способ только для dbx, но для db должно быть аналогично.

Первый способ, как самый очевидный, был тут же и опробован. Однако оказалось, что не все так просто: в процессе загрузки выдается предупреждение, что файл загрузчика не подписан или подписан неверной подписью, и его нужно восстановить. Так как в момент загрузки наверняка используется не системное хранилище сертификатов, а что-то еще, замену сертификата на свой осуществить простым способом, видимо, не удастся.


Второй способ я серьезно не рассматривал, т. к. образа восьмерки у меня не было, а качать N Гб ради файла размером порядка мегабайта было лень. Да и после первого пункта были определенные сомнения относительно того, поймет ли Windows 7 сертификат от загрузчика Windows 8.


Третий способ в очередной раз не дал результатов.


Четвертый способ у меня так и не получилось "добить" — видимо, я проигнорировал фразу о том, что хэш нужно брать от неподписанного файла, сейчас уже нет смысла проверять. Но в процессе изучения команд, описанных на той странице, с целью понять, что происходит, я заметил, что в detached подписи загрузчика есть ссылки на файлы .crt на сайт microsoft.com. Вы можете достичь того же результата, выполнив команду:


strings bootmgfw.efi | grep -Po 'http.*crt'

В результате вы получите следующие ссылки на сертификаты:
http://www.microsoft.com/pki/certs/MicrosoftTimeStampPCA.crt
http://www.microsoft.com/pki/certs/MicrosoftWinPCA.crt
http://www.microsoft.com/pki/certs/MicrosoftRootCert.crt
К слову, даже зная, что искать, я так и не смог найти какие-то ссылки на сайте Microsoft, которые бы указывали на эти файлы.


RootCert и TimeStampPCA нам вряд ли интересны, а вот WinPCA я обработал и добавил в db. В результате Windows 7 в режиме SecureBoot загрузилась и работает успешно.


Еще хотел бы заметить, что на самом деле существует пятый способ: взять загрузчик наподобие grub2, умеющий загружать что угодно, и загружать Windows 7 им. Но тут сразу несколько препятствий: если загрузчик не проверяет подписи, то проще и осмысленней отключить SecureBoot, а если проверяет, то ему все равно нужно с чем-то сравнивать подпись. Grub2, кстати, по крайней мере в убунте, отказывается загружать винду, хотя с отключенным SecureBoot тот же пункт меню работает.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.