排查驱动程序签名安装问题

安装发布签名的驱动程序与在测试签名安装、卸载和加载Test-Signed驱动程序包中所述相同,但使用其中所述的任一方法进行安装时需要执行两个附加步骤。

如果尚未在系统上设置受信任的驱动程序包的签名者,可能会看到以下Windows 安全中心对话框。

显示 Windows 安全对话框的屏幕截图。

如果再次安装驱动程序或由于任何原因删除驱动程序,则选择“检查”框将不会在计算机上再次显示此对话框。

注意 系统会根据用于对目录进行签名的 SPC 来验证发布者信息是否准确。 如果发布者信任级别未知(对于 Contoso.com 为 true),则系统将显示对话框。 若要继续安装,用户必须选择“安装”。 有关信任和驱动程序安装的详细信息,请参阅 代码签名最佳做法

未签名的驱动程序将显示以下对话框,该对话框允许用户安装未签名的驱动程序, (这可能不适用于 x64 版本的 Windows) 。

显示 Windows 安全警告对话框的屏幕截图。

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

使用 设备管理器 查看前面所述的测试签名驱动程序) 的驱动程序属性 (。 下面是显示驱动程序是否正常工作的屏幕截图。

显示设备管理器中的烤箱设备的屏幕截图。

排查Release-Signed驱动程序问题

下面列出了几种常见方法来排查加载已签名或测试签名的驱动程序时出现的问题:

  • 使用 设备管理器 检查驱动程序是否已加载和签名,如验证测试签名Test-Signed驱动程序是否正常运行中所述。
  • 安装驱动程序后,打开在 %windir%\inf 目录中创建的 setupapi.dev.log 文件。 在安装驱动程序之前,请参阅有关设置注册表项和重命名 setupapi.dev.log 文件的部分。
  • 检查 Windows 安全审核日志和代码完整性事件日志。

分析 Setupapi.dev.log 文件

如前所述,任何驱动程序安装信息都将记录 (追加) %windir%\inf 目录中的 setupapi.dev.log 文件。 测试驱动程序包安装时,如果在安装驱动程序之前重命名该文件,则会生成新的日志文件。 新日志文件将更容易从新驱动程序安装中搜索重要日志。 但是,不应将日志文件重命名为生产方案的一部分。 可以在任何文本编辑软件中打开日志文件。

最左边的列可能有一个感叹号“!” 或多个感叹号“!!!”。 单个感叹号是警告消息,但三重感叹号表示失败。

安装使用 CA 供应商提供的 SPC 证书签名的驱动程序包版本时,将看到以下单个感叹号。 这些警告指示尚未验证 cat 文件。

!    sig:                Verifying file against specific (valid) catalog failed! (0x800b0109)
!    sig:                Error 0x800b0109: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
     sig:                Success: File is signed in Authenticode(tm) catalog.
     sig:                Error 0xe0000242: The publisher of an Authenticode(tm) signed catalog has not yet been established as trusted.

如果在此计算机上签名者尚不受信任时,在显示的对话框中选择“安装”按钮,你将看到下面的日志,在大多数情况下,这意味着驱动程序将正常安装和加载。 设备管理器不会报告驱动程序的任何错误或黄色感叹号。

!    sto:           Driver package signer is unknown but user trusts the signer.

如果在日志文件中还看到以下错误日志,则可能未加载驱动程序。

setupapi.dev.log 文件还报告了以下错误:

!!!  dvi:                          Device not started: Device has problem: 0x34: CM_PROB_UNSIGNED_DRIVER.

请注意,0x34为代码 52。

若要进行故障排除,请查看日志文件并查找驱动程序二进制文件旁边的感叹号。 signtool verify对 cat 文件和其他嵌入的签名二进制文件运行 命令。

通常,日志文件信息足以解决问题。 如果上述检查未能找到根本原因,检查 Windows 安全审核日志和代码完整性事件日志,如下一部分所述。

使用Windows 安全中心审核日志

如果驱动程序由于缺少有效的签名而无法加载,则会将其记录为审核失败事件。 审核失败事件记录在 Windows 安全日志中,表示代码完整性无法验证驱动程序文件的图像哈希。 日志条目包括驱动程序文件的完整路径名称。 仅当本地安全审核策略启用系统故障事件的日志记录时,才会生成安全日志审核事件。

注意 必须显式启用安全审核日志。 有关详细信息,请参阅 附录 3:启用代码完整性事件日志记录和系统审核

检查安全日志:

  1. 打开提升的命令窗口。
  2. 若要启动 Windows 事件查看器,请运行 Eventvwr.exe。 还可以从控制面板计算机管理应用程序启动事件查看器。
  3. 打开 Windows 安全审核日志。
  4. 在日志中检查事件 ID 为 5038 的系统完整性事件。
  5. 选择并按住 (或右键单击) 日志条目,然后选择“事件属性”以显示其“事件属性”对话框,其中提供了事件的详细说明。

下面的屏幕截图显示了由无符号Toaster.sys文件引起的安全审核日志事件的“事件属性”对话框。

屏幕截图显示事件属性对话框。

使用代码完整性事件操作事件日志

如果驱动程序因未签名或生成映像验证错误而无法加载,则代码完整性会在代码完整性操作事件日志中记录事件。 始终启用代码完整性操作事件。

可以使用 事件查看器 查看代码完整性事件。

检查代码完整性操作日志

  1. 打开提升的命令窗口。
  2. 若要启动 Windows 事件查看器,请运行 Eventvwr.exe。 也可以从计算机管理控制面板应用程序启动事件查看器。
  3. 打开 Windows 代码完整性日志。
  4. 选择并按住 (或右键单击) 日志条目,然后选择“事件属性”以显示其“事件属性”对话框,其中提供了事件的详细说明。

下面的屏幕截图显示了由无符号Toaster.sys文件引起的代码完整性操作日志事件的“事件属性”对话框。

显示事件查看器的屏幕截图。

在代码完整性详细日志中使用信息事件

代码完整性信息日志的详细视图跟踪所有内核模式映像验证检查的事件。 这些事件显示系统上加载的所有驱动程序的成功映像验证。

启用代码完整性详细视图:

  1. 启动事件查看器,如上一示例所示。
  2. Selet“代码完整性”节点,使其获得焦点。
  3. 选择并按住 (或右键单击“) 代码完整性”,然后从快捷菜单中选择“查看”项。
  4. 选择“显示分析和调试日志”。 这会创建包含两个附加节点的子树:操作节点和详细节点。
  5. 选择并按住 (或右键单击“详细”节点) ,然后从快捷菜单中选择“属性”。
  6. 在“常规”选项卡上,选择“启用日志记录”以启用详细日志记录模式。
  7. 重新启动系统以重新加载所有内核模式二进制文件。
  8. 重新启动后,打开 MMC 计算机管理管理单元并查看代码完整性详细事件日志。

附录 4:驱动程序签名问题中介绍了一些其他已知的 驱动程序签名问题