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层级自动获得系统信任。

测试证书与商业证书信任链对比 测试证书信任链 自签名测试证书 手动安装到受信任根 仅TESTSIGNING模式加载 ❌ 安全启动拒绝加载 商业证书信任链 商业CA根证书 中间CA证书 商业签名证书(EV/Std) ✅ 安全启动信任加载 测试证书必须手动安装到受信任根存储区,且仅在TESTSIGNING模式下生效;商业证书通过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交叉签名检查。

测试签名模式驱动加载流程 驱动开发完成 测试证书签名 系统TESTSIGNING模式 签名验证(跳过WHQL) 驱动加载成功 在TESTSIGNING模式下,Windows内核只验证测试证书是否存在于受信任根存储区, 不要求WHQL交叉签名或EV证书。此模式专为开发和调试场景设计。

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认证后获得微软签名