4. 测试签名与发布签名
在驱动开发与WHQL认证流程中,测试签名与发布签名是两种截然不同的数字签名策略。理解它们的区别、适用场景以及如何正确启用测试签名模式,是驱动开发者从内部调试走向商业发布的关键一步。本节将系统梳理测试证书与商业证书的核心差异,并演示如何在目标系统上启用测试签名模式。
4.1 测试证书与商业证书:核心概念对比
测试证书(Test Certificate)由开发者自行生成或通过内部CA签发,主要用于开发和调试阶段;商业证书(Commercial Certificate / Authenticode Certificate)则必须从受信任的根证书颁发机构(CA)购买,并经过严格的身份验证。两者在信任链、安全级别、使用限制和成本上存在本质区别。
关键认知: 测试证书仅适用于启用了测试签名模式的系统,无法在默认安全启动(Secure Boot)的生产环境中加载驱动。商业证书是驱动通过WHQL认证并发布到Windows Update的必备条件。
4.1.1 证书差异对照表
| 对比维度 | 测试证书 | 商业证书(EV / Standard) |
|---|---|---|
| 颁发机构 | 自签名或内部CA | 受信任的第三方CA(如DigiCert、GlobalSign、Sectigo) |
| 信任链 | 不链接到微软根证书 | 链接到微软根证书或受信任根证书列表 |
| 系统要求 | 必须启用测试签名模式(TESTSIGNING) | 默认系统即可加载(Secure Boot开启时需WHQL交叉签名) |
| 安全启动兼容 | 不兼容 | 兼容(需EV证书或WHQL签名) |
| 有效期 | 通常1-5年(自定) | 1-3年(CA规定) |
| 成本 | 免费 | 每年数百至数千美元(EV证书更贵) |
| 主要用途 | 开发调试、内部测试、CI/CD流水线 | 生产发布、WHQL提交、Windows Update分发 |
| 签名工具 | MakeCert / New-SelfSignedCertificate / CertMgr | SignTool + 硬件令牌(HSM或USB Token) |
4.1.2 信任链可视化对比
下图展示了测试证书与商业证书在系统信任链中的不同位置。测试证书需要手动安装到“受信任的根证书颁发机构”存储区,而商业证书通过CA层级自动获得系统信任。
4.2 启用测试签名模式(TESTSIGNING)
测试签名模式是Windows提供的一种特殊启动配置,允许系统加载由测试证书签名的驱动程序,而无需通过WHQL认证或商业签名。该模式在开发、调试和内部验证阶段至关重要。
4.2.1 启用与禁用命令
通过bcdedit工具可以轻松切换测试签名模式。以下命令需要在管理员权限的命令提示符或PowerShell中执行。
# 启用测试签名模式
bcdedit /set testsigning on
# 禁用测试签名模式
bcdedit /set testsigning off
# 查看当前测试签名状态
bcdedit /enum {current} | findstr /i "testsigning"
操作提示: 修改bcdedit后需要重启系统才能生效。启用后,桌面右下角会显示“测试模式”水印,这是正常现象,表示系统已处于TESTSIGNING状态。
4.2.2 测试签名模式下的驱动加载流程
下图展示了在TESTSIGNING模式下,驱动从签名到加载的完整流程。与生产环境相比,关键区别在于签名验证阶段跳过了WHQL交叉签名检查。
4.2.3 测试签名模式的安全注意事项
- 仅限开发环境: 测试签名模式会降低系统安全性,因为它允许加载未经WHQL认证的驱动。严禁在生产环境或面向用户的设备上长期启用。
- 水印标识: 桌面右下角的“测试模式”水印是Windows的安全提示,用于提醒用户当前系统处于非安全状态。
- Secure Boot冲突: 启用TESTSIGNING模式会自动禁用Secure Boot的部分保护机制。在UEFI固件中,Secure Boot与TESTSIGNING不能同时完全生效。
- 调试符号要求: 测试签名模式下加载的驱动,建议同时启用调试符号(/DEBUG),以便在蓝屏或崩溃时获取完整的调用堆栈信息。
安全警告: 切勿在承载敏感数据或面向公众服务的系统上启用测试签名模式。完成调试后,请立即执行
bcdedit /set testsigning off 并重启,恢复系统安全状态。
4.3 测试证书的生成与安装
在启用测试签名模式后,还需要生成或获取一个测试证书,并将其安装到目标系统的受信任根存储区。以下是两种常用的测试证书生成方法。
4.3.1 使用MakeCert(传统方式,适用于旧版Windows SDK)
# 生成测试根证书
makecert -r -pe -n "CN=MyTestRootCA" -ss Root -sr CurrentUser -a sha256 -len 2048 -cy authority -sky signature MyTestRootCA.cer
# 生成测试签名证书(由根证书签发)
makecert -pe -n "CN=MyDriverCert" -ss My -sr CurrentUser -a sha256 -len 2048 -in "MyTestRootCA" -is Root -ir CurrentUser -sky exchange -eku 1.3.6.1.5.5.7.3.3 MyDriverCert.cer
4.3.2 使用PowerShell(推荐,适用于Windows 10/11及Server 2016+)
# 生成自签名测试根证书
$rootCert = New-SelfSignedCertificate -Type Custom -KeySpec Signature `
-Subject "CN=MyTestRootCA" -KeyExportPolicy Exportable `
-HashAlgorithm sha256 -KeyLength 2048 `
-CertStoreLocation "Cert:\CurrentUser\My" `
-NotAfter (Get-Date).AddYears(5)
# 导出根证书为.cer文件
Export-Certificate -Cert $rootCert -FilePath "C:\Certs\MyTestRootCA.cer"
# 生成测试签名证书(由根证书签发)
$signCert = New-SelfSignedCertificate -Type Custom -KeySpec Signature `
-Subject "CN=MyDriverCert" -KeyExportPolicy Exportable `
-HashAlgorithm sha256 -KeyLength 2048 `
-CertStoreLocation "Cert:\CurrentUser\My" `
-Signer $rootCert -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3") `
-NotAfter (Get-Date).AddYears(3)
# 导出签名证书为.cer文件
Export-Certificate -Cert $signCert -FilePath "C:\Certs\MyDriverCert.cer"
4.3.3 安装测试证书到目标系统
将生成的.cer文件复制到目标测试机,然后通过证书管理单元(certlm.msc)或以下命令安装:
# 将测试根证书安装到本地计算机的受信任根存储区
certutil -addstore Root C:\Certs\MyTestRootCA.cer
# 将测试签名证书安装到本地计算机的受信任发布者存储区
certutil -addstore TrustedPublisher C:\Certs\MyDriverCert.cer
最佳实践: 在团队开发中,建议将测试根证书通过组策略或MDM统一分发到所有开发/测试机器,避免每台机器单独安装。同时,确保证书私钥得到妥善保护,防止泄露导致签名滥用。
4.4 测试签名与发布签名的选择策略
在驱动开发的不同阶段,应选择合适的签名策略。下表总结了各阶段的推荐签名方式:
| 开发阶段 | 推荐签名方式 | 系统配置要求 | 备注 |
|---|---|---|---|
| 早期功能开发 | 测试证书 + TESTSIGNING | 启用TESTSIGNING | 快速迭代,无需CA介入 |
| 内部集成测试 | 测试证书 + TESTSIGNING | 启用TESTSIGNING | 可配合Driver Verifier进行压力测试 |
| WHQL预提交验证 | 商业证书(EV优先) | 关闭TESTSIGNING,开启Secure Boot | 模拟生产环境,验证签名链完整性 |
| WHQL正式提交 | 商业证书(EV) | 标准生产环境 | 必须使用EV证书或通过HLK/HCK获取交叉签名 |
| 生产发布 | WHQL签名(微软交叉签名) | 标准生产环境 | 驱动通过WHQL认证后获得微软签名 |