问题

自己开发的Windows7 64位驱动程序需要签名,怎么解决?

回答
好的,我们来聊聊自己开发的 Windows 7 64 位驱动程序签名这事儿。这绝对是个绕不开的坎,没有签名,你的驱动在 Win7 x64 下是无法正常加载的。

为啥要签名?这就像给你的驱动颁发一个“身份证明”。Windows 认为,驱动程序是直接操作硬件、访问系统核心的,如果来路不明或者被篡改过,那后果不堪设想,轻则系统不稳定,重则数据丢失甚至硬件损坏。数字签名就是为了确保你的驱动程序确实是你开发的,并且在发布后没有被恶意修改过。

那么,怎么解决这个问题呢?简单来说,你需要给你的驱动程序“盖个章”,这个章叫做数字签名。这个过程可以分为几个步骤:

第一步:获取一个代码签名证书 (Code Signing Certificate)

这是核心中的核心。你可以把它想象成申请一个“驾驶证”,没有这个证,你的驱动就不能上路。

从哪里获取?
你需要从一个被信任的证书颁发机构 (Certificate Authority, CA) 那里购买。这些 CA 就像是国家授权的身份认证机构。全球有很多知名的 CA,比如:
Comodo (现在是 Sectigo):价格相对亲民,认可度也比较高。
Symantec (已经卖给 DigiCert):过去是行业标杆,但价格也比较高。
GoDaddy:熟悉域名服务的朋友可能也知道他们提供证书。
还有很多其他的,比如 GlobalSign, Entrust 等等。

选择哪种证书?
对于驱动程序签名,你需要的是一个 OV (Organization Validation) 或 EV (Extended Validation) 级别的代码签名证书。
OV 证书:CA 会验证你公司的合法性(比如去工商部门查你的营业执照)。这个过程比 DV (Domain Validation) 要严格,但比 EV 要简单。
EV 证书:这是最严格的验证级别,CA 会对你的公司进行非常深入的审查,包括法律、实体和运营方面的验证。拿到 EV 证书后,在安装驱动时,Windows 会显示更友好的提示信息,甚至直接提示“来自已验证组织”之类的字样,用户信任度会更高。但价格也最贵。

给个建议: 对于个人开发者或者小型团队,OV 证书通常是性价比不错的选择。如果你的驱动是面向企业级用户,或者你希望获得最高的信任度,EV 证书会更适合。

证书的申请过程大致是怎样的?
1. 选择 CA 并购买证书:在 CA 的官方网站上选择你需要的证书类型,然后按照流程提交申请。
2. 提交公司信息:你需要提供公司的名称、地址、联系方式等信息。如果是 EV 证书,可能还需要提供营业执照副本、法人身份证明等。
3. CA 的验证:CA 会进行一系列的验证工作,可能需要几个工作日甚至更长时间。他们会打电话给你核实信息,也可能需要你提供一些额外的证明材料。
4. 生成和交付证书:验证通过后,CA 会生成你的代码签名证书。通常是以 `.pfx` 文件(包含私钥和公钥)的形式发送给你,或者提供一个安全的下载链接。这个 `.pfx` 文件非常重要,一定要妥善保管,不能泄露!

第二步:使用 Windows 驱动程序套件 (WDK) 进行签名

拿到证书后,你就可以用它来给你的驱动签名了。Windows 提供了一套工具叫做 Windows Driver Kit (WDK),里面包含了签名所需的工具。

WDK 的获取:
你需要在微软官网上下载对应的 WDK 版本。对于 Windows 7,你需要下载 Windows 7 WDK。可以在微软的开发者网站上找到下载链接。

签名命令:
签名工具主要使用的是 `signtool.exe`,它通常包含在 WDK 的安装目录中。你需要打开一个 管理员权限的命令提示符 (以管理员身份运行 CMD 或 PowerShell)。

签名命令的基本格式是这样的:

```bash
signtool sign /f /p /t
```

我们来分解一下这个命令的各个部分:

`signtool sign`:这是告诉 `signtool` 工具你要执行签名操作。
`/f `:指定你的 `.pfx` 证书文件的路径。例如 `/f "C:MyCertificatesmy_driver_signing.pfx"`。
`/p `:指定你的 `.pfx` 文件使用的密码。当你生成 `.pfx` 文件时会设置一个密码。
`/t `:这个非常重要!它指定了 时间戳服务器 (Timestamp Server) 的 URL。时间戳服务器的作用是证明你的驱动程序是在证书有效期内被签名的。即使你的证书过期了,只要在有效期内打上了时间戳,你的驱动程序仍然会被认为是有效的(但最好是提前续期证书)。
常用的公共时间戳服务器有:
`http://timestamp.sectigo.com`
`http://timestamp.digicert.com`
`http://timestamp.globalsign.com`
`http://ts.ssl.com` (来自SSL.com)
你可以选择其中一个来使用,比如 `/t http://timestamp.sectigo.com`。
``:这是你要签名的文件。通常,你需要签名的是你的驱动程序的可执行文件(`.sys` 文件),以及一个 `.cat` 文件(Catalog file)。`.cat` 文件是驱动程序安装包的一部分,包含了驱动程序文件中所有文件的数字签名信息。

签名 `.sys` 文件和 `.cat` 文件:
1. 签名 `.sys` 文件:
```bash
signtool sign /f "C:path oyour_certificate.pfx" /p YourPfxPassword /t http://timestamp.sectigo.com "C:path oyour_driver.sys"
```
执行后,如果成功,会显示“Successfully signed: C:path oyour_driver.sys”。

2. 创建和签名 `.cat` 文件:
`.cat` 文件不是直接签名的,而是通过一个叫做 `makecat.exe` 的工具生成的,然后你再用 `signtool` 对 `.cat` 文件进行签名。
首先,你需要一个 `.inf` 文件,这个文件描述了你的驱动程序及其包含的文件。然后,使用 `makecat.exe` 来生成 `.cat` 文件:

```bash
makecat v n "My Driver Catalog" o "C:path omy_driver.cat" "C:path oyour_driver.inf"
```
`v`:详细输出。
`n "My Driver Catalog"`:目录的名称,随便起一个。
`o "C:path omy_driver.cat"`:输出的 `.cat` 文件路径。
`"C:path oyour_driver.inf"`:你的驱动的 `.inf` 文件路径。

生成 `.cat` 文件后,同样需要用 `signtool` 对它进行签名:

```bash
signtool sign /f "C:path oyour_certificate.pfx" /p YourPfxPassword /t http://timestamp.sectigo.com "C:path omy_driver.cat"
```
同样,如果成功会显示“Successfully signed: C:path omy_driver.cat”。

第三步:创建驱动安装包 (INF 文件和 CAB 文件)

仅仅签名了 `.sys` 和 `.cat` 文件是不够的,你需要将它们打包成一个标准的驱动安装包。

`.inf` 文件:
你的驱动程序需要一个 `.inf` 安装文件。这个文件描述了你的驱动程序是什么,它属于哪个硬件ID,安装到哪里,以及需要包含哪些文件(包括你的 `.sys` 文件和 `.cat` 文件)。
一个简单的 `.inf` 文件大概是这样的:

```inf
[Version]
Signature="$WINDOWS NT$"
ProviderName="你的公司名称"
Class="System" ; 或者根据你的驱动类型选择合适的类
ClassGuid="{4d36e97fe32511cebfc108002be10318}" ; 示例,请根据实际硬件选择
DriverVer=10/26/2023,1.0.0.0
CatalogFile=your_driver.cat ; 引用你签名后的CAT文件

[Manufacturer]
%MyManufacturer%=MyDevice,NTamd64

[MyDevice.NTamd64]
%MyDevice.DeviceDesc%=MyDriver_Install, HWID_FOR_YOUR_DEVICE ; HWID_FOR_YOUR_DEVICE 需要替换成你的硬件ID

[MyDriver_Install.NTamd64]
CopyFiles=MyDriver_CopyFiles

[MyDriver_CopyFiles]
your_driver.sys

[SourceDisksNames]
1=DefaultInstall,,

[SourceDisksFiles]
your_driver.sys=1

[DestinationDirs]
DefaultDestDir=12 ; 系统目录下的drivers子目录

[MyDriver_Install.NTamd64.Services]
AddService=MyDriverService,0x00000002,MyDriver_Service_Install

[MyDriver_Service_Install]
DisplayName="My Driver Service"
ServiceType=1 ; SERVICE_KERNEL_DRIVER
StartType=3 ; SERVICE_DEMAND_START
ErrorControl=1 ; SERVICE_ERROR_NORMAL
ServiceBinary=%12%your_driver.sys ; %12% 是系统目录下的drivers子目录
```
请注意,`ProviderName`、`ClassGuid`、`Manufacturer`、`MyDevice.DeviceDesc` 和 `HWID_FOR_YOUR_DEVICE` 等都需要根据你的实际情况填写。你可以通过设备管理器找到你的设备的硬件ID。

`.cat` 文件:
正如前面提到的,你需要将你的 `.sys` 文件和 `.inf` 文件都包含在 `.cat` 文件中(或者说,`.cat` 文件会包含它们各自的哈希值和签名信息)。`makecat` 工具会自动处理这些。

创建 CAB 文件:
为了方便分发,你通常会将 `.sys`、`.inf` 和 `.cat` 文件打包到一个 `.cab` 文件中。你可以使用 `makecab.exe` 这个 Windows 自带的工具来完成。

首先,创建一个文本文件,比如 `driver_files.txt`,列出所有需要打包的文件:
```
your_driver.sys
your_driver.inf
your_driver.cat
```
然后运行命令:
```bash
makecab /D CompressionType=LZX /D CompressionLevel=9 /f driver_files.txt your_driver.cab
```
`/D CompressionType=LZX`:指定压缩算法,LZX 通常是驱动程序包的首选。
`/D CompressionLevel=9`:设置压缩级别。
`/f driver_files.txt`:指定包含文件列表的文本文件。
`your_driver.cab`:输出的 CAB 文件名。

现在,`your_driver.cab` 文件就是你的驱动安装包了。

第四步:测试和验证

签名完成后,最重要的一步就是测试。

1. 卸载旧版本 (如果存在):确保你的电脑上没有安装过未签名的版本。
2. 安装驱动:将你的 `.cab` 文件复制到电脑上,然后通过设备管理器,选择“更新驱动程序”,手动指定到你解压的 `.cab` 文件所在的目录(或者更方便的做法是,将 `.cab` 文件解压到一个文件夹,然后让设备管理器指向那个文件夹里的 `.inf` 文件)。
3. 检查设备管理器:安装完成后,查看设备管理器中你的设备状态。如果一切正常,应该没有黄色感叹号。
4. 使用 `signtool verify` 命令:你还可以使用 `signtool verify` 命令来检查你的驱动文件是否被正确签名:
```bash
signtool verify /pa /v your_driver.sys
signtool verify /pa /v your_driver.cat
```
`/pa`:遵循 Windows 最佳实践进行验证。
`/v`:详细输出。
如果签名有效,会显示“The signature of [...] is valid.”

一些重要的注意事项和高级技巧:

时间戳服务器的可靠性:确保你使用的公共时间戳服务器是可用的。如果服务器宕机,你的签名可能会失败。
证书的有效期:代码签名证书都有有效期。在证书到期前,你需要续订证书,然后重新对你的驱动程序进行签名和打包。否则,即使打了时间戳,随着时间推移,旧的驱动程序也会被视为不受信任。
WHQL (Windows Hardware Quality Labs) 认证:虽然签名是必需的,但微软还提供一个 WHQL 认证过程。通过 WHQL 认证的驱动程序会包含一个特殊的 WHQL 签名,并且在安装时会得到 Windows 的更高信任度,甚至允许在安装过程中不弹出用户账户控制 (UAC) 警告。WHQL 认证需要提交你的驱动程序包给微软进行测试,过程相对复杂一些,并且有严格的规则。对于大部分驱动程序,独立签名已经足够满足基本需求,但如果你想获得最好的用户体验和最广泛的兼容性,可以考虑 WHQL 认证。
私钥的安全:你的 `.pfx` 文件包含了你的私钥,这是你驱动程序身份的证明。务必妥善保管,不要泄露给任何人。 如果私钥泄露,恶意分子就可以冒充你的身份来签名恶意驱动程序。在生成 `.pfx` 文件时,设置一个强密码,并只在签名时才使用。
Automating the Signing Process:如果你经常需要发布更新,可以考虑将签名过程自动化,比如写一个批处理脚本或 PowerShell 脚本来调用 `signtool`。

总的来说,给 Windows 7 64 位驱动签名是一个标准但必不可少的步骤。虽然需要购买证书并进行一些配置,但它是保证你的驱动程序在用户系统中能够安全、稳定运行的关键。祝你一切顺利!

网友意见

user avatar

管理员权限下开运行命令行程序:

bcdedit.exe /set TESTSIGNING ON

开启测试模式,重启(会有test mode的水印)。

自己随便创建一个自签名,之后就可以。

网上也有各种第三方工具,可以去掉水印,慎重选择(可能会内含木马程序)。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有