Як підписати драйвер в Windows x64 10 / 8.1 / 7 за допомогою самоподпісанного сертифіката

Всі 64 бітові версії Windows, починаючи з Windows 7, за замовчуванням забороняють установку драйверів пристроїв, які не підписані за допомогою коректної цифрового підпису. Непідписані драйвер блокуються операційною системою. Наявність цифрового підпису гарантує (в якійсь мірі), що драйвер випущений конкретним розробником або вендором, а його код не був модифікований після того, як він був підписаний.

У Windows 10/7 x64 існує кілька способів відключити перевірку цифрового підпису встановлюваного драйвера: за допомогою групової політики або тестового режиму завантаження системи (докладніше всі способи описані в статті Відключаємо перевірку цифрового підпису для установки непідписаних драйверів в Windows).

Сьогодні ми покажемо, як можна самостійно підписати будь-який непідписаний драйвер для 64 бітної версії Windows 10 або Windows 7.

Припустимо, що у нас є драйвер якогось пристрою для x64 Windows 10 або Windows 7, у якого відсутня цифровий підпис (в нашому прикладі це буде драйвер для досить старої відеокарти). Архів з драйверами під нашу версію Windows (мені вдалося знайти драйвер для Windows Vista x64) був викачаний з сайту виробника і його вміст Розпаковано в каталог c: \ tools \ drv1 \. Спробуємо встановити драйвер, додавши його в сховище драйверів Windows за допомогою стандартної утиліти pnputil.

Pnputil -a "C: \ tools \ drv1 \ xg20gr.inf"

Примітка. Ця і всі наступні команди виконуються в командному рядку, запущеної з правами адміністратора.

У процесі його установки Windows 7 відобразить попередження про те, що система не може перевірити цифровий підпис драйвера.

У Windows 10 таке попередження навіть не з'являється, а в консолі з'являється попередження, що в сторонньому INF файлі відсутня інформація про цифровий підпис.

При спробі встановити драйвер з провідника Windows, якщо ви клацніть ПКМ по inf файлу драйвера і виберіть Install / встановити з'явиться помилка:

The third-party INF does not contain digital signature information.

INF стороннього виробника не містить інформації про підписи.

Спробуємо підписати даний драйвер за допомогою самоподпісанного сертифіката.

зміст:

  • Утиліти, необхідні для підписування драйвера
  • Створюємо самоподпісанний сертифікат і закритий ключ
  • Генеруємо CAT файл драйвера
  • Підписуємо драйвер самоподпісанного сертифікатом
  • установка сертифіката
  • Установка драйвера, завіреного самоподпісанного сертифікатом

Утиліти, необхідні для підписування драйвера

Для роботи нам знадобиться завантажити і встановити (з настройками за замовчуванням) такі інструменти розробника додатків для Windows.

  • Windows SDK (або Microsoft Visual Studio 2005 або вище) для вашої версії Windows - до складу цих пакетів входить Windows SDK Signing tools for Desktop, в яку включена необхідна нам утиліта - signtool.exe;
  • Windows Driver Kit 7.1.0 - ISO образу  GRMWDK_EN_7600_1.ISO розміром 649 Мб
Порада. У Windows 10 можна використовувати більш нові версії Windows SDK і Windows Driver Kit. Перед установкою цих інструментів, переконайтеся, що в системі встановлений .NET Framework 4.

Створюємо самоподпісанний сертифікат і закритий ключ

Створимо в корені диска C: \ DriverCert.

Відкриємо командний рядок і перейдемо до наступного каталог:

cd C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.1 \ bin

Створимо самоподпісанний сертифікат і закритий ключ, виданий, припустимо, для компанії Winitpro:

makecert -r -sv C: \ DriverCert \ myDrivers.pvk -n CN = "Winitpro" C: \ DriverCert \ MyDrivers.cer

Під час створення утиліта попросить вказати пароль для ключа, хай це буде P@ss0wrd.

На основі створеного сертифіката створимо публічний ключ для сертифіката видавця ПО (PKCS).

cert2spc C: \ DriverCert \ myDrivers.cer C: \ DriverCert \ myDrivers.spc

Об'єднаймо публічний ключ (.spc) і персональний ключ (.pvk) в одному файлі сертифіката формату Personal Information Exchange (.pfx).

pvk2pfx -pvk C: \ DriverCert \ myDrivers.pvk -pi P @ ss0wrd -spc C: \ DriverCert \ myDrivers.spc -pfx C: \ DriverCert \ myDrivers.pfx -po P @ ss0wrd

Порада. Ви можете створити самоподпісанний сертифікат типу Code Signing без використання сторонніх коштів за допомогою командлета PowerShell 5.0 - New-SelfSifgnedCertificate.

$ Cert = New-SelfSignedCertificate -Subject "Winitpro" -Type CodeSigningCert -CertStoreLocation cert: \ LocalMachine \ My

Потім потрібно експортувати даний СЕРТФІКАТА в pfx файл з паролем:

$ CertPassword = ConvertTo-SecureString -String "P @ ss0wrd" -Force -AsPlainText
Export-PfxCertificate -Cert $ cert -FilePath C: \ DriverCert \ myDrivers.pfx -Password $ CertPassword

Порада. Незважаючи на те, що сертифікат має обмежений термін дії, закінчення строку дії сертифіката CodeSigning означає, що ви не зможете створювати нові сигнатури. Термін дії драйвера, вже підписаного цим сертифікатом, безстроковий (або старі сигнатури діють протягом зазначеного timestamp).

Генеруємо CAT файл драйвера

створимо каталог C: \DriverCert\xg і скопіюємо в нього всі файли з каталогу, в який спочатку був розпакований архів з драйвером (c: \ tools \ drv1 \). Переконати що серед файлів є файли з розширенням .sys і .inf (В нашому випадку xg20grp.sys і xg20gr).

Перейдемо до каталогу:

cd C: \ WinDDK \ 7600.16385.1 \ bin \ selfsign

На основі inf файлу за допомогою утиліти inf2cat.exe (входить до складу Windows Driver Kit -WDK) сгенерируем для нашої платформи cat файл (містить інформацію про всіх файлах пакета драйвера).

inf2cat.exe / driver: "C: \ DriverCert \ xg" / os: 7_X64 / verbose

Щоб переконайтеся, що процедура пройшла коректно, перевірте, що в балці присутні повідомлення:

Signability test complete.
і
Catalog generation complete.

Порада. У моєму випадку команда Inf2Cat.exe повернула помилку:

Signability test failed.

Errors:

22.9.7: DriverVer set to incorrect date (must be postdated to 4/21/2009 for newest OS) in \ hdx861a.inf

Для виправлення помилки потрібно в секції [Version] знайти рядок з DriverVer = і замінити її на:

DriverVer = 05/01 / 2009,9.9.9.9

Після виконання команди в каталозі драйвера повинен оновитися файл g20gr.cat

Підписуємо драйвер самоподпісанного сертифікатом

Перейдіть в каталог:

cd "C: \ Program Files (x86) \ Windows Kits \ 10 \ bin \ 10.0.17134.0 \ x64"

Підпишемо комплект файлів драйвера створеним нами сертифікатом, як сервіс таймстамп (штамп часу) скористаємося ресурсом Globalsign. Наступна команда підпише CAT файл цифровим підписом за допомогою сертифіката, що зберігається в PFX-файл, захищеному паролем.

signtool sign / f C: \ DriverCert \ myDrivers.pfx / p P @ ss0wrd / t http://timestamp.globalsign.com/scripts/timstamp.dll / v "C: \ DriverCert \ xg \ xg20gr.cat"

Якщо файл підписаний успішно, повинна з'явиться напис:

Successfully signed: C: \ DriverCert \ xg \ xg20gr.cat
Number of files successfully Signed: 1

Примітка. Цифровий підпис драйвера міститься в .cat файлі, на який посилається .inf файл драйвера. За допомогою наступної команди можна перевірити цифровий підпис драйвера в cat файлі:

SignTool verify / v / pa c: \ DriverCert \ xg \ xg20gr.cat

Лідо у властивостях файлу на вкладці Digital Signatures.

CAT файл містить цифрові підписи (відбитки / thumbprints) всіх файлів, які знаходяться в каталозі драйвера (файлів, які вказані в INF файлі в секції CopyFiles). Якщо будь-який з цих файлів був змінений, то контрольна сума файлів не буде збігатися з даними в CAT файлі, в результаті установка такого драйвера закінчиться помилкою.

установка сертифіката

Оскільки створений нами сертифікат є самоподпісанного, система за замовчуванням йому не довіряє. Додамо наш сертифікат в локальне сховище сертифікатів. Зробити це можна за допомогою команд:

certmgr.exe -add C: \ DriverCert \ myDrivers.cer -s -r localMachine ROOT
certmgr.exe -add C: \ DriverCert \ myDrivers.cer -s -r localMachine TRUSTEDPUBLISHER

Або з графічного майстра додавання сертифікатів (сертифікат потрібно помістити в сховища Trusted Publishers і Trusted Root Certification Authorities локальної машини). В домені ви можете централізовано поширити цей сертифікат на робочі станції за допомогою групової політики.

Примітка. Перевірити наявність створеного нами сертифіката в довірених можна, відкривши оснащення управління сертифікатами (certmgr.msc) і перевіривши наявність створеного нами сертифіката (виданий для winitpro) у відповідних сховищах.

Примітка. При перевірці сховища сертифікатів за допомогою утиліти Sigcheck цей сертифікат буде відображатися як недовірених, тому що він відсутній в списку зі списком кореневих сертифікатів Microsoft (цей список потрібно періодично оновлювати).

Установка драйвера, завіреного самоподпісанного сертифікатом

Спробуємо ще раз встановити підписаний нами драйвер, виконавши команду:

Pnputil -i -a C: \ DriverCert \ xg20 \ xg20gr.inf

Тепер в процесі установки драйвера, вікна-попередження про відсутньої цифрового підпису драйвера чи не з'явиться.

Successfully installed the driver on a device on the system.
Driver package added successfully.

У Windows 7 з'являється таке попередження. про те, чи впевнені ви, що хочете встановити цей драйвер (в Windows 10 x64 1803 таке спливаюче вікно не з'являється). натиснувши "Install", Ви встановите драйвер в системі.

Якщо з якихось причин драйвер не встановлюється, детальний лог установки драйвера міститься в файлі C: \ Windows\ inf\ setupapi.dev.log. Цей лог дозволить вам отримати більш детальну інформацію про помилку установки. У більшості випадком виникає помилка "Driver package failed signature validation" - швидше за все це означає, що сертифікат драйвера не додано в довірені сертифікати.

Якщо установка драйвера пройшла успішно, у файлі setupapi.dev.log будуть приблизно такі рядки:

>>> [Device Install (DiInstallDriver) - C: \ WINDOWS \ System32 \ DriverStore \ FileRepository \ xg20gr.inf_amd64_c5955181485ee80a \ xg20gr.inf] >>> Section start 2018/07/22 23: 32: 57.015 cmd: Pnputil -i - ac: \ DriverCert \ xg \ xg20gr.inf ndv: Flags: 0x00000000 ndv: INF path: C: \ WINDOWS \ System32 \ DriverStore \ FileRepository \ xg20gr.inf_amd64_c5955181485ee80a \ xg20gr.inf inf: SetupCopyOEMInf: C: \ WINDOWS \ System32 \ DriverStore \ FileRepository \ xg20gr.inf_amd64_c5955181485ee80a \ xg20gr.inf 23: 32: 57.046 inf: Copy style: 0x00000000 inf: Driver Store Path: C: \ WINDOWS \ System32 \ DriverStore \ FileRepository \ xg20gr.inf_amd64_c5955181485ee80a \ xg20gr.inf inf: Published Inf Path: C: \ WINDOWS \ INF \ oem23.inf inf: SetupCopyOEMInf exit (0x00000000) 23: 32: 57.077 <<<  Section end 2018/07/22 23:32:57.155 <<<  [Exit status: SUCCESS]

Як ви бачите, для установки самоподпісанного драйвера нам навіть не довелося відключати перевірку цифрового підпису драйверів за допомогою bcdedit.exe, як описано тут (команди bcdedit.exe / set loadoptions DISABLE_INTEGRITY_CHECKS і bcdedit.exe / set testsigning ON).