Signtool error a certificate chain processed but terminated in a root

I am signing an exe from a machine using a cer file. Then when I validate the EXE using the signtool.exe from the same machine, it succeeds. But when I try to validate it using the same .cer instal...

I am signing an exe from a machine using a cer file. Then when I validate the EXE using the signtool.exe from the same machine, it succeeds. But when I try to validate it using the same .cer installed in another machine it fails with the following error.

SignTool Error: A certificate chain processed, but terminated in a root
certificate which is not trusted by the trust provider.

Number of errors: 1

In this other machine in which I’m trying to validate, the .cer file has been installed into the Trusted Root certificates set. But still why I am getting this error? any help would be much appreciated.

Below is how I sign the file.

makecert.exe -r -pe -ss ROOT -sky exchange -n CN=InstallerCert KubeInstallerSign.cer

asked Jun 28, 2016 at 0:07

AnOldSoul's user avatar

AnOldSoulAnOldSoul

1511 silver badge4 bronze badges

A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.

This message means that you signed the binary successfully and signtool could process the entire certificate chain, but the root certificate isn’t trusted by the machine.

What this means, on a higher level, is that signtool knows it was signed but it doesn’t know who signed it, and so it’s not a very useful signature. If you’re using a self-signed certificate, you can fix this by copying your certificate to the target machine and installing it there; a better solution if you want your users to trust you is to buy a code signing certificate from a reputable certification authority and sign your code using that.

Either way, this will mean that the target machine will now know who signed it and be able to verify that the signature is valid.

answered Dec 13, 2016 at 22:16

demize's user avatar

demizedemize

2551 silver badge10 bronze badges

This is because of the verify command used, signtool verify myfile.exe. When this command is used signtool will use the Windows Driver Verification Policy. In order for the file to verify properly include the /pa switch so that SignTool uses the Default Authentication Verification Policy.

use this command:

signtool verify /pa myfile.exe

schroeder's user avatar

schroeder

125k55 gold badges289 silver badges324 bronze badges

answered Jul 27, 2020 at 7:16

Rafael Bugalho Lima's user avatar

When you generated your signing key, you probably generated two key pairs (and certificates): a CA (certificate authority) key pair (which got installed in the machine’s trust store), and a «leaf» key pair whose certificate is «issued» by the CA. You sign with the leaf cert, but you don’t inherently trust it; you instead trust its issuer, the CA cert. You need to install the CA cert — not the leaf cert — in the trust store of any system that will try to verify the signature.

answered Jul 27, 2020 at 7:55

CBHacking's user avatar

CBHackingCBHacking

42.2k3 gold badges75 silver badges107 bronze badges

  • Remove From My Forums
  • Question

  • I used DesktopAppConvert.exe to convert my installer and got the MyApp.appx in the output folder. When I tried to install the MyApp.appx it asked me to sign the .appx with a certificate so I followed these steps from here «https://msdn.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-signing».

    But after that I still get this error.

    «Either you need a new certificate installed for this app package, or you need a new app package with trusted certificates. Your system administrator or the app developer can help. A certificate chain processed, but terminated in a root certificate
    which isn’t trusted (0x800B0109)»

    Tried repacking with MakeAppx.exe and it would still give me the same error.

    • Edited by

      Tuesday, September 13, 2016 6:56 PM

Answers

  • Hi Arthur,

    If you submit the app to the store, customers downloading it from the store will automatically also download the framework package.

    If you want your customers to sideload the app, then yes, they’ll first have to install the framework package.

    Thanks,
    Stacey Doerr
    Dev Lead, Desktop App Converter

    • Marked as answer by
      Wu Arthur
      Tuesday, September 20, 2016 5:04 PM

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

В Windows x64 вы можете отключить проверку цифровой подписи устанавливаемого драйвера: с помощью групповой политики или тестового режима загрузки системы (подробнее все способы описаны в статье Отключаем проверку цифровой подписи для установки неподписанных драйверов в Windows).

Сегодня мы покажем, как можно самостоятельно подписать любой неподписанный драйвер для x64 битной версии Windows (инструкция применима для Windows 11, 10, 8.1 и 7).

Содержание:

  • Создаем самоподписанный сертификат драйвера
  • Генерируем CAT файл драйвера
  • Подписываем драйвер самоподписанным сертификатом
  • Установка драйвера, заверенного самоподписанным сертификатом
  • Драйверы Kernel-Mode и User-Mode

Предположим, что у нас имеется драйвер некого устройства для x64 Windows 10, у которого отсутствует цифровая подпись (в нашем примере это будет драйвер для довольно старого графического адаптера видеокарты). Я скачал архив с драйверами для Windows с сайта производителя (мне удалось найти драйвер только для Windows Vista x64). Архив с драйвером я распаковал в каталог c:toolsdrv1. Попробуем установить драйвер, добавив его в хранилище драйверов Windows с помощью стандартной утилиты pnputil.

Pnputil –a "C:toolsdrv1xg20gr.inf"

Примечание. Эта и все последующие команды выполняются в командной строке, запущенной с правами администратора.

При установке драйвера в Windows 7 появляется предупреждение о том, что ОС не может проверить цифровую подпись драйвера.

Windows 7 ошибка при установе драйвера без цифровой подписи

В Windows 10 (21H1) появляется предупреждение:

Не удалось добавить пакет драйвера: INF стороннего производителя не содержит информации о подписи.
Adding the driver package failed : The third-party INF does not contain digital signature information.

Не удалось добавить пакет драйвера: INF стороннего производителя не содержит информации о подписи

Такая же ошибка появляется при установке драйвера из проводника Windows (щелкните ПКМ по inf файлу драйвера и выберите Install / Установить):

Установить драйвер из inf файла

The third-party INF does not contain digital signature information.
INF стороннего производителя не содержит информации о подписи.

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

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

Для работы нужно скачать и установить следующие инструменты разработчика приложений для вашей версии Windows.

  • Windows SDK (или Microsoft Visual Studio 2005 или выше) для вашей версии Windows. В состав этих пакетов входит Windows SDK Signing tools for Desktop, в которую включена необходимая нам утилита —
    signtool.exe
    ;установка windows wdk signing tool
  • Windows Driver Kit (WDK) — https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk

Совет. Перед установкой этих инструментов, проверьте, что в Windows установлен .NET Framework 4.

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

Создайте в корне диска каталог
C:DriverCert
.

Для создания самоподписанного сертификата типа Code Signing можно использовать PowerShell командлет New-SelfSifgnedCertificate. В этом примере мы создадим самоподписанный сертификат со сроком действия 3 года.

$todaydate = Get-Date
$add3year = $todaydate.AddYears(3)
$cert = New-SelfSignedCertificate -Subject "Winitpro” -Type CodeSigningCert -CertStoreLocation cert:LocalMachineMy -notafter $add3year

Затем нужно экспортировать данный сертификат в pfx файл с паролем:

$CertPassword = ConvertTo-SecureString -String “[email protected]” -Force –AsPlainText
Export-PfxCertificate -Cert $cert -FilePath C:DriverCertmyDrivers.pfx -Password $CertPassword

powershell создать сертфикат типа code signing для подписи драйвера

Теперь нужно добавить сертификат в доверенные корневые сертификаты и в сертификаты доверенных издателей:

$certFile = Export-Certificate -Cert $cert -FilePath C:DriverCertdrivecert.cer
Import-Certificate -CertStoreLocation Cert:LocalMachineAuthRoot -FilePath $certFile.FullName
Import-Certificate -CertStoreLocation Cert:LocalMachineTrustedPublisher -FilePath $certFile.FullName

В предыдущих версиях Windows для создания сапомодписанных сертификатов нужно использовать утилиту makecert.exe из Windows Software Development Kit (SDK). В этом случае команды для создания сертификата будут выглядеть так:

cd “C:Program Files (x86)Microsoft SDKsWindowsv7.1bin”
makecert -r -sv C:DriverCertmyDrivers.pvk -n CN="Winitpro" C:DriverCertMyDrivers.cer

Укажите пароль для ключа (например,
[email protected]
).

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

cert2spc C:DriverCertmyDrivers.cer C:DriverCertmyDrivers.spc

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

pvk2pfx -pvk C:DriverCertmyDrivers.pvk -pi [email protected] -spc C:DriverCertmyDrivers.spc -pfx C:DriverCertmyDrivers.pfx -po [email protected]

Добавьте сертификат в доверенные:

certmgr.exe -add C:DriverCertmyDrivers.cer -s -r localMachine ROOT
certmgr.exe -add C:DriverCertmyDrivers.cer -s -r localMachine TRUSTEDPUBLISHER

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

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

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

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

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

Создайте каталог C:DriverCertxg и скопируйте в него все файлы из каталога, в который первоначально был распакован архив с драйвером (c:toolsdrv1). Убедить что среди файлов имеются файлы с расширением .sys и .inf (в нашем случае xg20grp.sys и xg20gr.inf).

md C:DriverCertxg
xcopy c:toolsdrv1 C:DriverCertxg /i /c /k /e /r /y

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

cd “C:Program Files (x86)Windows Kits10bin10.0.22000.0x86”

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

inf2cat.exe /driver:"C:DriverCertxg" /os:7_X64 /verbose

Генерируем cat файл драйвера на основе inf файла

Чтобы убедитесь, что процедура прошла корректно, проверьте, что в каталоге появился файл C:DriverCertxgxg20gr.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

DriverVer set to incorrect date (must be postdated to 4/21/2009 for newest OS)

Для исправления ошибки нужно в секции [Version] найти строку с DriverVer= и заменить ее на:

DriverVer=05/01/2009,9.9.9.9

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 Kits10bin10.0.22000.0x64"

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

signtool sign /f C:DriverCertmyDrivers.pfx /p [email protected] /t http://timestamp.globalsign.com/scripts/timstamp.dll /v "C:DriverCertxgxg20gr.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:DriverCertmyDrivers.pfx /p [email protected] "C:DriverCertxgxg20gr.cat"

sigtool подписать 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:DriverCertxgxg20gr.cat
Number of files successfully Signed: 1

Цифровая подпись драйвера содержится в .cat файле, на который ссылается .inf файл драйвера. С помощью следующей команды можно проверить цифровую подпись драйвера в cat файле:

SignTool verify /v /pa c:DriverCertxgxg20gr.cat

SignTool verify - проверить cat файл

Также можно увидеть информацию о сертификате в свойствах CAT файла на вкладке Digital Signatures.

показать сертфикат cat файла

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

SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.

CAT файл содержит цифровые подписи (отпечатки / thumbprints) всех файлов, которые находятся в каталоге драйвера (файлов, которые указаны в INF файле в секции CopyFiles). Если любой из этих файлов был изменен, то контрольная сумма файлов не будет совпадать с данными в CAT файле, в результате установка такого драйвера закончится ошибкой.

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

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

Pnputil –i –a C:DriverCertxg20xg20gr.inf

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

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

В Windows 10 и 11 появляется предупреждение о том, уверены ли вы, что хотите установить этот драйвер. Нажав Install, вы установите драйвер в системе.

Если по каким-то причинам драйвер не устанавливается, подробный лог установки драйвера содержится в файле C:Windowsinfsetupapi.dev.log. Этот лог позволит вам получить более подробную информацию об ошибке установки. В большинстве случаев возникает ошибка
Driver package failed signature validation
. Скорее всего это означает, что сертификат драйвера не добавлен в доверенные сертификаты.

setupapi.dev.log

Если установка драйвера прошла успешно, в файле setupapi.dev.log будут примерно такие строки:

>>>  [Device Install (DiInstallDriver) - C:WINDOWSSystem32DriverStoreFileRepositoryxg20gr.inf_amd64_c5955181485ee80axg20gr.inf]
>>>  Section start 2018/07/22 23:32:57.015
cmd: Pnputil  -i -a c:DriverCertxgxg20gr.inf
ndv: Flags: 0x00000000
ndv: INF path: C:WINDOWSSystem32DriverStoreFileRepositoryxg20gr.inf_amd64_c5955181485ee80axg20gr.inf
inf: {SetupCopyOEMInf: C:WINDOWSSystem32DriverStoreFileRepositoryxg20gr.inf_amd64_c5955181485ee80axg20gr.inf} 23:32:57.046
inf:      Copy style: 0x00000000
inf:      Driver Store Path: C:WINDOWSSystem32DriverStoreFileRepositoryxg20gr.inf_amd64_c5955181485ee80axg20gr.inf
inf:      Published Inf Path: C:WINDOWSINFoem23.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.

ошибка 7000 при загрузк драйвера. windows заблокировала драйвер

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

Confirm-SecureBootUEFI

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

Contents

  • 1 Missing or incorrect Trusted Publishers/Certificates
  • 2 Extract certificate from .cat file
  • 3 Install certificate into cert store
  • 4 Remove certificate after install
  • 5 Installing Remotely
  • 6 Updates
    • 6.1 Epson 4490
    • 6.2 ARM mbed Windows serial port driver
  • 7 Comments

Missing or incorrect Trusted Publishers/Certificates

In this example — installing drivers for an Epson 3170 scanner that has a broken certificate chain. This will stop you being able to install from command line without fixing.

The error will manifest itself like this if installing directly

devcon Windows Security — «Would you like to install this device software» — tick box «Always trust software from»

Missing or incorrect Trusted Publishers Certificates.png

or with the dpinst error in c:WINDOWSDPINST.log if doing command line with dpinst.exe

dpinst RETURN: DriverPackagePreinstallW (0xE0000242)

e.g.

INFO:   Found driver package: 'E:epson 3170LIBc0aEs32n.inf'.
INFO:   Found driver package: 'E:epson 3170LIBc0aEs52.inf'.
INFO:   Preinstalling 'e:epson 3170es32.inf' ...
INFO:   ENTER:  DriverPackagePreinstallW
INFO:   RETURN: DriverPackagePreinstallW  (0xE0000242)
INFO:   Preinstalling 'e:epson 3170es43.inf' ...
INFO:   ENTER:  DriverPackagePreinstallW
INFO:   RETURN: DriverPackagePreinstallW  (0xE0000242)

To test what’s actually broken, you can use «signtool.exe /verify»,

First one fails (as in this example) and second one is correct from an Epson V300 scanner driver.

E:>"E:7600.DDKsigntool.exe" verify /a "e:Epson 3170es43.cat"
SignTool Error: A certificate chain processed, but terminated in a root
        certificate which is not trusted by the trust provider.

Number of errors: 1

E:>"E:7600.DDKsigntool.exe" verify /a "e:epson v300es8b.cat"
Successfully verified: e:epson v300es8b.cat

(yes, Epson can’t sign their drivers properly!)

Right click on the(any) .cat file in the driver package, in this case es3e.cat > Digital Signatures > Highlight the name in ‘Name of Signer’ on the ‘Signatures List’ > Details.

A new window ‘Digital Signature Details’ should open. > View certificate > ‘Details’ tab > ‘Copy to File’ > Next > (leave default X.509 DER encoded .CER) Next > File name, choose one, e.g «epson.cer» > Next > Finish.

Certificate export from driver catalogue file.cat.png

(If anyone knows how to do this via command line please let me know as I couldn’t find a way)

Install certificate into cert store

Import the DER encoded .CER certificate file «epson.cer» you just extracted to BOTH the ROOT(Trusted Root Certification Authority) and Trusted Publishers stores using certmgr.exe of the machine you wish to install the driver on.

C:WinDDK7600.16385.1binamd64CertMgr.exe -add "E:epson 3170epson.cer" -c -s -r localMachine TrustedPublisher
C:WinDDK7600.16385.1binamd64CertMgr.exe -add "E:epson 3170epson.cer" -c -s -r localMachine ROOT

If you then rerun dpinst.exe you should now see it correctly installs in c:WINDOWSDPINST.log, here is a sample.

INFO:   Found driver package: 'e:epson 3170Es43.inf'.
INFO:   Found driver package: 'e:epson 3170Es52.inf'.
INFO:   Preinstalling 'e:epson 3170es27.inf' ...
INFO:   ENTER:  DriverPackagePreinstallW
SUCCESS:e:epson 3170es27.inf is preinstalled.
INFO:   RETURN: DriverPackagePreinstallW  (0x0)
INFO:   ENTER:  DriverPackageGetPathW
INFO:   RETURN: DriverPackageGetPathW  (0x0)
INFO:   Preinstalling 'e:epson 3170es32.inf' ...
INFO:   ENTER:  DriverPackagePreinstallW
SUCCESS:e:epson 3170es32.inf is preinstalled.

Remove certificate after install

If you wish to tidy the PC up back to its initial state certificate wise you can remove them like this after the driver is (pre)installed.

  • Note, MUST change the name option (-n) to match the ‘Name of Signer’
CertMgr.exe -del -n "SEIKO EPSON Corporation" -c -s -r localMachine TrustedPublisher
CertMgr.exe -del -n "SEIKO EPSON Corporation" -c -s -r localMachine ROOT

Installing Remotely

This call all be done automatically and remotely using psexec once the certificate (.cer) is extracted from the .cat.

You WILL need to change ALL occurances of two things (the name of the certificate file and ‘Name on Certificate’) in the .bat file with the link above example.

  • richud.com.cer to epson.cer (or whatever you called your cert when saved it out)
  • -n richud.com to -n «SEIKO EPSON Corporation» (or whatever the ‘Name on Certificate’ is for the cert)

Updates

Epson 4490

The Epson 4490 scanner driver (epson13552.exe) suffers a similar issue (Win7 64bit only tried) and is fixed in the same way. Note you will need to extract the cert from the cat file again.

  • Note , the certificates aren’t interchangable between driver packages and you will need to extract from the specific driver bundles specific cat file(s).

ARM mbed Windows serial port driver

mbedWinSerial_16466.exe Driver here

To be able to silently install the ARM mbed driver, follow the same procedure as with the Epson top.

blog comments powered by

By default, all 64-bit Windows versions prevent the installation of devices drivers that are not signed with a valid digital signature. Unsigned drivers are blocked by the operating system. A digital signature ensures that the driver has been released by a trusted developer or vendor, and its code hasn’t been modified.

There are several ways to disable driver signature verification for the unsigned drivers in Windows (using a GPO, a test boot mode, etc). Today we’ll show how to sign any unsigned driver for Windows x64 (the guide is applicable for Windows 11, 10, 8.1, and 7).

Contents:

  • Create a Self-Signed Driver Certificate
  • Creating a Catalog File (CAT) for Signing a Driver Package
  • Signing the Driver Package with a Self-Signed Certificate
  • Installing a Self-Signed Driver on Windows
  • User-Mode and Kernel-Mode Drivers in Windows

Suppose you have a certain unsigned device driver (without digital signature) for Windows 10 x64. In this example, it is the driver for a quite old graphics card. The archive with drivers for your Windows version has been downloaded from the vendor’s website (I was able to find the video driver version only for Windows Vista x64) and its contents have been extracted to the c:toolsdrv1. Let’s try to install the driver by adding it to the Windows driver store with a built-in pnputil tool:
Pnputil –a c:toolsdrv1xg20gr.inf

Note. This command and all the next ones must be run in the command prompt as an administrator.

During driver installation, Windows 7 displays a warning that the operating system can’t verify the digital signature of this driver:

Windows can’t verify the publisher of this driver software.

win7 x64 install unsigned driver

In Windows 10 (21H2) this warning doesn’t appear, but an error appears in the console:

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

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

If you right-click on the inf driver file and select Install when installing a driver from File Explorer, you receive an error:

installing driver from the inf file

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

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

Let’s try to sign this driver with a self-signed certificate.

To generate a signature and sign the driver, you need to download and install the following Windows application development tools:

  • Windows SDK (Software Development Kit) or Microsoft Visual Studio 2005+ for your Windows version. Install the Windows SDK Signing tools for Desktop package which contains the signtool.exe;install windows sdk signing tools
  • Windows Driver Kit (WDK) — https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk

Create a Self-Signed Driver Certificate

Create a C:DriverCert folder at the root of the system drive.

You can use the New-SelfSifgnedCertificate PowerShell cmdlet to create a code signing certificate. In this example, we will create a self-signed certificate with a validity period of 3 years.

$todaydate = Get-Date
$add3year = $todaydate.AddYears(3)
$cert = New-SelfSignedCertificate -Subject "WOSHUB” -Type CodeSigningCert -CertStoreLocation cert:LocalMachineMy -notafter $add3year

Then you need to export this certificate to a pfx file with a password:

$CertPassword = ConvertTo-SecureString -String “P@ss0wrd” -Force –AsPlainText
Export-PfxCertificate -Cert $cert -FilePath C:DriverCertmyDrivers.pfx -Password $CertPassword

New-SelfSignedCertificate create cert using powershell

Since the certificate we created is self-signed, Windows doesn’t trust it by default. When you check the certificate store with the Sigcheck utility, this certificate will be displayed as untrusted, because it is not listed in the list of Microsoft Trusted Root Certificates (this list needs to be updated periodically).

Now you need to add the certificate to the Trusted Root store and to the Trusted Publisher certificates:

$certFile = Export-Certificate -Cert $cert -FilePath C:DriverCertdrivecert.cer
Import-Certificate -CertStoreLocation Cert:LocalMachineAuthRoot -FilePath $certFile.FullName
Import-Certificate -CertStoreLocation Cert:LocalMachineTrustedPublisher -FilePath $certFile.FullName

In previous versions of Windows, you must use the makecert.exe tool from the Windows Software Development Kit (SDK) to generate self-signed certificates. In this case, the commands to create a certificate will look like this:

cd “C:Program Files (x86)Microsoft SDKsWindowsv7.1bin”

Create a self-signed certificate and private key, that is issued, for example, for the company WinOSHub:

makecert -r -sv C:DriverCertmyDrivers.pvk -n CN="WinOSHub" C:DriverCertmyDrivers.cer

During the creation of the certificate, the tool will prompt you to specify a password for the key. Let it be P@ss0wrd.

Create a public key for a publisher certificate (PKSC) we have created earlier:

cert2spc C:DriverCertmyDrivers.cer C:DriverCertmyDrivers.spc

Combine the public key (.spc) and the private key (.pvk) in a single certificate file with format Personal Information Exchange (.pfx):

pvk2pfx -pvk C:DriverCertmyDrivers.pvk -pi P@ss0wrd -spc C:DriverCertmyDrivers.spc -pfx C:DriverCertmyDrivers.pfx -po P@ss0wrd

Add the certificate to trusted:

certmgr.exe -add C:DriverCertmyDrivers.cer -s -r localMachine ROOT
certmgr.exe -add C:DriverCertmyDrivers.cer -s -r localMachine TRUSTEDPUBLISHER

You can centrally deploy this certificate to client computers using Group Policy in an AD domain.

Open the machine’s local certificate management snap-in (certlm.msc) and verify that your certificate is in the Trusted Publishers and Trusted Root Certification Authorities.

self signed cert in trusted root authorities

Note. Even though the certificate has a limited validity period, the expiration of the CodeSigning certificate means that you can’t create new signatures. The validity of the driver already signed by this certificate is unlimited (or old signatures are valid during the specified timestamp).

Creating a Catalog File (CAT) for Signing a Driver Package

Create the directory C:DriverCertxg20 and copy all files from the folder into which the driver from the archive has been originally extracted (c:toolsdrv1). Make sure that there are files with the extensions .sys and .inf among these files (in our case, they are xg20grp.sys and xg20gr.inf).

md C:DriverCertxg
xcopy c:toolsdrv1 C:DriverCertxg /i /c /k /e /r /y

Go to the directory:

cd “C:Program Files (x86)Windows Kits10bin10.0.22000.0x86”

Generate a CAT file (contains information about all the files in the driver package) on the base of the INF file. The inf2cat.exe tool (from the Windows Driver Kit, WDK) allows you to generate a CAT file for your platform:

inf2cat.exe /driver:"C:DriverCertxg20" /os:7_X64 /verbose

inf2cat generating driver cat file

To make sure that the procedure was correct, check that the file C:DriverCertxgxg20gr.cat has appeared in the target directory, and there are messages in the log:

Signability test complete.

and

Catalog generation complete.

Note. In my case the command Inf2Cat.exe returned an error:

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: DriverVer set to incorrect date (must be postdated to 4/21/2009 for newest OS) in inf file

To fix the error, find the line with DriverVer = in the [Version] section and replace it with:

DriverVer=05/01/2009,9.9.9.9

inf file: DriverVer=05/01/2009,9.9.9.9

If you get an error Missing AMD64 CatalogFile entry (for x64) or Missing 32-bit CatalogFile entry, then add the line CatalogFile=xg20gr.cat to the [Version] section of the .inf file.

Signing the Driver Package with a Self-Signed Certificate

Go to the following folder:

cd "C:Program Files (x86)Windows Kits10bin10.0.22000.0x64"

Sign the driver package (set of files) with the certificate you have created earlier using Verisign as a timestamp service. The following command will sign the CAT file with a digital signature using a certificate stored in a password-protected .pfx file:

signtool sign /f C:DriverCertmyDrivers.pfx /p P@ss0wrd /t http://timestamp.verisign.com/scripts/timstamp.dll /v C:DriverCertxg20xg20gr.cat

On modern versions of Windows 10 and Windows 11, running this command will result in an error:

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.

You need to use another command:

signtool sign /tr http://timestamp.digicert.com /td SHA256 /v /f C:DriverCertmyDrivers.pfx /p P@ss0wrd "C:DriverCertxgxg20gr.cat"

signtool sign command: signing driver cat file with cert

If the command returns an error SignTool Error: An unexpected internal error has occurred, or Error information: SignerTimeStamp() failed. (-2147012865/0x80072eff), try a different timestamp server URL. Try any of the list:

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

If the CAT file is signed successfully, the following message should appear:

Successfully signed: C:DriverCertxgxg20gr.cat
Number of files successfully Signed: 1

The driver’s digital signature is contained in the .cat file referenced in the .inf file. You can check the digital signature of the driver in the cat file using the following command:

SignTool verify /v /pa c:DriverCertxgxg20gr.cat

SignTool verify cat file digital signature

You can also see information about the certificate in the properties of the CAT file on the Digital Signatures tab.

cat file digital signature

If the certificate is not trusted (or has not been added to the Trusted Root Certificate Store), then an error will appear when running the SignTool verify command:

SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.

The CAT file contains digital signatures (thumbprints) of all the files that are in the driver directory (files listed in the INF file in the CopyFiles section). If any of these files have been changed, then the checksum of the files will not match the data in the CAT file, and, as a result, the installation of such a driver will fail.

Installing a Self-Signed Driver on Windows

Try to install the driver we have signed again using the command:

Pnputil –i –a C:DriverCertxg20xg20gr.inf

Now you won’t see the warning about the missing digital signature of the driver.

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

pnputil install selfsigned device driver

The following warning appears in Windows 10 and 11:

Would you like to install this device software?

Click “Install” to install the driver package on Windows.

install self signed driver on windows

If for some reason the driver is not installed, a detailed driver installation log is contained in the file C:Windowsinfsetupapi.dev.log. This log file allows you to get more information about the driver installation errors. In most cases, there is a “Driver package failed signature validation” error. Most likely this means that the driver’s certificate is not added to the trusted certificates store.

setupapi.dev.log

If the driver installation was successful, the setupapi.dev.log file should contain the following lines:

>>>  [Device Install (DiInstallDriver) - C:WINDOWSSystem32DriverStoreFileRepositoryxg20gr.inf_amd64_c5955181214aa12bxg20gr.inf]
>>>  Section start 2018/07/22 23:32:57.015
cmd: Pnputil  -i -a c:DriverCertxgxg20gr.inf
ndv: Flags: 0x00000000
ndv: INF path: C:WINDOWSSystem32DriverStoreFileRepositoryxg20gr.inf_amd64_c5955181214aa12bxg20gr.inf
inf: {SetupCopyOEMInf: C:WINDOWSSystem32DriverStoreFileRepositoryxg20gr.inf_amd64_c5955181214aa12bxg20gr.inf} 13:23:37.046
inf:      Copy style: 0x00000000
inf:      Driver Store Path: C:WINDOWSSystem32DriverStoreFileRepositoryxg20gr.inf_amd64_c5955181214aa12bxg20gr.inf
inf:      Published Inf Path: C:WINDOWSINFoem23.inf
inf: {SetupCopyOEMInf exit (0x00000000)} 13:23:37.077
<<<  Section end 2018/07/22 13:23:37.155
<<<  [Exit status: SUCCESS]

User-Mode and Kernel-Mode Drivers in Windows

Let me remind you that in Windows the driver can be executed in a kernel-mode or in a user mode. Kernel-mode drivers signed this way won’t load when Windows boots on the UEFI device with Secure Boot enabled with the error:

Event ID: 7000
ERROR_DRIVER_BLOCKED
1275 (0x4FB)
This driver has been blocked from loading.

eventid 7000 driver blocked from loading

You can check if Secure Boot mode is enabled using the PowerShell command:
Confirm-SecureBootUEFI

check windows uefi boot with Confirm-SecureBootUEFI

All kernel-mode drivers loaded with SecureBoot enabled must be signed during the Microsoft certification process (WHQL – Windows Hardware Quality Lab). The reason is that when the kernel is loaded, UEFI cannot verify the certificates in the Windows local machine certificate store.

SignTool Error: Signing Cert does not chain to a Microsoft Code Verification Root.

Microsoft requires mandatory third-party driver certification under the Windows Hardware Compatibility Program starting with Windows 10 1607.

Self-signed user-mode drivers (usually printers, scanners, plotters, etc.) will work even with SecureBoot enabled.
For kernel-mode drivers, you will have to disable digital signature verification and boot Windows in a test mode with the bcdedit.exe commands:
bcdedit.exe /set /nointegritychecks on
bcdedit.exe /set testsigning ON

Понравилась статья? Поделить с друзьями:
  • Setup initialization error sqlsut dll
  • Signode bxt3 16 коды ошибок
  • Setup has experienced an error please do the following
  • Signhash error ошибка формирования подписанных данных ошибка исполнения функции
  • Setup has experienced an error 6006