为自己的驱动程序签名在Windows内核驱动开发中微软不允许运行未签名的服务。我们可以给自己的驱动签名这样我们就可以运行自己的驱动程序了。1. 将Windows设置为测试模式使用管理员身份运行power shell执行以下命令并重启bcdedit /set testsigning on2. 生成自己的数字证书以管理员身份运行powershell并执行以下命令将 MyDriverTest替换为你喜欢的名字$certNew-SelfSignedCertificate-TypeCodeSigningCert-SubjectCNMyDriverTest-KeyUsageDigitalSignature-CertStoreLocationCert:\LocalMachine\My将证书导出以便后续使用Export-Certificate-Cert$cert-FilePathC:\MyDriverTest.cer3. 让系统信任这个证书按 Win R输入 certmgr.msc并回车打开证书管理器。在左侧展开 “受信任的根证书颁发机构”​ - 点击 “证书”。在右侧右键点击 “所有任务” - “导入”。在向导中选择你刚才导出的 C:\MyDriverTest.cer文件。依次点击“下一步”完成导入将其放入“受信任的根证书颁发机构”存储中。4. 使用signtool给驱动签名使用管理员身份运行power shellGet-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 /nMyDriverTest/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本地计算机的“个人”存储中找证书。为什么重要您创建的用于驱动签名的自签名证书通常也应该安装在“本地计算机”账户下因为驱动程序是系统级服务不依赖特定用户登录。如果您的证书确实在“本地计算机”下而您不加/smsigntool就会在“当前用户”下找必然找不到从而引发No certificates were found...错误。5./n MyDriverTest全称Name of the certificate功能指定用于签名的证书的“主题”或“通用名称”。MyDriverTest应与您创建证书时指定的Subject例如CNMyDriverTest完全匹配。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