windows 10驱动签名相关问题

时间:2024-04-01 12:01:27

这篇文章绝大部分翻译自几篇英文文档,包括osronline和msdn。希望对windows 10驱动签名有困惑的同学有所帮助:

Build 2017开发者大会上,微软官方宣布,将在今年秋天推出的Windows 10第四次重大更新“Redstone 3”,已经定名为“Fall Creators Update”(秋季创意者更新)。
Windows 10此前已经进行了三次重大升级,其中2015年11月份的简单叫做“11月更新”(November Update 1511),2016年7月的叫做“周年更新”(Anniversary Update 1607),刚刚推出的则是“创意者更新”(Creators Update 1703)。

从Windows 10 1607开始,所有新的内核驱动必须提交到Dev Port,由微软进行代码签名。以下为例外情况:
  • 从之前的Windows版本升级到Windows 10 1607,依然运行安装 cross-signed驱动。
  • Secure Boot选项关闭的时候可以安装 cross-signed 驱动。
  • July 29th, 2015(貌似是Windows RTM发布日)之前使用cross-signed证书签发的驱动可以安装在Windows 10 1607。
  • 为防止系统启动失败,boot driver不会被阻止启动。但将来的windows版本会阻止 cross-signed驱动启动。

有两种方式提交驱动:
  • 使用HLK测试windows 10,使用HCK测试之前的windows版本,合并测试结果并提交到Microsoft。
  • 使用EV证书签名,然后提交到Microsoft要求attestation signing

使用ev证书签名命令如下:
signtool sign /a /ac GlobalSign_Root_CA.crt /s my /n “Company name” /fd sha256 /td sha256 /tr “http://timestamp.globalsign.com/?signature=sha2” /du “http://www.example.com” cabfilename.cab
有篇文档说明需要使用sha256,而sha1在2016-01-01已经被废弃。

如果要求驱动兼容windows vista、windows 7、windows 8、windows 8.1、windows 10,必须使用HLK测试windows 10,使用HCK测试windows 8.1及以前的操作系统。然后使用Windows 10 HLK合并这个测试结果并提及到Dev Port。portal 将会正确的对映像签名使其正确的工作在你指明的那些平台上。

Attestation signing要求使用EV证书对驱动签名并提交到dashboard。 attestation signed driver 只会在windows 10桌面版本工作,而对于其它的windows版本,attestation signed driver不会工作,例如windows 2016、windows 8、windows 7等。
使用makecab工具制作cab包是,需要有以**意事项:
  1. 驱动和inf文件不能放在根目录,需要放置在子目录中。
  2. inf是必须的,cat文件不需要,对于non pnp驱动,也需要一个dummy inf文件。
  3. cab也是需要使用ev证书签名的
  4. cab包可以包含多个子目录对应不同的驱动,但是必须是同一架构的(x86或者x64)。
  5. 根据我的测试,只要含有inf文件,就算同级目录中有不相关的驱动文件,这些不相干的驱动文件也会被微软签名。

使用makecab创建cab文件的命令为
C:\Echo> MakeCab /f "C:\Echo\Echo.ddf
而ddf文件样例如下(包含多个驱动目录)
;*** Submission.ddf multiple driver example
;
.OPTION EXPLICIT     ; Generate errors
.Set CabinetFileCountThreshold=0
.Set FolderFileCountThreshold=0
.Set FolderSizeThreshold=0
.Set MaxCabinetSize=0
.Set MaxDiskFileCount=0
.Set MaxDiskSize=0
.Set CompressionType=MSZIP
.Set Cabinet=on
.Set Compress=on
;Specify file name for new cab file
.Set CabinetNameTemplate=Echo.cab
;Specify files to be included in cab file
; First Driver
.Set DestinationDir=DriverPackage1
C:\DriverFiles\DriverPackage1\Driver1.sys
C:\DriverFiles\DriverPackage1\Driver1.inf
; Second driver
.Set DestinationDir=DriverPackage2
C:\DriverFiles\DriverPackage2\Driver2.sys
C:\DriverFiles\DriverPackage2\Driver2.inf

微软签名完毕后,windows 10系统上可以看到驱动文件包含两个签名:
windows 10驱动签名相关问题
但是windows 7系统的文件属性上只能显示一个签名:
windows 10驱动签名相关问题
从《Questions and Answers Windows 10 Driver Signing》节选的重要部分:
Disabling Secure Boot will open up x86 to unsigned drivers, while x64 will still enforce signed drivers。

Peter: Is it possible to get a Microsoft signature for an uploaded package that applies to down-level operating systems also?  In other words, I want to create a single driver package that works for Windows 7 through Windows 10.  How can I do that?  Currently, the sysdev portal only allows you to select Windows 10 Client x86 and Windows 10 Client x64.
James: This is definitely possible, but you need to use the Hardware Compatibility route (that is, you need to pass the HLK tests). By design, the new “attestation” route only supports Windows 10.

Peter: How do we sign drivers that are not necessarily traditionally installed with an INF?  For example, kernel services (non PnP software only drivers) or certain filter drivers?
James: This is another issue that we’re treating as a bug internally. The Microsoft signing pipelines are inherently reliant on an INF to determine the correct signing behaviors. The best solution I can offer currently is to create a “dummy” INF that the service can use as an anchor to provide the correct signing.

Peter: Will attaching a debugger still bypass code signing checks?
James: Yes, it will. There’s no changes in this behavior for Windows 10.