测试签名

从 Windows Vista 开始,基于 x64 的 Windows版本要求在内核模式下运行的所有软件(包括驱动程序)进行数字签名才能加载。 最初,可以在每次启动时使用 F8 开关 (,然后Windows加载) 暂时禁用在驱动程序中要求有效签名的加载时间强制。 但是,在前几次使用之后,这将变得乏味。 可以将内核调试器附加到测试计算机,这将在使用正确的 BCDEdit 命令后禁用相同的负载时强制检查。 但是,在驱动程序的开发过程中,最终需要对驱动程序进行测试签名,并最终在将驱动程序发布到用户之前对其进行发布签名。

在开发和测试期间安装未签名驱动程序

开发和测试过程中未签名驱动程序摘录

默认情况下,仅当内核可以验证驱动程序签名时,64 位版本的 Windows Vista 和更高版本的 Windows 才会加载内核模式驱动程序。 但是,可以在早期驱动程序开发和非自动化测试期间禁用此默认行为。 开发人员可以使用以下机制之一暂时禁用有效驱动程序签名的加载时间强制。 但是,若要完全自动测试由 即插即用 (PnP) 安装的驱动程序,必须对驱动程序的目录文件进行签名。 需要对驱动程序进行签名,因为Windows Vista 和更高版本的Windows会显示一个驱动程序签名对话框,用于要求系统管理员授权安装驱动程序的未签名驱动程序,这可能会导致任何用户无需必要的权限即可安装驱动程序并使用设备。 无法在 Windows Vista 及更高版本的 Windows 上禁用此 PnP 驱动程序安装行为。

使用 F8 高级启动选项

Windows Vista 及更高版本的 Windows 支持 F8 高级启动选项 -- “禁用驱动程序签名强制”- 仅针对当前系统会话禁用内核模式驱动程序的加载时签名强制。 此设置不会在系统重启时保留。

重新启动期间将显示以下启动选项屏幕,并提供禁用驱动程序签名强制选项的选项。 此预配将允许安装未签名的驱动程序以供测试。

screen shot showing the f8 advanced boot options.

附加内核调试器以禁用签名验证

将活动内核调试器附加到开发或测试计算机会禁用内核模式驱动程序的加载时签名强制实施。 若要使用此调试配置,请向开发或测试计算机附加调试计算机,并通过运行以下命令在开发或测试计算机上启用内核调试:

bcdedit -debug on

若要使用 BCDEdit,用户必须是系统上管理员组的成员,并从提升的命令提示符运行该命令。 若要打开提升的命令提示符窗口,请创建桌面快捷方式以 Cmd.exe,选择并按住 (或右键单击) 快捷方式,然后选择“ 以管理员身份运行”。

但是,请注意,在某些情况下,开发人员可能必须附加内核调试器,但还需要维护加载时签名强制实施。 请参阅 附录 1:在内核调试模式下强制实施Kernel-Mode签名验证 ,了解如何完成此操作。

测试对驱动程序包进行签名

最好的方法是测试对驱动程序包进行签名,而不是使用上述两种方法绕过驱动程序签名强制要求。 可以在开发计算机上完成测试签名和驱动程序安装,但你可能希望有两台计算机,一台计算机用于开发和签名,另一台计算机用于测试。

如何Test-Sign驱动程序包的摘录

对计算机进行签名

这是用于为 Windows Vista 和更高版本的 Windows 测试驱动程序包的测试的计算机。 此计算机必须运行 Windows XP SP2 或更高版本的 Windows。 若要使用驱动程序签名工具,此计算机必须安装 Windows Vista 及更高版本的 Windows 驱动程序工具包 (WDK) 。 这也可以是开发计算机。

测试计算机

这是用于安装和测试测试已签名驱动程序包的计算机。 此计算机必须运行 Windows Vista 或更高版本的 Windows。

测试签名过程

驱动程序包将包含驱动程序二进制文件、INF 文件、CAT 文件和任何其他必需的文件。 如果为多个目标处理器类型生成驱动程序,驱动程序包可能包含子目录,例如 x86、AMD64、IA64。 使用开发/签名计算机执行这些步骤。

以下过程介绍了测试驱动程序包签名的步骤:

  1. 为目标生成驱动程序。 如果要为 Windows 8.0 或 Windows 8.1 生成驱动程序,请分别将 Visual Studio 2012 或 Visual Studio 2013与相应的 WDK 配合使用,例如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 对驱动程序进行签名

  1. 创建驱动程序包文件夹并复制驱动程序文件,维护所需的任何子目录,例如 C:\DriverTestPackage。

  2. 为驱动程序包创建 inf 文件。 在 inf 文件中使用 WDK 中的 InfVerif 工具测试 inf File ,以便不报告任何错误。

  3. Creating测试证书摘录:

    下面的命令行示例使用 MakeCert 完成以下任务:

    • 创建名为 Contoso.com (测试) 的自签名测试证书。 此证书对使用者名称和证书颁发机构使用相同的名称, (CA) 。

    • 将证书的副本放入名为 ContosoTest.cer 的输出文件中。

    • 将证书的副本放在名为 PrivateCertStore 的证书存储中。 将测试证书放在 PrivateCertStore 中会将其与其他可能位于系统上的证书分开。

    使用以下 MakeCert 命令创建 Contoso.com (测试) 证书:

    makecert -r -pe -ss PrivateCertStore -n CN=Contoso.com(Test) ContosoTest.cer
    

    其中:

    • -r 选项创建具有相同颁发者和使用者名称的自签名证书。

    • -pe 选项指定可以导出与证书关联的私钥。

    • -ss 选项指定包含测试证书的证书存储的名称, (PrivateCertStore) 。

    • -n CN= 选项指定证书的名称,Contoso.com (测试) 。 此名称与 SignTool 工具一起使用来标识证书。

    • ContosoTest.cer 是包含测试证书副本的文件名,Contoso.com (测试) 。 证书文件用于将证书添加到受信任的根证书颁发机构证书存储和受信任的发布者证书存储。

    Viewing 测试证书摘录

    创建证书并将副本放入证书存储中后,Microsoft 管理控制台 (MMC) 证书管理单元可用于查看它。 执行以下操作,通过 MMC 证书 管理单元查看证书:

    1. 若要启动证书管理单元,请运行 Certmgr.msc。

    2. 在证书管理单元的左窗格中,展开 PrivateCertStore 证书存储文件夹,然后双击“证书”。

    以下屏幕截图显示了 PrivateCertStore 证书存储文件夹的“证书”管理单元视图。

    screen shot of the certificate store showing the test certificate .

    若要查看有关 Contoso.com (测试) 证书的详细信息,请双击右窗格中的证书。 以下屏幕截图显示了有关证书的详细信息。

    screen shot of the certificate window displaying general information about the contoso.com (test) certificate.

    请注意,“证书”对话框指出:“此 CA 根证书不受信任。 若要启用信任,请在受信任的根证书颁发机构存储中安装此证书。这是预期行为。 无法验证证书,因为默认情况下,Windows不信任颁发机构“Contoso.com (测试) ”。

  4. 创建目录文件 (.cat 扩展名) 。 使用 inf2cat 工具,如下所示创建目录文件。 请注意,开关没有空间,/driver:<no spacefull>< 路径>,/os::<no spaceos1>< name>,:<no spaceos2>< 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。

    Version 节的 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
    

    /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 for Vista 及更高版本或 XP) setupapi.log 文件上报告的任何安装错误。

  5. Test 签名驱动程序包的目录文件摘录

    以下命令行演示如何运行 SignTool 执行以下操作:

    若要对 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 文件

  1. 修改了通过嵌入式签名对驱动程序进行测试签名摘录

    • 在 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\toast\toastpkg\toastcd\ 目录中。 将从 Microsoft 下载站点下载Windows 8或 8.1 WDK 示例。 这些示例不包含Windows 8或 8.1 Windows驱动程序工具包。

    通过双击Windows资源管理器中的文件打开目录文件时,你将看到以下屏幕截图。 请注意,“查看签名”现已突出显示。

    screen shot showing general information of the security catalog file.

    如果选择“查看签名”,则会看到下面的屏幕截图,其中提供了“查看证书”中的下一个查看选项,然后从对话框本身提供“安装证书”选项。 下面提供了使用 certmgr.exe 工具安装证书的首选命令行选项。

    screen shot showing general information about the digital signature's details.

    screen shot showing general information about the certificate.

现在可以在签名计算机上或测试计算机上测试驱动程序。 如果使用测试计算机,请将驱动程序包复制到使文件结构保持不变的计算机。 该工具certmgr.exe还必须复制到测试计算机。 使用测试计算机时,将测试签名的 Toastpkg 驱动程序包复制到 c:\toast 临时文件夹。

以下过程描述了在任一计算机上用于测试驱动程序的步骤:

  1. 在提升的命令窗口中运行以下命令:

    bcdedit  /set  testsigning  on
    

    重新启动计算机。

  2. 所选摘录:使用 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
    

    证书Mgr) (摘录的位置:

    /add CertificateName

    将指定证书文件中的证书添加到证书存储中。

    /s

    指定证书存储是系统存储区。

    /r RegistryLocation

    指定系统存储的注册表位置处于HKEY_LOCAL_MACHINE之下。

    CertificateStore

    指定类似于“localMachine 根”的证书存储(trustedpublisher)。

    重新启动计算机。 现在可以运行 Certmgr.msc,并验证 ContosoTest.cer 是否在上述两个位置可见。 如果证书不可见,则安装证书的另一种方法是打开证书,并将其安装在上述两个节点上,然后再次验证。

  3. 验证 cat 文件和 sys 文件的签名。 打开提升的命令窗口,假设计算机中提供了signtool.exe,请转到 cat、inf 和 sys 文件所在的驱动程序包目录。 在适当的目录中执行以下命令

    从验证目录文件的 SPC 签名

    signtool  verify  /v  /kp  /c  tstamd64.cat  toaster.inf
    

    若要检查嵌入签名,请执行以下命令。

    从验证Release-Signed驱动程序文件的签名

    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.
    

    上述两个验证命令对于发布签名非常有用,稍后将对此进行讨论。

    驱动程序现已准备好在测试计算机中安装和测试。 始终建议正确设置以下注册表项,以便在安装过程中Windows Vista 和更高) 版本的操作系统 (收集 setupapi.dev.log 文件中的详细日志。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\Loglevel=0x4800FFFF
    

    在 %SystemRoot%\inf 文件中,在安装驱动程序之前重命名 setupapi.dev.log 文件。 安装后,将创建一个新的日志 setupapi.dev.log 文件,其中包含安装过程中遇到的宝贵信息。

    成功安装驱动程序后,可以在开发计算机上或测试计算机上对其进行测试。

安装、卸载和加载Test-Signed驱动程序包

在步骤 2 中重新启动系统后,可以安装并加载测试签名的驱动程序包。 可通过两种方法安装驱动程序包:

  1. 通过使用 OS 提供的 Pnputil (pnputil.exe) 工具。
  2. 通过使用 Devcon (devcon.exe) 工具,该工具是用于安装驱动程序但不可再发行的 WDK 命令行工具。 Devcon 工具的示例代码在 WDK 中提供。 若要重新分发,可以从示例代码实现自己的 Devcon 工具,并重新分发该工具的版本。

使用 PnpUtil 安装和卸载驱动程序包

安装驱动程序包:

  1. 打开提升的命令窗口,并将默认目录设置为 c:\烤箱。
  2. 运行下列命令之一:
    • 仅暂存驱动程序包: pnputil /add-driver toaster.inf
    • 若要暂存驱动程序并将其安装在现有设备上: pnputil /add-driver toaster.inf /install

卸载驱动程序包:

  1. 打开提升的命令窗口。
  2. 标识与要从返回的列表中删除的驱动程序包对应的 OEM INF 的名称 pnputil /enum-drivers
  3. 运行:pnputil /delete-driver \<OEM INF name> /uninstall

使用 DevCon 安装和卸载驱动程序包

安装驱动程序包:

  1. 打开提升的命令窗口,并将默认目录设置为 c:\toaster。

  2. Devcon.exe在 WDK 工具目录中提供 x86 版本、amd64 版本和 ia64 版本。 将相关版本复制到 c:\toaster 目录并运行以下命令。

    devcon.exe update <inf> <hwid>
    

    建议在 hwid> 周围<使用引号。 对于烤箱样本,它将是:

    devcon.exe update c:\toaster\toaster.inf "{b85b7c50-6a01-11d2-b841-00c04fad5171}\MsToaster"
    

卸载驱动程序包:设备仍在使用驱动程序包时,不应从系统中删除驱动程序包。 如果需要删除设备才能删除驱动程序包,可以使用“删除”开关使用 Devcon 工具删除设备。 devcon.exe /? 显示此工具的所有开关。 若要获取有关使用开关的特定信息,应添加“帮助”,如下所示,用于“删除”开关。

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

验证Test-Signed驱动程序是否正常运行

若要验证 Toastpkg 是否正常运行:

  1. 开始设备管理器

  2. 从设备列表中选择烤箱。 有关示例,请参阅下面的屏幕截图。

    screen shot showing the toaster device in the device manager.

  3. 若要打开驱动程序的属性对话框,请双击“烤箱包示例烤箱”,然后选择“属性”

  4. 若要确认烤箱正常工作,请在“常规”选项卡上选中“设备状态”框

设备管理器可用于从“属性”对话框中卸载设备和驱动程序。

如何排查Test-Signed驱动程序问题

如果在这些过程中遇到任何困难,请参阅 驱动程序签名安装疑难解答