从 Windows Vista 开始,基于 x64 的 Windows 版本要求在内核模式下运行的所有软件(包括驱动程序)进行数字签名才能加载。 最初,可以使用 F8 开关(在 Windows 加载之前每次启动)暂时禁用在驱动程序中要求有效签名的加载时间强制实施。 但是,在前几次使用之后,这将变得乏味。 可以使用正确的 BCDEdit 命令将内核调试器附加到测试计算机,该计算机将在使用正确的 BCDEdit 命令后禁用相同的负载强制检查。 但是,最终需要在驱动程序开发过程中测试对驱动程序进行签名,并最终在将驱动程序发布到用户之前对其进行发布签名。
在开发和测试期间安装未签名驱动程序
在开发和测试过程中安装未签名的驱动程序的摘录:
默认情况下,仅当内核可以验证驱动程序签名时,64 位版本的 Windows Vista 和更高版本的 Windows 才会加载内核模式驱动程序。 但是,在早期驱动程序开发和非自动测试期间,可以禁用此默认行为。 开发人员可以使用以下机制之一暂时禁用有效驱动程序签名的加载时间强制。 但是,若要完全自动测试由 即插即用 (PnP)安装的驱动程序,必须对驱动程序的目录文件进行签名。 需要对驱动程序进行签名,因为 Windows Vista 和更高版本的 Windows 为需要系统管理员授权安装驱动程序的未签名驱动程序显示驱动程序签名对话框,从而可能阻止任何用户无需必要的权限即可安装驱动程序和使用设备。 无法在 Windows Vista 和更高版本的 Windows 上禁用此 PnP 驱动程序安装行为。
使用 F8 高级启动选项
Windows Vista 和更高版本的 Windows 支持 F8 高级启动选项 -- “禁用驱动程序签名强制实施” - 仅对当前系统会话禁用内核模式驱动程序的加载时间签名强制。 此设置不会在系统重启时保留。
重新启动期间将显示以下启动选项屏幕,提供禁用驱动程序签名强制选项的选项。 此预配将允许安装未签名的驱动程序进行测试。
附加内核调试器以禁用签名验证
将活动内核调试器附加到开发或测试计算机会禁用内核模式驱动程序的加载时签名强制实施。 若要使用此调试配置,请向开发或测试计算机附加调试计算机,并通过运行以下命令在开发或测试计算机上启用内核调试:
bcdedit -debug on
若要使用 BCDEdit,用户必须是系统上的 Administrators 组的成员,并从提升的命令提示符运行该命令。 若要打开提升的命令提示符窗口,请创建桌面 快捷方式以Cmd.exe、选择并按住(或右键单击)快捷方式,然后选择“ 以管理员身份运行”。
但是,请注意,在某些情况下,开发人员可能必须附加内核调试器,但还需要维护加载时签名强制实施。 请参阅 附录 1:在内核调试模式下 强制实施内核模式签名验证,了解如何完成此操作。
测试对驱动程序包进行签名
最好的方法是测试对驱动程序包进行签名,而不是使用上述两种方法来绕过驱动程序签名强制要求。 可以在开发计算机上完成测试签名和驱动程序安装,但你可能希望有两台计算机,一台计算机用于开发和签名,另一台计算机用于测试。
如何对驱动程序包进行测试签名的摘录:
对计算机进行签名
这是用于测试 Windows Vista 和更高版本的 Windows 驱动程序包的计算机。 此计算机必须运行 Windows XP SP2 或更高版本的 Windows。 若要使用 驱动程序签名工具,此计算机必须安装 Windows Vista 和更高版本的 Windows 驱动程序工具包(WDK)。 这也可以是开发计算机。
测试计算机
这是用于安装和测试测试签名驱动程序包的计算机。 此计算机必须运行 Windows Vista 或更高版本的 Windows。
测试签名过程
驱动程序包将包含驱动程序二进制文件、INF 文件、CAT 文件和任何其他必需文件。 如果驱动程序是针对多个目标处理器类型生成的,驱动程序包可能包含子目录,例如 x86、AMD64、IA64。 使用开发/签名计算机执行这些步骤。
以下过程描述了测试驱动程序包签名的步骤:
为目标生成驱动程序。 如果要为 Windows 8.0 或 Windows 8.1 生成驱动程序,则分别使用安装了相应 WDK 的 Visual Studio 2012 或 Visual Studio 2013,例如 Windows 8.0 或 8.1 WDK。
应从相应的工具/生成命令窗口 Visual Studio 2012 或 Visual Studio 2013 使用下面介绍的所有命令工具。
注意
Visual Studio 的命令工具位于安装目录 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts
命令提示符的五个快捷方式中有一个,makecert.exe、inf2cat.exe、signtool.exe、certmgr.exe等命令。
可以选择最常规的“VS2013 开发人员命令提示符”。 快捷方式可以固定到任务栏,以便轻松访问。
注意
请注意,使用 Visual Studio,而不是驱动程序签名的命令工具方法,还可以使用 Visual Studio 2013 开发环境(也称为 IDE)对驱动程序包进行签名。 有关详细信息,请参阅 附录 2:使用 Visual Studio 为驱动程序签名。
创建驱动程序包文件夹并复制驱动程序文件,维护所需的任何子目录,例如 C:\DriverTestPackage。
为驱动程序包创建 inf 文件。 使用 InfVerif 工具从 inf 文件中的 WDK 测试 inf 文件,以便不会报告任何错误。
创建测试证书的摘录:
以下命令行示例使用 MakeCert 完成以下任务:
创建名为 Contoso.com(Test)的自签名测试证书。 此证书对使用者名称和证书颁发机构(CA)使用相同的名称。
将证书的副本放在名为 ContosoTest.cer的输出文件中。
将证书的副本放在名为 PrivateCertStore 的证书存储中。 将测试证书 放在 PrivateCertStore 中可使其与其他可能位于系统上的证书分开。
使用以下 MakeCert 命令创建 Contoso.com(Test) 证书:
makecert -r -pe -ss PrivateCertStore -n CN=Contoso.com(Test) ContosoTest.cer
其中:
-r 选项创建具有相同颁发者和使用者名称的自签名证书。
-pe 选项指定可以导出与证书关联的私钥。
-ss 选项指定包含测试证书(PrivateCertStore)的证书存储的名称。
-n CN= 选项指定证书的名称,Contoso.com(Test)。 此名称与 SignTool 工具一起使用,用于标识证书。
ContosoTest.cer是包含测试证书副本的文件名,Contoso.com(Test)。 证书文件用于将证书添加到受信任的根证书颁发机构证书存储和受信任的发布者证书存储。
查看测试证书的摘录:
创建证书并将副本放入证书存储中后,可以使用Microsoft管理控制台(MMC)证书管理单元查看它。 执行以下操作,通过 MMC 证书管理单元查看证书 :
若要启动证书管理单元,请运行 Certmgr.msc。
在“证书”管理单元的左窗格中,展开 PrivateCertStore 证书存储文件夹,然后双击“证书”。
以下屏幕截图显示了 PrivateCertStore 证书存储文件夹的“证书”管理单元视图。
若要查看有关 Contoso.com(测试)证书的详细信息,请双击右窗格中的证书。 以下屏幕截图显示了有关证书的详细信息。
请注意,“证书”对话框指出:“此 CA 根证书不受信任。 若要启用信任,请在受信任的根证书颁发机构存储中安装此证书。这是预期的行为。 证书无法验证,因为 Windows 默认情况下不信任颁发机构“Contoso.com(Test)”。
创建目录文件(.cat 扩展名)。 使用 inf2cat 工具,如下所示创建目录文件。 请注意,开关不允许有空间,/driver:<no space><full path>,/os: :<no space><os1 name>,:<no space><os2 name>。
inf2cat /v /driver:C:\DriverTestPackage /os:7_64,7_x86 ,XP_X86
这会创建一个目录文件,其中包含驱动程序的 .inf 文件中提供的名称。 可以有选择地添加其他逗号分隔的 OS,或全部添加,如下所示,没有空格。
/os:2000,XP_X86,XP_X64,Server2003_X64,Vista_X64,Vista_X86,7_x86,7_64,Server2008_x86,Server2008_x64,Sever2008_IA64,Server2008R2_x86,Server2008R2_x64,Server2008R2_IA64,8_x86,8_x64, 8_ARM, Server8_x64
新 8.1 WDK 中更新的 inf2cat 的 /os 选项值为 6_3_X86、6_3_X64、6_3_ARM 和 SERVER_6_3_X64。
“版本”部分的 INF 文件示例。
[Version] Signature="$WINDOWS NT$" Class=TOASTER ClassGuid={B85B7C50-6A01-11d2-B841-00C04FAD5171} Provider=%ToastRUs% DriverVer=09/21/2006,6.0.5736.1 CatalogFile.NTx86 = tostx86.cat CatalogFile.NTIA64 = tostia64.cat CatalogFile.NTAMD64 = tstamd64.cat PnpLockdown = 1
/driver (或 /drv) 选项指定包含一个或多个 INF 文件的目录。 在此目录中,将为包含一个或多个 CatalogFile 指令的 INF 文件创建目录文件。 目录文件名不限于 8.3 名称。
如果使用命令行参数 /os:7_X64,Inf2Cat 将创建目录文件 tstamd64.cat。 同样,如果使用 /os:XP_X86 选项,则该工具会创建目录文件 toastx86.cat,同样用于Server2008R2_IA64。 如果只需要一个目录文件,则 INF 文件中只有一个条目,如下所示。
CatalogFile.NT = toaster.cat
或者,
CatalogFile = toaster.cat
如果 INF 文件中的日期不大于 OS 发布日期,则在 /os 参数用于 Windows 7 且 INF 文件中设置的日期早于日期时,inf2cat 工具将报告以下错误。
Signability test failed. Errors: 22.9.7: DriverVer set to incorrect date (must be postdated to 4/21/2009 for newest OS) in \toaster.inf
inf2cat 工具非常严格地检查每个文件夹和子文件夹,了解是否存在 INF 文件中有条目的每个文件。 此类缺失条目上会出现有意义的错误消息。
可以通过双击或右键单击文件并选择“打开”,从资源管理器中打开 cat 文件。 “安全”选项卡将显示一些包含 GUID 值的条目。 选择 GUID 值将显示详细信息,包括驱动程序包的驱动程序文件和添加的 OS,如下所示:
OSAttr 2:5.1,6.1
数字 5.1 是 XP OS 的版本号,对于 Windows 7.0 OS,版本号为 6.1。
建议检查 cat 文件以验证是否包含驱动程序文件和所选 OS。 每当添加或删除任何驱动程序文件时,已修改 INF 文件,必须重新创建 cat 文件并重新签名。 此处的任何遗漏都会导致安装日志文件上报告的安装错误(setupapi.dev.log Vista 及更高版本或 XP setupapi.log 文件)。
测试签名驱动程序包的目录文件摘录:
以下命令行演示如何运行 SignTool 以执行以下操作:
测试 toastPkg 示例驱动程序包 tstamd64.cat 目录文件。 有关如何创建此 目录文件 的详细信息,请参阅 创建用于测试签名驱动程序包的目录文件。
使用 PrivateCertStore 中的 Contoso.com(Test) 证书进行测试签名。 有关如何创建此证书的详细信息,请参阅 “创建测试证书”。
通过时间戳颁发机构(TSA)对数字签名进行时间戳。
若要对 tstamd64.cat 目录文件进行测试签名,请运行以下命令行:
signtool sign /v /s PrivateCertStore /n Contoso.com(Test) /t http://timestamp.digicert.com tstamd64.cat
其中:
sign 命令将 SignTool 配置为对指定的目录文件进行签名,tstamd64.cat。
/v 选项启用详细操作,其中 SignTool 显示成功的执行和警告消息。
/s 选项指定包含测试证书的证书存储(PrivateCertStore)的名称。
/n 选项指定在指定证书存储中安装的证书(Contoso.com(Test)的名称。
/t 选项指定将标记数字签名的 TSA (
http://timestamp.digicert.com
) 的 URL。
重要
包括时间戳可提供密钥吊销所需的信息,以防签名者的代码签名私钥遭到入侵。
- tstamd64.cat 指定目录文件的名称,该文件将进行数字签名。
tstamd64.cat 指定目录文件的名称,该文件将进行数字签名。 可以按前面所述打开 cat 文件
修改了通过嵌入式签名对驱动程序进行测试签名的摘录:
- 在 64 位版本的 Windows Vista 和更高版本的 Windows 中,内核模式代码签名要求表示 启动驱动程序 必须具有嵌入式签名。 无论驱动程序的驱动程序包是否具有数字签名的目录文件,都需要这样做。
下面是用于嵌入对内核模式驱动程序二进制文件进行签名的命令。
signtool sign /v /s PrivateCertStore /n Contoso.com(Test) /t http://timestamp.digicert.com amd64\toaster.sys
amd64\toaster.sys指定将嵌入签名的内核模式二进制文件的名称。
在 WDK 7.1 安装目录中,烤箱示例位于 src\general\toastpkg\toastcd\ 目录中。 将从Microsoft下载站点下载 Windows 8 或 8.1 WDK 示例。 这些示例不附带 Windows 8 或 8.1 Windows 驱动程序工具包。
通过双击 Windows 资源管理器中的文件打开目录文件时,你将看到以下屏幕截图。 请注意,“查看签名”现已突出显示。
如果选择“查看签名”,则会看到下面的屏幕截图,其中提供了“查看证书”中的下一个查看选项,然后从对话框本身提供“安装证书”选项。 下面,我们提供了使用 certmgr.exe 工具安装证书的首选命令行选项。
驱动程序现在可以在签名计算机上或测试计算机上进行测试。 如果使用测试计算机,请将驱动程序包复制到计算机,使文件结构保持不变。 工具certmgr.exe还必须复制到测试计算机。 使用测试计算机时,将测试签名的 Toastpkg 驱动程序包复制到 c:\toast 临时文件夹。
以下过程描述了在任一计算机上用于测试驱动程序的步骤:
在提升的命令窗口中,运行以下命令:
bcdedit /set testsigning on
重新启动计算机。
使用 CertMgr 在测试计算机上安装测试证书的选定摘录:
将证书(.cer)文件( 用于测试签名 驱动程序)复制到测试计算机。 可以将证书文件复制到测试计算机上的任意目录。
以下 CertMgr 命令将证书 文件CertificateFileName.cer 添加到测试计算机上的受信任的根证书颁发机构证书存储中:
CertMgr.exe /add CertificateFileName.cer /s /r localMachine root
以下 CertMgr 命令将证书文件 CertificateFileName.cer 添加到测试计算机上的受信任发布者证书存储中:
CertMgr.exe /add CertificateFileName.cer /s /r localMachine trustedpublisher
Where (CertMgr 的摘录):
/add CertificateName
将指定证书文件中的证书添加到证书存储中。
/s
指定证书存储是系统存储。
/r RegistryLocation
指定系统存储的注册表位置位于HKEY_LOCAL_MACHINE下。
CertificateStore
为“localMachine 根”指定证书存储(trustedpublisher)类似。
重新启动计算机。 现在可以运行 Certmgr.msc,并验证ContosoTest.cer是否在上述两个位置可见。 如果它不可见,则安装证书的另一种方法是打开证书并将其安装在上述两个节点上,然后再次验证。
验证 cat 文件和 sys 文件的签名。 打开提升的命令窗口,假设计算机中提供了signtool.exe,请转到 cat、inf 和 sys 文件的驱动程序包目录。 在相应的目录中执行以下命令。
从 验证目录文件的 SPC 签名:
signtool verify /v /kp /c tstamd64.cat toaster.inf
若要检查嵌入签名,请执行以下命令。
验证 发布签名驱动程序文件的签名:
signtool verify /v /kp toaster.sys
上述两个命令将生成一个错误,因为它已测试签名,并且证书不是受信任的证书。
SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
上述两个验证命令在发布签名中非常有用,稍后将讨论这些命令。
驱动程序现已准备好在测试计算机中安装和测试。 建议在安装过程中正确设置以下注册表项,以便收集setupapi.dev.log文件(适用于 Windows Vista 和更高版本的操作系统)的详细日志。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\Loglevel=0x4800FFFF
在 %SystemRoot%\inf 文件中,在安装驱动程序之前重命名setupapi.dev.log文件。 安装后,将创建一个新的日志setupapi.dev.log文件,该文件将包含安装过程中遇到的宝贵信息。
成功安装驱动程序后,可以在开发计算机上或测试计算机上对其进行测试。
安装、卸载和加载测试签名驱动程序包
在步骤 2 中重新启动系统后,可以安装和加载测试签名的驱动程序包。 有两种方法可以安装驱动程序包:
通过使用 OS 提供的 Pnputil (pnputil.exe) 工具。
通过使用 Devcon (devcon.exe) 工具,该工具是用于安装驱动程序但不可再发行的 WDK 命令行工具。 Devcon 工具的示例代码在 WDK 中提供。 若要重新分发,可以从示例代码实现自己的 Devcon 工具,并重新分发该工具的版本。
使用 PnpUtil 安装和卸载驱动程序包
安装驱动程序包:
打开提升的命令窗口,并将默认目录设置为 c:\chef。
运行下列命令之一:
只需暂存驱动程序包:
pnputil /add-driver toaster.inf
若要暂存驱动程序并将其安装在现有设备上:
pnputil /add-driver toaster.inf /install
卸载驱动程序包:
打开提升的命令窗口。
标识与要从返回的列表中删除的驱动程序包对应的 OEM INF 的名称
pnputil /enum-drivers
运行:
pnputil /delete-driver \<OEM INF name> /uninstall
使用 DevCon 安装和卸载驱动程序包
安装驱动程序包:
打开提升的命令窗口,并将默认目录设置为 c:\chef。
Devcon.exe在 WDK 工具目录中提供 x86 版本、amd64 版本和 ia64 版本。 将相关版本复制到 c:\chef 目录,并运行以下命令。
devcon.exe update <inf> <hwid>
建议在 hwid> 周围<使用引号。 对于烤箱样本,它将是:
devcon.exe update c:\toaster\toaster.inf "{b85b7c50-6a01-11d2-b841-00c04fad5171}\MsToaster"
卸载驱动程序包:
设备仍在使用它时,不应从系统中删除驱动程序包。 如果需要删除设备才能删除驱动程序包,可以使用 Devcon 工具使用“删除”开关删除设备。 devcon.exe /?
显示此工具的所有开关。 若要获取有关使用开关的特定信息,应添加“help”,如下所示,用于“删除”开关。
devcon.exe help remove
删除设备后,若要删除驱动程序,需要两个命令。 使用具有“dp_enum”开关的第一个命令查找与计算机上安装的驱动程序包对应的驱动程序 inf 文件名。
devcon dp_enum
此命令将显示与驱动程序包对应的所有 oemNnn.inf 文件的列表,其中 Nnn 是一个十进制数,其中包含类信息和“提供”信息,如下所示。
oem39.inf
Provider: Intel
Class: Network adapters
oem4.inf
Provider: Dell
Class: ControlVault Device
若要从 DriverStore 中删除相应的驱动程序包,请使用下面显示的 Intel“网络适配器”驱动程序的下一个命令:
devcon.exe dp_delete oem39.inf
验证测试签名驱动程序是否正常运行
验证 Toastpkg 是否正常运行:
启动设备管理器
从设备列表中选择“烤箱”。 有关示例,请参阅下面的屏幕截图。
若要打开驱动程序的属性对话框,请双击“烤箱包示例烤箱”,然后选择“属性”
若要确认烤箱正常工作,请在“常规”选项卡上选中“设备状态”框
设备管理器可用于从“属性”对话框中卸载设备和驱动程序。
如何对测试签名驱动程序进行故障排除
如果在这些过程中遇到任何困难,请参阅 驱动程序签名安装 疑难解答。