В 64-битных версиях Windows установка неподписанных драйверов запрещена по умолчанию, так как операционная система требует наличия цифровой подписи для подтверждения их подлинности и безопасности. Неподписанные драйверы блокируются, чтобы предотвратить установку потенциально опасного кода. В этой статье мы подробно разберем, как подписать драйвер с помощью самоподписанного сертификата для Windows 11, Windows 10, Windows 8.1 и Windows 7. Вы узнаете, как создать сертификат, сгенерировать CAT-файл, подписать драйвер и установить его, а также как обойти ограничения для kernel-mode драйверов при включенном Secure Boot.
Почему требуется подпись драйверов
Цифровая подпись подтверждает, что драйвер разработан доверенным издателем и не был изменен. Без подписи Windows блокирует установку, выдавая ошибки, такие как:
— В Windows 7: «Windows не может проверить издателя этого драйвера»
— В Windows 10/11: «INF стороннего производителя не содержит информации о подписи»
Для примера мы будем подписывать драйвер для старого графического адаптера, распакованный в каталог C:\tools\drv1 (файлы xg20gr.inf и xg20gr.sys). Попытка установить его через команду:
pnputil -a "C:\tools\drv1\xg20gr.inf"
вызовет ошибку из-за отсутствия подписи. Рассмотрим процесс создания и применения самоподписанного сертификата.
Такая же ошибка появляется при установке драйвера из проводника Windows (щелкните ПКМ по inf файлу драйвера и выберите Install / Установить):
Подготовка инструментов
Для подписи драйвера потребуются следующие инструменты:
— Windows SDK (или Microsoft Visual Studio версии 2005 и выше), включающий утилиту signtool.exe
— Windows Driver Kit (WDK), содержащий утилиту inf2cat.exe
Скачайте их для вашей версии Windows с официального сайта Microsoft.
Создание самоподписанного сертификата
Создайте каталог для сертификатов: C:\DriverCert.
Создание сертификата через PowerShell
Для современных версий Windows используйте PowerShell для создания сертификата типа Code Signing:
1. Откройте PowerShell с правами администратора
2. Выполните команды для создания сертификата со сроком действия 3 года:
$todaydate = Get-Date
$add3year = $todaydate.AddYears(3)
$cert = New-SelfSignedCertificate -Subject "MyDriverCert" -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\My -notafter $add3year
3. Экспортируйте сертификат в файл .pfx с паролем:
$CertPassword = ConvertTo-SecureString -String "P@ssw0rd" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath C:\DriverCert\myDrivers.pfx -Password $CertPassword
4. Добавьте сертификат в хранилища доверенных сертификатов:
$certFile = Export-Certificate -Cert $cert -FilePath C:\DriverCert\drivecert.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullName
Import-Certificate -CertStoreLocation Cert:\LocalMachine\TrustedPublisher -FilePath $certFile.FullName
Создание сертификата через makecert (для старых версий Windows)
Если PowerShell недоступен, используйте утилиту makecert.exe из Windows SDK:
1. Перейдите в каталог SDK:
cd "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\bin"
2. Создайте сертификат:
makecert -r -sv C:\DriverCert\myDrivers.pvk -n CN="MyDriverCert" C:\DriverCert\myDrivers.cer
3. Укажите пароль (например, P@ssw0rd)
4. Создайте публичный ключ:
cert2spc C:\DriverCert\myDrivers.cer C:\DriverCert\myDrivers.spc
5. Объедините ключи в .pfx файл:
pvk2pfx -pvk C:\DriverCert\myDrivers.pvk -pi P@ssw0rd -spc C:\DriverCert\myDrivers.spc -pfx C:\DriverCert\myDrivers.pfx -po P@ssw0rd
6. Добавьте сертификат в доверенные хранилища:
certmgr.exe -add C:\DriverCert\myDrivers.cer -s -r localMachine ROOT
certmgr.exe -add C:\DriverCert\myDrivers.cer -s -r localMachine TRUSTEDPUBLISHER
Для доменных сред распространите сертификат через групповые политики. Проверьте его наличие в хранилищах Trusted Root Certification Authorities и Trusted Publishers через консоль certlm.msc.
Примечание: Срок действия сертификата не влияет на уже подписанные драйверы, но для новых подписей потребуется действующий сертификат.
Генерация CAT-файла драйвера
CAT-файл содержит информацию о файлах драйвера и их цифровые подписи. Выполните следующие шаги:
1. Создайте каталог C:\DriverCert\xg и скопируйте в него файлы драйвера:
md C:\DriverCert\xg
xcopy C:\tools\drv1\ C:\DriverCert\xg /i /c /k /e /r /y
2. Перейдите в каталог WDK:
cd "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86"
3. Сгенерируйте CAT-файл с помощью inf2cat.exe:
inf2cat.exe /driver:"C:\DriverCert\xg" /os:7_X64 /verbose
4. Убедитесь, что файл C:\DriverCert\xg\xg20gr.cat создан, и в логе есть сообщения:
— Signability test complete
— Catalog generation complete
Устранение ошибок inf2cat
— Ошибка: «DriverVer set to incorrect date»
В файле xg20gr.inf в секции [Version] измените строку DriverVer на:
DriverVer=05/01/2009,9.9.9.9
— Ошибка: «Missing AMD64 CatalogFile entry»
Добавьте в секцию [Version] файла .inf:
CatalogFile=xg20gr.cat
Подпись драйвера
Перейдите в каталог с signtool.exe:
cd "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64"
Подпишите CAT-файл, используя сервер временных меток (например, DigiCert):
signtool sign /tr http://timestamp.digicert.com /td SHA256 /v /f C:\DriverCert\myDrivers.pfx /p P@ssw0rd "C:\DriverCert\xg\xg20gr.cat"
Если возникает ошибка, попробуйте другие серверы временных меток:
http://timestamp.verisign.com/scripts/timstamp.dll
http://timestamp.globalsign.com/scripts/timstamp.dll
http://timestamp.comodoca.com/authenticode
http://www.startssl.com/timestamp
http://tsa.starfieldtech.com
При успешной подписи появится сообщение:
Successfully signed: C:\DriverCert\xg\xg20gr.cat
Проверьте подпись:
signtool verify /v /pa C:\DriverCert\xg\xg20gr.cat
Если сертификат не добавлен в доверенные хранилища, появится ошибка:
«A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.»
Установка подписанного драйвера
Установите драйвер командой:
pnputil -i -a C:\DriverCert\xg\xg20gr.inf
В Windows 10/11 появится запрос на подтверждение установки. Нажмите «Установить». При успешной установке в логе C:\Windows\inf\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
inf: {SetupCopyOEMInf: C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd64_c5955181485ee80a\xg20gr.inf} 23:32:57.046
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]
Если установка не удалась, проверьте лог setupapi.dev.log. Ошибка «Driver package failed signature validation» указывает на отсутствие сертификата в доверенных хранилищах.
Особенности kernel-mode и user-mode драйверов
— User-mode драйверы (например, для принтеров или сканеров) работают с самоподписанными сертификатами даже при включенном Secure Boot
— Kernel-mode драйверы требуют сертификации через Windows Hardware Quality Labs (WHQL) для работы с Secure Boot. Самоподписанные kernel-mode драйверы блокируются с ошибкой:
Event ID: 7000, ERROR_DRIVER_BLOCKED
Проверьте состояние Secure Boot:
Confirm-SecureBootUEFI
Для установки kernel-mode драйверов отключите проверку подписи:
bcdedit.exe /set nointegritychecks on
bcdedit.exe /set testsigning on
После этого перезагрузите систему в тестовом режиме.
Рекомендации
— Убедитесь, что сертификат добавлен в хранилища Trusted Root Certification Authorities и Trusted Publishers
— Используйте актуальный сервер временных меток для подписи
— Для kernel-mode драйверов рассмотрите сертификацию через WHQL, если требуется поддержка Secure Boot
— Регулярно обновляйте список корневых сертификатов Microsoft для проверки подписей
Подпись драйвера с помощью самоподписанного сертификата позволяет установить неподписанные драйверы в Windows, обходя ограничения системы. Процесс включает создание сертификата, генерацию CAT-файла, подпись драйвера и его установку. Для kernel-mode драйверов при включенном Secure Boot потребуется тестовый режим или сертификация WHQL. Следуя этим шагам, вы сможете успешно установить даже устаревшие драйверы на современных версиях Windows.