Как подписать неподписанный драйвер устройства в Windows

По умолчанию все 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.

win7 x64 установка неподписанного драйвера

В Windows 10 (21H2) это предупреждение не появляется, но в консоли возникает ошибка:

Processing inf: xg20gr.inf
Adding the driver package failed: The third-party INF does not contain digital signature information.

Добавление пакета драйверов не удалось: Сторонний INF не содержит информации о цифровой подписи.

Если щелкнуть правой кнопкой мыши файл драйвера inf и выбрать Установить при установке драйвера из File Explorer возникает ошибка:

установка драйвера из inf-файла

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

INF-файл стороннего производителя не содержит информации о цифровой подписи.

Попробуем подписать этот драйвер самоподписным сертификатом.

Чтобы сгенерировать подпись и подписать драйвер, необходимо загрузить и установить следующие средства разработки приложений для Windows:

  • Windows SDK (Software Development Kit) или Microsoft Visual Studio 2005+ для вашей версии Windows. Установите Средства подписи Windows SDK для настольных приложений пакет, который содержит signtool.exe;установка средств подписания windows sdk
  • Комплект драйверов Windows (WDK)https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk
Совет. Перед установкой этих инструментов убедитесь, что на вашем компьютере установлен .NET Framework 4.

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

Создайте папку 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

New-SelfSignedCertificate создание сертификата с помощью powershell

Поскольку созданный нами сертификат является самоподписанным, 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) и убедитесь, что ваш сертификат находится в списках доверенных издателей и доверенных корневых центров сертификации.

самоподписанный сертификат в доверенных корневых центрах

Примечание. Несмотря на то, что сертификат имеет ограниченный срок действия, истечение срока действия сертификата CodeSigning означает, что вы не можете создавать новые подписи. Срок действия драйвера, уже подписанного этим сертификатом, неограничен (или старые подписи действительны в течение указанного срока).

Создание файла каталога (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

inf2cat генерация cat-файла драйвера

Чтобы убедиться, что процедура была выполнена правильно, проверьте, что файл C:\DriverCert\xg\xg20gr.cat появился в целевом каталоге, и в журнале появились сообщения:

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

22.9.7: В inf-файле установлена неверная дата DriverVer (для новейшей ОС она должна быть устаревшей до 4/21/2009)

Чтобы исправить ошибку, найдите строку с DriverVer = в файле inf [Version] и замените ее на:

DriverVer=05/01/2009,9.9.9.9

inf-файл: 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 sign: подписание файла driver 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

SignTool проверить цифровую подпись файла cat

Информацию о сертификате можно также посмотреть в свойствах файла CAT на странице Цифровые подписи табл.

цифровая подпись кошачьего файла

Если сертификат не является доверенным (или не был добавлен в хранилище доверенных корневых сертификатов), то при выполнении команды SignTool verify команды:

SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
CAT-файл содержит цифровые подписи (отпечатки пальцев) всех файлов, находящихся в каталоге драйвера (файлы, перечисленные в INF-файле в разделе CopyFiles раздел). Если какой-либо из этих файлов был изменен, то контрольная сумма этих файлов не будет соответствовать данным в файле CAT, и в результате установка такого драйвера будет неудачной.

Установка самоподписанного драйвера в Windows

Попробуйте установить подписанный нами драйвер еще раз, используя команду:

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

Теперь вы не увидите предупреждения об отсутствии цифровой подписи драйвера.

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

pnputil install selfsigned device driver

В Windows 10 и 11 появляется следующее предупреждение:

Would you like to install this device software?

Нажмите “Установить” для установки пакета драйверов в Windows.

установка самоподписанного драйвера в Windows

Если по какой-то причине драйвер не устанавливается, подробный журнал установки драйвера содержится в файле C:\Windows\inf\setupapi.dev.log. Этот файл журнала позволяет получить дополнительную информацию об ошибках при установке драйвера. В большинстве случаев в нем присутствует символ “Пакет драйвера не прошел проверку подписи” ошибка. Скорее всего, это означает, что сертификат драйвера не добавлен в хранилище доверенных сертификатов.

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.

драйвер eventid 7000 заблокирован от загрузки

Проверить, включен ли режим Secure Boot, можно с помощью команды PowerShell:
Confirm-SecureBootUEFI

проверка загрузки windows uefi с помощью 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *