如何对文件系统驱动程序进行发布签名

Updated: April 23, 2008

用于 64 位版本 Windows Server 2008 和 Windows Vista 的内核模式驱动程序二进制文件必须经过签名,否则 Windows 不会加载它。这种要求适用于文件系统驱动程序(包括微筛选器、传统筛选器和重定向器)。一些驱动程序可以通过为驱动程序包包含签名的目录文件来满足这种要求。但是,所有随引导程序启动和随系统启动的驱动程序二进制文件都必须嵌入签名,以提高系统启动性能。

因为诸如文件系统驱动程序等非即插即用驱动程序不需要签名的目录文件,所以最普遍的签名方法是在驱动程序二进制文件中嵌入签名。本驱动程序技巧提供为文件系统驱动程序签名的基本信息,包括一个嵌入式发布签名过程的演示。

演示基于 Windows Driver Kit (WDK) 中的 Minispy 例子,它位于 WDK 的 minispy 目录中。例如,对于 Windows Server 2008 版本的 WDK,该示例通常位于 C:\WinDDK\6001\src\filesys\miniFilter\minispy。

关于文件系统驱动程序签名的一般背景信息,请参阅 IFS“文件系统驱动程序签名”演示文稿。

开始之前

准备您的系统:

安装最新版本的 WDK。详细信息请参阅“ 如何获取 Windows Driver Kit 和 Windows Logo Kit."

获取软件发布证书(SPC,有时称为代码签名证书)和关联的交叉证书。详细信息请参阅“用于 Windows Vista 内核模式代码签名的 Microsoft 交叉证书."

下列术语的使用演练:

术语说明

mySPCfile.spc

您的公钥证书文件。

myPVKfile.pvk

您的私钥证书文件。

myPVKpassword

私钥证书文件的密码。

myCrossCert.cer

用于 SPC 的正确的交叉证书文件。

CN 值

SPC 的 CN 值(在个人证书存储区中)。

提示:不要从本文复制和粘贴命令行语法。这会导致命令行中产生错误的字符。

下列过程使用 WDK 的 Minispy 例子来演示此过程。

为 Minispy 驱动程序签名

签名操作有三个基本阶段:

1.

准备驱动程序和证书。

2.

为驱动程序签名。

3.

验证驱动程序是否能正确安装。

准备 Minispy 驱动程序例子和签名证书

1.

使用高特权打开一个 WDK 构建环境窗口。

注意:因为签名工具和签名不依赖于特定的 Windows 版本,所以您可以使用任何 WDK 构建环境窗口为驱动程序签名。

2.

使用 WDK 构建实用程序构建 Minispy 驱动程序例子。详细信息请参见 WDK 文档的本地安装程序中的 Minispy 微筛选器示例。

3.

创建名为 C:\MinispyPkg 的文件夹并将驱动程序包文件(minispy.exe、minispy.sys 和 minispy.inf)从项目的目标文件夹复制到 MinispyPkg。

4.

创建一个名为 C:\MyCerts 的文件夹并将 mySPCfile.spc 和 myPVKfile.pvk 复制到该文件夹。

5.

浏览到 C:\myCerts 并运行下列命令将 .pvk 和 .spc 文件转换成系统可以使用的 .pfx 文件 (myPFXfile.pfx):

pvk2pfx -pvk myPVKfile.pvk -pi myPVKpassword -spc mySPCfile.spc -pfx myPFXfile.pfx -f

6.

使用 Certutil 通过运行下列命令将 myPFXfile.pfx 安装到当前用户的个人证书存储区中:

certutil -user -p myPVKpassword -importPFX IfsSPC.pfx

确保记录 Certutil 返回的 CN 值。也可以通过双击 .pfx 文件运行证书向导并使用向导的默认值完成前面的任务。

注意:Windows Vista 和大部分 Windows 服务器操作系统(包括 Windows Server 2008)都包含 Certutil。Windows XP 不包含 Certutil,但是您可以从另一台计算机复制这个工具或安装 Windows Server 2003 SP1 Administration Tools Pack。关于工具包的更多信息,请参见“Windows Server 2003 Administration Tools Pack."

对 Minispy 驱动程序的二进制文件进行嵌入式签名

1.

浏览到 c:\minispyPkg 并运行下列 Inf2Cat 命令,为目标 Windows 版本验证驱动程序包的 INF 文件:

inf2cat /driver:C:\minispyPkg /os:Vista_X64

2.

从 c:\minispyPkg 运行下列 SignTool 命令,为驱动程序二进制文件 (minispy.sys) 签名:

signtool sign /v /ac c:\minispyPkg\myCrossCert.cer /s my /n "CN Value" /t http://timestamp.verisign.com/scripts/timestamp.dll minispy.sys

注意:如果没有 SPC 的 CN 值,那么您可以从 Microsoft 管理控制台 (MMC) 证书插件获取。要打开插件,请运行下列命令:

mmc certmgr.msc

3.

通过运行下列 SignTool 命令来验证签名:

Signtool verify /v /kp minispy.sys

这个命令显示证书链。下面的例子显示 VeriSign 代码签名证书和 Microsoft/VeriSign 交叉证书的证书链:

证书链
Click to view full-size image.

注意,在这个例子中,顶级证书具有最少的缩进。

重要:如果 Microsoft 代码验证根不是顶级证书,那么您还没有成功地使用交叉证书对您的二进制文件进行签名。

验证签名的 Minispy 驱动程序是否正确安装

1.

通过在 Windows 资源管理器中右键单击 minispy.inf,然后单击 Install 在 64 位 Windows Server 2008 或 Windows Vista 上安装驱动程序。

2.

通过运行下列 fltmc 命令来加载签名的驱动程序:

fltmc load minispy

注意,用来加载驱动程序的名称(这个例子中是 "minispy")是驱动程序 INF 文件中的 ServiceName 值。还可以通过运行 'net start minispy' 或 'sc start minispy' 命令来加载驱动程序。

3.

通过不带参数运行 fltmc 来验证签名的驱动程序是否已经成功加载,该命令显示已经加载的筛选器列表:

fltmc

4.

通过运行下列命令卸载和删除签名驱动程序:

rundll32 setupapi,InstallHinfSection DefaultUninstall 132 C:\minispyPkg\minispy.inf

注意:要验证驱动程序是否被成功卸载和删除,请再次运行 fltmc。

如何使用硬件安全模块进行签名

私钥是贵重的资产,应该小心保护防止外泄。建议的方法是将私钥保存在硬件安全模块 (HSM) 中。这降低了私钥泄漏的风险(即使在其上使用 HSM 的计算机存在风险)。关于如何管理公钥和私钥的详细信息,请参见“代码签名最佳实践."

要在 myPVKfile.pvk 被存储在 HSM 中时对 minispy.sys 签名,请运行下列 SignTool 命令:

signtool sign /v /ac c:\minispyPkg\myCrossCert.cer /s my /n "CN Value" /csp "Cryptographic Service Provider Name" /kc "KeyContainerName" /t http://timestamp.verisign.com/scripts/timestamp.dll minispy.sys

重要:任何包含空格的名称都必须放在双引号中。

注意:将私钥导入 HSM 的过程依赖于具体的提供商,表示为加密服务提供商名称和密钥容器名称。

更多信息:

代码签名最佳实践

如何获取 Windows Driver Kit 和 Windows Logo Kit

Windows Server 2003 Administration Tools Pack

用于 Windows Vista 内核模式代码签名的 Microsoft 交叉证书

关于上述资料的视频介绍(2008 年 1 月录制于 IFS Plugfest 18),请参见“文件系统驱动程序签名” (讨论内容从时间索引 09:34 开始)。可以下载演讲幻灯片单击此处.

关于驱动程序签名的一般讨论,请参见“内核模式代码签名演练”。



此信息有用吗?