
По умолчанию все 64-разрядные версии Windows предотвращают установку драйверов устройств, не подписанных действительной цифровой подписью. Неподписанные драйверы блокируются операционной системой. Цифровая подпись гарантирует, что драйвер был выпущен надежным разработчиком или поставщиком и что его код не был изменен.
Существует несколько способов отключить проверку подписи драйверов для неподписанных драйверов в Windows (с помощью GPO, тестового режима загрузки и т. д.). Сегодня мы покажем, как подписать любой неподписанный драйвер для Windows x64 (руководство применимо для Windows 11, 10, 8.1 и 7).
Предположим, у вас есть некий неподписанный драйвер устройства (без цифровой подписи) для Windows 10 x64. В данном примере это драйвер для довольно старой видеокарты. Архив с драйверами для вашей версии Windows был скачан с сайта производителя (мне удалось найти версию видеодрайвера только для Windows Vista x64) и его содержимое было извлечено в папку c:\tools\drv1\. Давайте попробуем установить драйвер, добавив его в магазин драйверов Windows с помощью встроенной программы pnputil инструмент:
Pnputil –a c:\tools\drv1\xg20gr.inf
Во время установки драйвера Windows 7 выдает предупреждение о том, что операционная система не может проверить цифровую подпись этого драйвера:
Windows can’t verify the publisher of this driver software.
В Windows 10 (21H2) это предупреждение не появляется, но в консоли возникает ошибка:
Processing inf: xg20gr.inf Adding the driver package failed: The third-party INF does not contain digital signature information.
Если щелкнуть правой кнопкой мыши файл драйвера inf и выбрать Установить при установке драйвера из File Explorer возникает ошибка:
The third-party INF does not contain digital signature information.
Попробуем подписать этот драйвер самоподписным сертификатом.
Чтобы сгенерировать подпись и подписать драйвер, необходимо загрузить и установить следующие средства разработки приложений для Windows:
- Windows SDK (Software Development Kit) или Microsoft Visual Studio 2005+ для вашей версии Windows. Установите Средства подписи Windows SDK для настольных приложений пакет, который содержит
signtool.exe
; - Комплект драйверов Windows (WDK) – https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk
Создание самоподписанного сертификата драйвера
Создайте папку C:\DriverCert в корне системного диска.
Для создания сертификата подписи кода можно использовать команду New-SelfSifgnedCertificate PowerShell. В этом примере мы создадим самоподписанный сертификат со сроком действия 3 года.
$todaydate = Get-Date
$add3year = $todaydate.AddYears(3)
$cert = New-SelfSignedCertificate -Subject "WOSHUB” -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
Поскольку созданный нами сертификат является самоподписанным, Windows не доверяет ему по умолчанию. Когда вы проверяете хранилище сертификатов с помощью утилиты Sigcheck, этот сертификат будет отображаться как недоверенный, поскольку он отсутствует в списке доверенных корневых сертификатов Microsoft (этот список необходимо периодически обновлять).
Теперь необходимо добавить сертификат в хранилище доверенных корневых сертификатов и в список доверенных сертификатов издателя:
$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
В предыдущих версиях Windows вы должны использовать функцию makecert.exe
инструмент из набора средств разработки Windows (SDK) для создания самоподписанных сертификатов. В этом случае команды для создания сертификата будут выглядеть следующим образом:
cd “C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\bin”
Создайте самоподписанный сертификат и закрытый ключ, выпущенные, например, для компании WinOSHub:
makecert -r -sv C:\DriverCert\myDrivers.pvk -n CN="WinOSHub" C:\DriverCert\myDrivers.cer
Во время создания сертификата инструмент предложит вам указать пароль для ключа. Пусть это будет P@ss0wrd.
Создайте открытый ключ для сертификата издателя (PKSC), который мы создали ранее:
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
Вы можете централизованно развернуть этот сертификат на клиентских компьютерах с помощью групповой политики в домене AD.
Откройте оснастку управления локальными сертификатами машины (certlm.msc
) и убедитесь, что ваш сертификат находится в списках доверенных издателей и доверенных корневых центров сертификации.
Создание файла каталога (CAT) для подписи пакета драйверов
Создайте каталог C:\DriverCert\xg20 и скопируйте все файлы из папки, в которую первоначально был извлечен драйвер из архива (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-файла сгенерируйте CAT-файл (содержит информацию обо всех файлах пакета драйверов). Адрес inf2cat.exe инструмент (из набора драйверов Windows Driver Kit, WDK) позволяет сгенерировать CAT-файл для вашей платформы:
inf2cat.exe /driver:"C:\DriverCert\xg20" /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
Чтобы исправить ошибку, найдите строку с DriverVer = в файле inf [Version]
и замените ее на:
DriverVer=05/01/2009,9.9.9.9
Если вы получите ошибку Missing AMD64 CatalogFile entry
(для x64) или Missing 32-bit CatalogFile entry
, затем добавьте строку CatalogFile=xg20gr.cat в файл [Version] в раздел .inf-файла.
Подписание пакета драйвера с помощью самоподписного сертификата
Перейдите в следующую папку:
cd "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x64"
Подпишите пакет драйверов (набор файлов) с помощью созданного ранее сертификата, используя Verisign в качестве службы временной метки. Следующая команда подпишет файл CAT цифровой подписью с помощью сертификата, хранящегося в защищенном паролем файле .pfx:
signtool sign /f C:\DriverCert\myDrivers.pfx /p P@ss0wrd /t http://timestamp.verisign.com/scripts/timstamp.dll /v C:\DriverCert\xg20\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.comodoca.com/authenticode http://timestamp.globalsign.com/scripts/timstamp.dll http://timestamp.verisign.com/scripts/timstamp.dll http://tsa.starfieldtech.com http://www.startssl.com/timestamp
Если 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
Информацию о сертификате можно также посмотреть в свойствах файла CAT на странице Цифровые подписи табл.
Если сертификат не является доверенным (или не был добавлен в хранилище доверенных корневых сертификатов), то при выполнении команды SignTool verify
команды:
SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
Установка самоподписанного драйвера в Windows
Попробуйте установить подписанный нами драйвер еще раз, используя команду:
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 появляется следующее предупреждение:
Would you like to install this device software?
Нажмите “Установить” для установки пакета драйверов в Windows.
Если по какой-то причине драйвер не устанавливается, подробный журнал установки драйвера содержится в файле C:\Windows\inf\setupapi.dev.log. Этот файл журнала позволяет получить дополнительную информацию об ошибках при установке драйвера. В большинстве случаев в нем присутствует символ “Пакет драйвера не прошел проверку подписи” ошибка. Скорее всего, это означает, что сертификат драйвера не добавлен в хранилище доверенных сертификатов.
Если установка драйвера прошла успешно, в журнале появится сообщение setupapi.dev.log
файл должен содержать следующие строки:
>>> [Device Install (DiInstallDriver) - C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd64_c5955181214aa12b\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_c5955181214aa12b\xg20gr.inf inf: {SetupCopyOEMInf: C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd64_c5955181214aa12b\xg20gr.inf} 13:23:37.046 inf: Copy style: 0x00000000 inf: Driver Store Path: C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd64_c5955181214aa12b\xg20gr.inf inf: Published Inf Path: C:\WINDOWS\INF\oem23.inf inf: {SetupCopyOEMInf exit (0x00000000)} 13:23:37.077 <<< Section end 2018/07/22 13:23:37.155 <<< [Exit status: SUCCESS]
Драйверы пользовательского режима и режима ядра в Windows
Напомню, что в Windows драйвер может выполняться как в режиме ядра, так и в пользовательском режиме. Подписанные таким образом драйверы режима ядра не будут загружаться при загрузке Windows на устройстве UEFI с включенной Secure Boot с ошибкой:
Event ID: 7000 ERROR_DRIVER_BLOCKED 1275 (0x4FB) This driver has been blocked from loading.
Проверить, включен ли режим Secure Boot, можно с помощью команды PowerShell:
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.
Для драйверов режима ядра необходимо отключить проверку цифровой подписи и загрузить Windows в тестовом режиме с помощью команды bcdedit.exe:
bcdedit.exe /set /nointegritychecks on
bcdedit.exe /set testsigning ON