在Windows 8中,第三方INF驱动程序文件是否需要签名?

24
我在一家销售USB设备并为其提供驱动程序的公司工作。
在Windows 7中,只要USB设备的驱动程序没有向内核添加任何代码,您就可以安装和使用未签名的INF驱动程序文件。我们公司使用微软提供的通用驱动程序(usbser.sys和winusb.sys),因此我们从未需要对我们的驱动程序包进行签名。您可以查看一个这样的驱动程序包的示例。
根据我们的一位客户的报告以及另一个Stack Overflow问题“Windows 8的驱动程序签名要求有何变化?”和Arduino论坛的信息,听起来Windows 8 Consumer Preview有更严格的签名要求,要求所有第三方INF文件都必须获得签名。当人们尝试安装在Windows 7上运行的驱动程序时,他们收到的错误消息是:
第三方INF文件不包含数字签名信息。
微软官方有没有确认在Windows 8最终版本中仍然需要签名的官方声明?从MSDN.com上找到一两句话就可以了,但我找不到任何相关信息。
我正在考虑购买一个签名证书,但在支付200美元之前,我想确保长期来看我是否真的需要它。新的签名要求可能只是在消费者预览版中,而不是在真正的版本中?

获取消费者预览版非常简单,所以你可以自己找出来。难以相信你还没有这么做。另外,你在销售东西,却不愿意支付200美元的签名费?这在你公司年利润中占多少比例呢? - David Heffernan
1
获取消费者预览版并不能帮助做出这个决定。我更愿意向前迈进,获取官方的Windows 8副本。是的,我很节俭。 - David Grayson
1
大约7个月后,我写了一篇详细的文章,解释了我所学习到的有关这个主题的一切内容:http://www.davidegrayson.com/signing/ 简而言之,Windows 8确实要求您签署INF文件,但它不必是WHQL签名;它只需要具有一条信任链,该链返回到受信任的根证书颁发机构列表中的证书即可。 - David Grayson
2个回答

20

回答我的问题:是的,Windows 8的最终版本需要所有的INF文件都被签名,但你不需要将你的驱动程序提交到WHQL。我在文章“实用的Windows代码和驱动程序签名”中介绍了这个要求以及更多内容。


1
就这个问题而言,微软终于在2014年左右费心将其记录下来,只用了一句不起眼的话。 - undefined

10
不仅需要签署 INF 文件,还需要将其由WHQL证书签署,而不是您用于嵌入式签名 .sys 文件等的相同证书。在 INF 文件上使用我的代码签名证书根本行不通。(与未签名时出现的相同问题。)
编辑:
这就是微软想让你认为的。他们说某些类别的驱动程序必须经过 WHQL 签名,否则它们将无法工作,并且 Authenticode 签名仅适用于那些没有 WHQL 流程的人。
原来您是可以对驱动程序包进行Authenticode签名的,但是现在需要像内核代码一样进行签名,这意味着您需要为CA获取正确的交叉证书(从Cross-Certificates for Kernel Mode Code Signing中获取,现在有很多种类,包括我使用的StartCom(2级,60美元两年,但无法时间戳)。通过/ac开关将此交叉证书(不是您的CA的自签名证书或其中介证书。它仅在MSDN页面上提供)提供给SignTool
然后使用带有/kp开关的SignTool验证,以查看您是否正确地交叉签名了它们。没有任何开关的SignTool验证要求.cat文件是WHQL签名的,而先前似乎可以接受的/pa开关现在太松散,仅适用于非驱动程序签名(如EXE文件、ClickOnce等)。
如果您不想获得自己的内核级签名证书(现在比以前更容易,老实说,在此之前,仅限于VeriSign超级昂贵和GlobalSign每年200美元的证书,我猜微软看到很少有人为x64系统编写内核级漏洞利用程序),您可以创建一个自签名根CA,让您的驱动程序安装程序将其安装到LocalMachine的“可信任的根证书颁发机构”存储中(请参阅certmgr.exe),然后安装由其签名的.cat文件。当然,由于这不是内核级代码证书,因此您必须仅使用已经具有来自其他人的嵌入式内核级代码证书的.sys文件(这意味着您只能修改驱动程序包中的.inf文件)。显然,有一些漏洞允许自签名证书签署.cat文件(如果您使用自己的CA签署了证书,然后使用该证书签署了.cat文件,则它不会像这样工作)。
对于每个驱动程序INF包都执行此操作的套件,请参见libwdi,以及他们在cat文件上的自签名证书如何允许在Windows 8上安装。
编辑2:

已删除CERTUM“开源”开发者证书的提及,因为它没有被微软交叉认证(您获得的不是Certum TRUSTED NETWORK之一,该证书已被微软交叉认证)。


我非常确定你错了。我从Go Daddy获得了一个普通证书,在Windows 8预览版中,我的INF文件可以正常工作。我不需要向Microsoft提交任何东西。如果你需要帮助,请编写一个StackOverflow问题并给我更多细节。关于你应该提供的详细信息的想法,请参见https://dev59.com/Xuo6XIcBkEYKwwoYPSDf。请在此处发表评论或其他内容,以便我知道您何时编写了您的问题。 - David Grayson
我已经更新了我的答案,包括大约三天的试错信息。我已经成功地获得了自签名证书签名的.cat文件和我自己的authenticode签名的.cat文件(在win8和早期的Windows版本上都可以)。 - rajkosto
2
这是 /ac,不是 '/ca'。这是 /pa,不是 /pe。而且,我已经成功地签署了一些简单的驱动程序包,它们只包含一个 INF 文件和一个 CAT 文件,而没有使用交叉证书;最重要的是,你的信任链必须回溯到 Trusted Root Certification Store 中的某个东西。我引用个人经验和 http://msdn.microsoft.com/en-us/library/windows/hardware/gg487332.aspx 作为我的信息来源。此外,对于验证驱动程序包,我认为使用 /pa 选项是正确的,因为这就是在 kmcs_walkthrough.doc 中所做的。 - David Grayson
1
是的...但这仅适用于您没有任何.sys文件的情况。一旦您也需要签署这些文件,您必须包括交叉证书。而且您不能只是不签署它们(我尝试过,使用手动的.cdf文件),因为整个驱动程序包必须在.cat文件中,而不仅仅是inf文件(即使.sys文件具有嵌入式签名)。 - rajkosto
是的,它们可以加时间戳!使用“signtool verify /v…”进行检查。如果您使用“/tr“http://www.startssl.com/timestamp””进行时间戳,那么它可以正常工作。此外,即使StartCom没有提供时间服务器,您仍然可以使用另一个,例如“/t http://timestamp.verisign.com/scripts/timstamp.dll”。 - 0xC0000022L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接