如何使用自签名证书为x64 Windows 10、8.1或者7签名未签名的驱动程序
默认情况下,从Windows 7开始的所有64位Windows版本均禁止安装未使用有效数字签名进行签名的设备驱动程序。未签名的驱动程序被操作系统阻止。数字签名保证(一定程度上)该驱动程序已由某个开发人员或者供应商发布,并且其代码在签名后未经过修改。
在64位(x64)Windows 10、8.1和7中,有几种禁用未签名驱动程序的驱动程序签名验证的方法:使用组策略或者测试启动模式。今天很好地展示了如何为Windows 10或者Windows 7的64位版本签名任何未签名的驱动程序。
假设我们具有Windows 10 x64或者Windows 7 x64的某些未签名的设备驱动程序(无数字签名)。在此示例中,它是相当旧的图形卡的驱动程序。已从供应商网站上下载了带有Windows版本驱动程序的存档(我能够找到Windows Vista x64的视频驱动程序版本),并且其内容已提取到c:\tools\drv1 \。让我们尝试通过使用标准的pnputil工具将其添加到Windows驱动程序商店中来安装驱动程序:
Pnputil –a c:\tools\drv1\xg20gr.inf
注意此命令和所有后续命令必须以管理员身份在命令提示符下运行。
在安装驱动程序期间,Windows 7会显示警告,提示系统无法验证此驱动程序的数字签名:
Windows can’t verify the publisher of this driver software.
在Windows 10中,不会出现此警告,但控制台中会出现警告:
处理inf:xg20gr.inf添加驱动程序包失败:第三方INF不包含数字签名信息。
如果在文件驱动器中右键单击inf驱动程序文件并选择Install
,则会收到错误消息:
The third-party INF does not contain digital signature information.
让我们尝试使用自签名证书对该驱动程序进行签名。
驱动程序签名工具
要生成签名并签名驱动程序,我们需要下载并安装以下Windows应用程序开发工具(具有默认设置):
- Windows版本的Windows SDK(或者Microsoft Visual Studio 2005或者更高版本)。这些软件包包括用于桌面的Windows SDK签名工具,其中包括必要的实用程序
signtool.exe
。 - Windows Driver Kit 7.1.0`
提示。在Windows 10中,我们可以使用Windows SDK和Windows Driver Kit的较新版本。在安装这些工具之前,请确保计算机上已安装.NET Framework 4.
创建自签名证书和私钥
在系统驱动器的根目录中创建一个C:\DriverCert文件夹。
打开命令提示符,然后转到以下目录:
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)组合在单个证书文件中,其格式为个人信息交换(.pfx):
pvk2pfx -pvk C:\DriverCert\myDrivers.pvk -pi P@ss0wrd -spc C:\DriverCert\myDrivers.spc -pfx C:\DriverCert\myDrivers.pfx -po P@ss0wrd
提示。通过使用PowerShell 5.0 cmdlet New-SelfSifgnedCertificate,可以在不使用第三方工具的情况下创建自签名代码签名证书:
$cert = New-SelfSignedCertificate -Subject "theitroad” -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\My
然后,我们需要使用以下密码将此证书导出到pfx文件:
$CertPassword = ConvertTo-SecureString -String P @ ss0wrd -Force AsPlainText Export-PfxCertificate -Cert $cert -FilePath C:\DriverCert\myDrivers.pfx -Password $CertPassword
注意尽管证书的有效期限有限,但是CodeSigning证书的到期意味着我们无法创建新的签名。已经由该证书签名的驱动程序的有效性是无限的(或者旧的签名在指定的时间戳记内有效)。
为驱动程序包创建目录文件(CAT)
创建目录" C:\DriverCert\xg20",然后将原始文件中的驱动程序最初提取到的文件夹(c:\tools\drv1 )中的所有文件复制到该文件夹中。确保这些文件中包含扩展名为.sys和.inf的文件(在我们的示例中,它们是xg20grp.sys和xg20gr.inf)。
进入目录:
cd C:\WinDDK00.16385.1\bin\selfsign
在INF文件的基础上生成CAT文件(包含有关驱动程序包中所有文件的信息)。使用inf2cat.exe工具(包含在Windows驱动程序工具包WDK中)在一个inf文件的基础上,为平台生成一个cat文件(它包含有关驱动程序包中所有文件的信息):
inf2cat.exe /driver:"C:\DriverCert\xg20" /os:7_X64 /verbose
为确保该过程正确,请检查日志文件是否包含以下消息:
Signability test complete.
和
Catalog generation complete.
注意在我的情况下,命令Inf2Cat.exe返回错误:
可签名性测试失败。错误:22.9.7:\hdx861a.inf中将DriverVer设置为错误的日期(对于最新的操作系统,此日期必须发布至4/21/2009)。
要解决该错误,请在[Version]部分中找到带有DriverVer =的行,并将其替换为:
DriverVer=05/01/2009,9.9.9.9
执行命令后,应在驱动程序目录中更新xg20gr.cat文件。
使用自签名证书对驱动程序进行签名
转到以下文件夹:
cd C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\Bin
使用Globalsign作为时间戳服务,使用我们之前创建的证书对驱动程序文件集进行签名。以下命令将使用存储在PFX文件中的证书(受密码保护)使用数字签名对CAT文件进行签名:
signtool sign /f C:\DriverCert\myDrivers.pfx /p P@ss0wrd /t http://timestamp.verisign.com/scripts/timstamp.dll /v C:\DriverCert\xg20\xg20gr.cat
如果文件已成功签名,则应显示以下消息:成功签名:C:\DriverCert\xg\xg20gr.cat已成功签名的文件数:1
提示。驱动程序的数字签名包含在.inf文件中引用的.cat文件中。我们可以使用以下命令在cat文件中检查驱动程序的数字签名:
SignTool verify /v /pa c:\DriverCert\xg\xg20gr.cat
或者在"数字签名"选项卡上的文件属性中:
CAT文件包含驱动程序目录中所有文件("复制文件"部分中INF文件中列出的文件)的数字签名(缩略图)。如果这些文件中的任何一个已更改,则文件的校验和将与CAT文件中的数据不匹配,因此,此类驱动程序的安装将失败。
安装自签名证书
由于我们创建的证书是自签名的,因此默认情况下,系统不信任它。将证书添加到本地计算机证书存储中。我们可以使用以下命令进行操作:
certmgr.exe-添加C:\DriverCert\myDrivers.cer -s -r localMachine根certmgr.exe-添加C:\DriverCert\myDrivers.cer -s -r localMachine可信任的
或者使用图形证书导入向导来完成此操作(我们需要将证书放置在本地计算机的"受信任的发行者"和"受信任的根证书颁发机构"存储中)。在域中,我们可以使用组策略将此证书分发到客户端计算机。
注意我们可以通过打开证书管理管理单元(certmgr.msc)并确保我们的证书(为发行)来检查我们创建的证书是否在受信任的证书列表中。
提示。当我们使用Sigcheck实用程序检查证书存储时,此证书将显示为不受信任,因为它不在Microsoft根证书列表中(此列表需要定期更新)。
使用自签名证书签名的驱动程序的安装
尝试使用以下命令安装我们再次签名的驱动程序:
Pnputil –i –a C:\DriverCert\xg20\xg20gr.inf
现在,我们将看不到有关驱动程序数字签名丢失的警告。
已将驱动程序成功安装在系统上的设备上。驱动程序软件包已成功添加。
在Windows 7 x64中显示以下警告:是否要安装此设备软件?在Windows 10 x64 1803中,不会出现此弹出窗口。通过单击"安装",我们可以在系统中安装驱动程序。
如果由于某种原因未安装驱动程序,则详细的驱动程序安装日志包含在文件C:\Windows\inf\setupapi.dev.log中。该日志文件使我们可以获取有关驱动程序安装错误的更多信息。在大多数情况下,驱动程序包签名验证错误很可能失败,这很可能意味着驱动程序证书未添加到受信任的证书存储中。
如果驱动程序安装成功,则setupapi.dev.log文件应包含以下行:
>>> [设备安装(DiInstallDriver)C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd64_c5955181214aa12b\xg20gr.inf] >>>节开始2016/07/22 23:32:57.015 cmd:Pnputil -i- ac:\DriverCert\xg\xg20gr.inf ndv:标志:0x00000000 ndv:INF路径:C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd64_c5955181214aa12b\xg20gr.inf inf:{SetupCopyOEMDOWS: DriverStore\FileRepository\xg20gr.inf_amd64_c5955181214aa12b\xg20gr.inf} 13:23:37.046 inf:副本样式:0x00000000 inf:驱动程序存储路径:C:\WINDOWS\System32\DriverStore\FileRepository\xg20gr.inf_amd20_inin_12a.inf_amd64_c5955181214 INF路径:C:\WINDOWS\INF\oem23.inf INF:{SetupCopyOEMInf exit(0x00000000)} 13:23:37.077 <<<节结束2016/07/22 13:23:37.155 <<< [退出状态:成功]
如我们所见,要安装自签名驱动程序,我们甚至不必使用bcdedit.exe命令来禁用驱动程序的数字签名验证:
bcdedit.exe/set loadoptions DISABLE_INTEGRITY_CHECKS bcdedit.exe/set testsigning ON