如何在 Windows 中正确签署驱动程序

如何在 Windows 中正确签署驱动程序

Windows 大多数 64 位驱动程序,尤其是内核模式驱动程序,都需要有效的数字签名,以确保完整性和安全性。

签名可以应用于二进制文件和目录,可以使用 SignTool 或 Visual Studio 等工具以及受信任实体颁发的证书。

自签名证书有助于开发和测试 驱动程序 未签名 Windows 78.1 和 10 x64,但它们不能取代公开分发的商业签名。

Windows 版本之间的兼容性取决于使用适当的哈希算法(例如 SHA2)并遵循 Microsoft 和 WHQL 指南。

乍一看,在 Windows 中对驱动程序进行签名似乎是只有高级开发人员才能做的事情,但如果您使用 设备、自定义驱动程序或测试环境迟早你会遇到这个要求。在现代系统中,尤其是在 64 位系统中,Windows 不再信任任何试图偷偷进入内核的二进制文件:它需要有效的数字签名、像 SHA2 这样的现代算法,而且在很多情况下,还需要通过微软的认证。

接下来,我们将冷静地探讨签署控制器究竟意味着什么,以及两者之间有哪些区别。 内核模式和用户模式它对 64 位 Windows 7、8、8.1 和 10 有何影响,SignTool 或 Visual Studio 等工具扮演什么角色,以及对于开发环境(测试或自签名证书)和使用受信任机构颁发的证书的公共发布版本,您有哪些选择。

Windows 中的驱动程序签名是什么?为什么它是强制性的?

Windows 中的驱动程序签名涉及关联一个驱动程序。 驱动程序包的数字签名 (二进制文件、INF 文件、目录等)是为了确保两件事:一是文件自创建以来未被任何人篡改;二是文件确实来自指定的发布者(软件提供商或制造商)。 硬件).

实际上,在安装 Windows 设备期间,这些数字签名用于: 验证包裹的完整性 以及发布者的身份。如果信息不匹配(例如签名损坏、证书不受信任、哈希值错误等),系统将显示警告、阻止安装或直接拒绝加载驱动程序。

从 Windows Vista 64 位系统开始,尤其是在 Windows 7、8、8.1 和 10 x64 系统中,内核模式安全策略非常明确:任何将在内核中运行的驱动程序 必须正式签署。否则,驱动程序将无法加载,设备可能无法运行,如果强制加载无效的二进制文件,甚至可能出现蓝屏。

当您决定向微软申请驱动程序认证时,您可以将其提交至 Windows 硬件质量实验室 (WHQL) 验证流程。如果驱动程序包通过认证测试,微软将授予其认证。 官方 WHQL 签名这不仅提高了信任度和兼容性,而且还允许您通过以下方式分发驱动程序: Windows更新 以及微软支持的其他分销渠道。

需要注意的是,从 Windows 10 版本 1507 开始,所有通过 Microsoft 硬件开发中心签名的驱动程序都使用 进行签名。 SHA2 作为一种哈希算法SHA1 在这些场景中已经过时了,混合使用旧证书可能会导致问题,尤其是在较新的系统上。

内核模式和用户模式下的驱动程序签名有何不同

在 Windows 系统中,运行的驱动程序 内核模式和用户模式虽然两种环境下的签名策略并不完全相同,但随着操作系统版本的更新,签名策略往往会变得更加严格。

如何使用 HD Tune 检查硬盘的速度和健康状况内核模式驱动程序最为敏感,因为它们运行在系统内核中,并拥有对内存和硬件的特权访问权限。在 64 位版本的 Windows Vista 及更高版本中,这些驱动程序 它们需要签名 为了能够充电。此限制与系统稳定性和防护直接相关。 恶意软件 它试图以低浓度注入。

另一方面,以用户模式运行的驱动程序(例如,许多打印机驱动程序和附加组件)最初并不受如此严格的约束。事实上,在旧版本的 Windows 系统中, 这并非绝对要求。 这些驱动程序需要签名。然而,出于安全考虑,微软一直建议对驱动程序进行签名,而且自 Windows 8 起,某些类型的用户驱动程序在某些情况下必须进行签名。

一个典型的例子:安装在 x64 计算机上的打印机驱动程序通常会在安装过程中显示一个对话框,要求用户确认。实际上,该软件包 必须妥善签署。 这样安装工作就可以继续进行,不会出现阻塞或重大安全警报。

总体思路是,虽然用户模式下并非普遍要求,但微软正日益推动这一要求。 所有与驱动程序相关的软件都必须签名对它们进行签名可以可靠地验证它们的创建者,检测篡改,并降低恶意组件伪装成合法控制器潜入的风险。

不同 Windows 版本中的签名要求和 SHA 算法

最棘手的问题之一是Windows版本与哈希算法(例如……)之间的兼容性。 SHA1 和 SHA2许多开发人员会遇到这样的情况:驱动程序在一个系统上可以运行,但在另一个系统上却不行,而这很大程度上要归咎于签名策略的改变。

在较旧的系统中,例如 64 位 Windows 7 或 8,使用基于 SHA1 的证书和签名很常见,尽管微软已经发出警告: SHA1 在安全性方面存在不足。随着 Windows 8.1 和 10 的发展,SHA2 已成为代码和驱动程序签名的标准。

实际上,一些制造商选择通过嵌入由微软以外的实体颁发的双重证书(SHA1 和 SHA2)来对内核模式二进制文件进行签名。这些双重签名的二进制文件在某些​​情况下, 它们在 Windows 10 之前的版本中无法加载。在某些 Windows 10 系统上,它们甚至会导致严重的崩溃或蓝屏死机。

为了缓解这些问题,微软发布了特定的补丁程序,例如更新 KB 3081436。在受影响的系统上安装此更新可以修复与某些 SHA2 签名驱动程序的不兼容性,并提供一个列表。 参考 SHA 哈希值 在该支持文章的“更多信息 - 文件哈希信息”部分。

如果您要分发需要在多个 Windows 版本上运行的驱动程序,那么审查以下内容至关重要: 每个版本的签名要求 微软对此有详细说明。其中明确规定了哪些算法有效、如何处理向后兼容性以及哪些签名组合(目录签名、嵌入式二进制签名、交叉证书等)被官方接受。

Windows 沙盒 (WSB):Windows 沙盒使用终极指南用户模式驱动程序签名:建议和资源

虽然内核通常最受关注,但用户模式驱动程序签名也同样值得关注。微软最初并没有严格执行这项规定,但后来确实…… 强烈建议注意安全 该系统能够增强最终用户的信心。

用户模式驱动程序的签名基本上执行与内核模式下相同的功能: 标识控制器提供者 (制造商、独立软件供应商等)并确认软件包自签名以来未被修改。例如,当用户在 x64 计算机上安装带有用户模式驱动程序的打印机时,安装向导可能会显示一个对话框,询问发布者是否受信任。如果签名有效且证书属于受认可的实体,则安装过程会更加顺利,并且警告信息也会大大减少。

微软提供了一系列文档和教程,深入探讨了签名过程,其中许多最初是为内核模式设计的,但也适用于用户模式。主要文章关于 驾驶员签名 内核模式代码签名教程中的子主题“如何对内核模块进行版本签名”是理解 Windows 代码签名一般逻辑的良好起点。

此外,Windows 驱动程序工具包 (WDK) 安装程序包含一个名为“帮助文件”的文件。 自签名自述文件.htm,位于目录中 自签名本文档解释了如何生成测试证书以及如何在开发过程中使用它们,这在您还没有受信任的根证书颁发机构颁发的证书时尤其有用。

总之,虽然在某些情况下,用户模式驱动程序在技术上可以无需签名即可运行,但应将其视为强制性要求。这是出于安全、品牌形象以及与 Windows 安装向导兼容性的考虑。 签下司机是最明智的做法。.

使用 SignTool 在 Windows 7 和 8 中对内核模式驱动程序进行签名

在使用 64 位 Windows 7 和 8 时,对内核模式驱动程序进行签名的最常见方法之一是使用命令行工具。 comandos 签名工具该实用程序包含在 Windows SDK 中,可用于对文件进行签名和验证现有签名,并提供多种选项以适应不同的场景。

一些最重要的选项 SignTool 的功能如下:

/ac:指定一个附加证书,例如,将您的证书链接到受信任的根证书颁发机构的交叉证书。

/f:表示包含签名证书的文件(通常为 .pfx)。

/p:提供与存储在 .pfx 文件中的签名证书关联的密码。

/fd:定义创建文件签名时使用的哈希算法,例如: /fd sha256 生成基于 SHA256 的签名(如果未指定,则旧版本中的默认值通常是 SHA1)。

/n “证书的通用名称”允许您根据通用名称 (CN) 从 Windows 证书存储中选择特定证书。

/t:指定与 Microsoft Authenticode 方案兼容的时间戳服务器。

/ tr:表示符合 RFC 3161 标准的时间戳服务器,更现代,建议用于新的部署。

Windows 免费杀毒软件对比 Windows Defender:完整指南在开发驱动程序项目时,了解哪些文件需要签名至关重要。驱动程序必须经过签名才能在 Windows 7 或 8 上正确安装。 项目的所有相关二进制文件 (例如,.sys 文件)以及将软件包中的文件集分组的目录文件(.cat)。

您有两种主要选择:您可以将这些文件复制到安装了 SignTool 的工作目录,或者直接复制。 将它们移动到 Windows SDK bin 文件夹 然后从那里运行该工具。重要的是,您必须同时准备好二进制文件和用于签名的证书。

一个典型的场景是获取相应的代码签名证书,例如,一个 “Microsoft 交叉证书”证书 由 GlobalSign 或其他受信任的机构颁发。将该交叉证书 (CrossCert.crt) 与您的主代码签名证书(例如 CodeSign.pfx)一起放在工作目录中,然后运行类似如下的命令:

signtool sign /ac CrossCert.crt /f CodeSign.pfx /p password1234 /tr http://timestamp.globalsign.com/tsa/r6advanced1 filter.sys

此命令会生成一个签名,该签名 包括交叉认证 并从 GlobalSign 的 RFC 3161 服务器获取时间戳。该时间戳至关重要,因为它能证明文件是在证书有效期内签名的,即使证书之后过期。

文件签名后,需要验证所有内容是否正确。这通常使用验证命令来完成,例如:

signtool verify -v -kp filename.sys

选择 -v 它会强制输出详细信息,显示有关证书链的详细信息以及该选项。 -kp 它会根据内核模式驱动程序的特定代码签名标准验证签名。如果一切顺利,您将看到一个结果,表明签名和证书链均正确。

最后,建议 对 .cat 文件重复相同的签名和验证过程 该软件包。一旦二进制文件和目录都经过正确签名,驱动程序就可以在 Windows 7 和 8 x64 系统上安装,而不会出现安全问题。在安装向导过程中,应该会显示受信任的发布者信息和标准系统窗口。

为了深入了解该工具的所有变体,微软维护了一份全面的 SignTool 命令参考手册,以及一份…… 内核模式下代码签名的具体教程 以及专门介绍 Windows 内核模块数字签名的文档。这些资源解释了特殊情况、高级参数以及每个系统版本的具体细节。

艾萨克对字节世界和一般技术充满热情的作家。我喜欢通过写作分享我的知识,这就是我在这个博客中要做的,向您展示有关小工具、软件、硬件、技术趋势等的所有最有趣的事情。我的目标是帮助您以简单而有趣的方式畅游数字世界。

相关推荐

【小白教程】主路由和子路由互访教程
365bet手机app

【小白教程】主路由和子路由互访教程

⌛ 09-23 👁️ 4282
男篮世界杯各队比分相比NBA、CBA为何不高?3大原因告诉你!
徐才厚癌症恶化医治无效死亡
BSt365提现

徐才厚癌症恶化医治无效死亡

⌛ 06-15 👁️ 3443
刑伤的解释及意思
BSt365提现

刑伤的解释及意思

⌛ 12-29 👁️ 4066
篆怎么读
365bet手机app

篆怎么读

⌛ 10-26 👁️ 4411
【百字评机】日立60-5a深度解析
亚洲365世界杯

【百字评机】日立60-5a深度解析

⌛ 12-30 👁️ 3749