Все 64 битные версии Windows по умолчанию запрещают установку драйверов устройств, которые не подписаны с помощью корректной цифровой подписи. Неподписанные драйвер блокируются операционной системой. Наличие цифровой подписи гарантирует, что драйвер выпущен доверенным разработчиком или вендором, а его код не был модифицирован.
В Windows x64 вы можете отключить проверку цифровой подписи устанавливаемого драйвера: с помощью групповой политики или тестового режима загрузки системы (подробнее все способы описаны в статье Отключаем проверку цифровой подписи для установки неподписанных драйверов в Windows).
Сегодня мы покажем, как можно самостоятельно подписать любой неподписанный драйвер для x64 битной версии Windows (инструкция применима для Windows 11, 10, 8.1 и 7).
Предположим, что у нас имеется драйвер некого устройства для x64 Windows 10, у которого отсутствует цифровая подпись (в нашем примере это будет драйвер для довольно старого графического адаптера видеокарты). Я скачал архив с драйверами для Windows с сайта производителя (мне удалось найти драйвер только для Windows Vista x64). Архив с драйвером я распаковал в каталог c:\tools\drv1\. Попробуем установить драйвер, добавив его в хранилище драйверов Windows с помощью стандартной утилиты pnputil.
Pnputil –a "C:\tools\drv1\xg20gr.inf"
При установке драйвера в Windows 7 появляется предупреждение о том, что ОС не может проверить цифровую подпись драйвера.
В Windows 10 (21H1) появляется предупреждение:
Не удалось добавить пакет драйвера: INF стороннего производителя не содержит информации о подписи.
Adding the driver package failed : The third-party INF does not contain digital signature information.
Такая же ошибка появляется при установке драйвера из проводника Windows (щелкните ПКМ по inf файлу драйвера и выберите Install / Установить):
The third-party INF does not contain digital signature information.
INF стороннего производителя не содержит информации о подписи.
Попробуем подписать данный драйвер с помощью самоподписанного сертификата.
Для работы нужно скачать и установить следующие инструменты разработчика приложений для вашей версии Windows.
- Windows SDK (или Microsoft Visual Studio 2005 или выше) для вашей версии Windows. В состав этих пакетов входит Windows SDK Signing tools for Desktop, в которую включена необходимая нам утилита —
signtool.exe
; - Windows Driver Kit (WDK) — https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk
Создаем самоподписанный сертификат драйвера
Создайте в корне диска каталог
C:\DriverCert
.
Для создания самоподписанного сертификата типа Code Signing можно использовать PowerShell командлет New-SelfSifgnedCertificate. В этом примере мы создадим самоподписанный сертификат со сроком действия 3 года.
$todaydate = Get-Date
$add3year = $todaydate.AddYears(3)
$cert = New-SelfSignedCertificate -Subject "Winitpro” -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\My -notafter $add3year
Затем нужно экспортировать данный сертификат в pfx файл с паролем:
$CertPassword = ConvertTo-SecureString -String “P@ss0wrd” -Force –AsPlainText
Export-PfxCertificate -Cert $cert -FilePath C:\DriverCert\myDrivers.pfx -Password $CertPassword
Теперь нужно добавить сертификат в доверенные корневые сертификаты и в сертификаты доверенных издателей:
$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
cd “C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\bin”
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
Добавьте сертификат в доверенные:
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 локальной машины).
Генерируем CAT файл драйвера
Создайте каталог C:\DriverCert\xg и скопируйте в него все файлы из каталога, в который первоначально был распакован архив с драйвером (c:\tools\drv1\). Убедить что среди файлов имеются файлы с расширением .sys и .inf (в нашем случае xg20grp.sys и xg20gr.inf).
md C:\DriverCert\xg
xcopy c:\tools\drv1\ C:\DriverCert\xg /i /c /k /e /r /y
Перейдем в каталог:
cd “C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86”
На основе inf файла с помощью утилиты inf2cat.exe (входит в состав Windows Driver Kit -WDK) сгенерируйте cat файл (содержит информацию о всех файлах пакета драйвера).
inf2cat.exe /driver:"C:\DriverCert\xg" /os:7_X64 /verbose
Чтобы убедитесь, что процедура прошла корректно, проверьте, что в каталоге появился файл C:\DriverCert\xg\xg20gr.cat, и в логе есть сообщения:
Signability test complete.
и
Catalog generation complete.
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
Если у вас появится ошибка
Missing AMD64 CatalogFile entry
(для 64-бит) или
Missing 32-bit CatalogFile entry
. Нужно в секцию [Version] .inf файла добавить строку
CatalogFile=xg20gr.cat
.
Подписываем драйвер самоподписанным сертификатом
Перейдите в каталог:
cd "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.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"
В современных версиях Windows 10 и Windows 11 при выполнении этой команды появится ошибка:
SignTool Error: No file digest algorithm specified. Please specify the digest algorithm with the /fd flag. Using /fd SHA256 is recommended and more secure than SHA1. Calling signtool with /fd sha1 is equivalent to the previous behavior. In order to select the hash algorithm used in the signing certificate's signature, use the /fd certHash option.
Нужно использовать другую команду:
signtool sign /tr http://timestamp.digicert.com /td SHA256 /v /f C:\DriverCert\myDrivers.pfx /p P@ss0wrd "C:\DriverCert\xg\xg20gr.cat"
SignTool Error: An unexpected internal error has occurred, или Error information: SignerTimeStamp() failed. (-2147012865/0x80072eff)
, попробуйте другой URL адрес сервера. Попробуйте любой из списка:
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 Number of files successfully Signed: 1
Цифровая подпись драйвера содержится в .cat файле, на который ссылается .inf файл драйвера. С помощью следующей команды можно проверить цифровую подпись драйвера в cat файле:
SignTool verify /v /pa c:\DriverCert\xg\xg20gr.cat
Также можно увидеть информацию о сертификате в свойствах CAT файла на вкладке Digital Signatures.
Если сертификат не доверенный (или не был добавлен в хранилище корневых доверенных сертификатов), то при выполнении команды SignTool verify появится ошибка:
SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
Установка драйвера, заверенного самоподписанным сертификатом
Попробуйте еще раз установить подписанный вами драйвер, выполнив команду:
Pnputil –i –a C:\DriverCert\xg20\xg20gr.inf
Successfully installed the driver on a device on the system. Driver package added successfully.
В Windows 10 и 11 появляется предупреждение о том, уверены ли вы, что хотите установить этот драйвер. Нажав 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 -a c:\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]
Драйверы Kernel-Mode и User-Mode
Напомню, что в Windows драйвер могут выполнятся либо в режиме ядра (kernel-mode), либо в режиме пользователя (user-mode). Драйверы режима ядра, подписанные таким образом не будут загружаться при загрузке Windows в режиме UEFI Secure Boot с ошибкой:
Event ID: 7000 ERROR_DRIVER_BLOCKED 1275 (0x4FB) This driver has been blocked from loading.
Проверить, включен ли режим Secure Boot можно с помощью команды:
Confirm-SecureBootUEFI
Все драйвера, режима ядра, загружаемые при включенном SecureBoot, должны быть подписаны в ходе процесса сертификации Microsoft (WHQL — Windows Hardware Quality Lab). Причина в том, что при загрузке ядра, UEFI не может проверить сертификаты в локальном хранилище Windows.
SignTool Error: Signing Cert does not chain to a Microsoft Code Verification Root.
Microsoft ввела обязательную сертификацию сторонних драйверов по программе Windows Hardware Compatibility Program начиная с Windows 10 1607.
Само подписанные драйвера режима пользователя (это обычно принтеры, сканеры, плоттеры и т.д.) будут работать даже при включенном SecureBoot.
Для kernel-mode драйверов придется отключить проверку цифровой подписи при загрузке и загружаться в тестовом режиме с помощью bcdedit.exe, как описано здесь:
bcdedit.exe /set /nointegritychecks on
bcdedit.exe /set testsigning ON