为自己的驱动程序签名
在Windows内核驱动开发中,微软不允许运行未签名的服务。我们可以给自己的驱动签名,这样我们就可以运行自己的驱动程序了。
1. 将Windows设置为测试模式
使用管理员身份运行power shell,执行以下命令并重启:
bcdedit /set testsigning on2. 生成自己的数字证书
以管理员身份运行powershell,并执行以下命令(将 MyDriverTest替换为你喜欢的名字):
$cert=New-SelfSignedCertificate-TypeCodeSigningCert-Subject"CN=MyDriverTest"-KeyUsageDigitalSignature-CertStoreLocation"Cert:\LocalMachine\My"将证书导出以便后续使用:
Export-Certificate-Cert$cert-FilePath"C:\MyDriverTest.cer"3. 让系统信任这个证书
- 按 Win + R,输入 certmgr.msc并回车,打开证书管理器。
- 在左侧展开 “受信任的根证书颁发机构” -> 点击 “证书”。
- 在右侧右键点击 “所有任务” -> “导入”。
- 在向导中,选择你刚才导出的 C:\MyDriverTest.cer文件。
- 依次点击“下一步”完成导入,将其放入“受信任的根证书颁发机构”存储中。
4. 使用signtool给驱动签名
使用管理员身份运行power shell:
Get-ChildItem-PathCert:\LocalMachine\My|Where-Object{$_.HasPrivateKey}|ForEach-Object{Write-Host"主题:$($_.Subject)"Write-Host"友好名称:$($_.FriendlyName)"Write-Host"指纹:$($_.Thumbprint)"Write-Host"---"}使用如下命令进行签名:
signtool sign /v /fd SHA256 /sm /n"MyDriverTest"/t http://timestamp.digicert.com"驱动路径"好的,这是一条用于驱动程序签名的完整命令。我们逐项拆解,特别是那些对您当前任务至关重要的选项。
命令结构分解
signtool sign /v /fd SHA256 /sm /n "MyDriverTest" /t http://timestamp.digicert.com "驱动路径"1.signtool sign
- 功能:调用
signtool.exe程序的sign子命令,指示其核心操作是“对文件进行数字签名”,而不是验证(verify)或其他操作。
2./v
- 全称:Verbose
- 功能:启用详细输出模式。执行此命令时,
signtool会将其查找证书、计算哈希、联系时间戳服务器、写入签名等每一步的详细信息打印到终端。如果签名失败,它能提供最直接的错误线索。调试时必备。
3./fd SHA256
- 全称:File Digest algorithm
- 功能:指定生成“文件数字指纹”所使用的哈希算法。
SHA256是当前安全标准,它会对您的整个驱动文件进行计算,生成一个唯一且不可逆的256位摘要(指纹)。此指纹将被您的私钥加密,形成签名的核心。旧系统可能用SHA1,但现代 Windows 驱动签名必须使用SHA256。
4./sm
- 全称:Store in the Machine store
- 功能:指定在“本地计算机”证书存储区中查找证书,而不是“当前用户”存储区。这是极其关键的选项。
- 如果没有
/sm参数,signtool默认在Cert:\CurrentUser\My(当前用户的“个人”存储)中找证书。 - 有了
/sm参数,signtool则在Cert:\LocalMachine\My(本地计算机的“个人”存储)中找证书。
- 如果没有
- 为什么重要:您创建的用于驱动签名的自签名证书,通常(也应该)安装在“本地计算机”账户下,因为驱动程序是系统级服务,不依赖特定用户登录。如果您的证书确实在“本地计算机”下,而您不加
/sm,signtool就会在“当前用户”下找,必然找不到,从而引发No certificates were found...错误。
5./n "MyDriverTest"
- 全称:Name of the certificate
- 功能:指定用于签名的证书的“主题”或“通用名称”。
"MyDriverTest"应与您创建证书时指定的Subject(例如CN=MyDriverTest)完全匹配。signtool用这个名称在指定的存储区(由/s或/sm决定)中定位唯一的证书及其关联的私钥。 - 注意:
/n是按名称模糊匹配,如果存储中有多个名称相似的证书,可能会导致选错。更精确的选择方式是使用/sha1参数指定证书的指纹(Thumbprint)。
6./t http://timestamp.digicert.com
- 全称:Timestamp server URL
- 功能:向指定的时间戳服务器请求一个权威的时间戳,并将其嵌入签名中。
- 为什么必须:这是保证签名长期有效的核心机制。您的自签名证书有有效期(比如1年)。如果没有时间戳,一旦证书过期,即使文件从未被修改,签名也会因“证书过期”而被判定为无效。添加了时间戳后,验证时会检查“在签名时刻(由时间戳服务器证明)证书是否有效”,而不是“当前时刻证书是否有效”。这样,只要签名时证书有效,即使日后证书过期,签名依然有效。
digicert.com是常用的公共时间戳服务器。
7."驱动路径"
- 功能:指定要签名的目标文件路径。必须用双引号包裹,特别是路径中包含空格时。这是命令的最后一个参数,
signtool会将前面所有选项确定的签名信息写入此文件。
总结:这条命令在“做什么”?
这条命令指示signtool执行以下操作:
- 准备:以详细模式执行。
- 定位:在本地计算机的证书存储中,找到一个名为
MyDriverTest的证书,并使用其关联的私钥。 - 计算:使用SHA256 算法计算“驱动路径”所指文件的哈希值。
- 加戳:联系DigiCert 的时间戳服务器,获取当前签名时间的权威证明。
- 生成签名:用第2步找到的私钥,加密第3步计算出的哈希值,并将此加密结果、证书公钥信息、以及第4步得到的时间戳,打包成一个“数字签名”数据块。
- 写入:将第5步生成的签名数据块,嵌入到驱动文件的特定位置(通常是文件的“安全目录”节中)。
如果成功,可以得到如下输出:
The following certificate was selected: Issued to: MyDriverTest Issued by: MyDriverTest Expires: Wed Mar 31 20:23:15 2027 SHA1 hash: 8FB7008E9A64FA92939ECDCCxxxxxxxxxxxxxxxxxxxxxx Done Adding Additional Store Successfully signed: C:\Users\lxz\Desktop\computer\driver\First.sys Number of files successfully Signed: 1 Number of warnings: 0 Number of errors: 0