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
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
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♦
125k55 gold badges289 silver badges324 bronze badges
answered Jul 27, 2020 at 7:16
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
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
-
Edited by
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
-
Marked as answer by
Все 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 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
Совет. Перед установкой этих инструментов, проверьте, что в 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
Теперь нужно добавить сертификат в доверенные корневые сертификаты и в сертификаты доверенных издателей:
$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
Чтобы убедитесь, что процедура прошла корректно, проверьте, что в каталоге появился файл 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
Для исправления ошибки нужно в секции [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 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"
Если при выполнении команды появляется ошибка
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
Также можно увидеть информацию о сертификате в свойствах 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.
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 будут примерно такие строки:
>>> [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.
Проверить, включен ли режим 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
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»
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.
(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.
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.
If you right-click on the inf driver file and select Install when installing a driver from File Explorer, you receive an error:
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
; - 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
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.
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
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
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
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"
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
You can also see information about the certificate in the properties of the CAT file on the Digital Signatures tab.
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.
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.
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.
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.
You can check if Secure Boot mode is enabled using the PowerShell command:
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