知识

微软代码签名及驱动签名应用实践

微软自2016年1月1日起更新代码签名证书验签策略(Windows Enforcement of Authenticode Code Signing and Timestamping),取消对SHA1算法证书在软件数字签名验签中的支持,并在2017年1月1日起在Windows 10中取消对sha1算法时间戳摘要的支持。与此同时,Windows 7之前的系统对sha256算法的支持非常有限。

微软这次的突击更新,给软件开发者带来了大麻烦。同时微软在不同时间段发布的各版本sha256算法系统补丁安装情况,以及不同类型扩展名和不同应用模式的文件,对数字签名都存在特定的需求。一时间软件开发者对程序数字签名的认识变得异常混乱,程序发布之后经常会因为数字签名不符合微软签名验证策略而告警或拦截。

本文总结各版本系统sha256算法相关补丁、不同类型应用文件及不同扩展名文件对数字签名的需求,以及不同模式数字签名的文件在各应用场景下的兼容性情况,为软件开发者解决软件开发者因不恰当的数字签名使用,造成微软验证策略拦截而告警或拦截应用的诸多问题。希望能够给予软件开发者在数字签名方面一个完整清晰的答案。


影响

任何在2016年1月1日之前使用SHA1算法证书签名的文件(签名需含时间戳),在Windows 7及以上版本操作系统中的验签可正常支持到2020年1月1号。

2016年1月1号之后,使用SHA1算法证书签名的应用模式文件,在Windows 7及以上版本操作系统中不被支持。

2017年1月1日之后,使用sha1算法文件摘要(/fd sha256)或使用sha1算法时间戳的签名,在Windows 7及以上版本操作系统中不被支持。因sha256文件摘要及RFC3161新版sha256时间戳在Windows 7 以下版本系统中不受支持,2017年1月1日前的单签名文件,扔推荐使用sha1算法文件摘要及旧版时间戳。

仅持有sha1算法的代码签名证书用户,需要将证书升级到SHA256算法。升级后原sha1算法证书仍然有效。可根据应用情况,灵活使用sha1证书单签名、sha256证书单签名或双签名方式,确保文件数字签名的的兼容性不受影响。


为特定格式文件指定不同方式的签名

不同格式或应用模式的文件,推荐使用不同的签名证书及签名参数。推荐参数如下:

SHA1证书

/fd sha1  /t

SHA256证书

/fd sha1  /t

SHA1证书

/fd sha1  /t

SHA256证书
/fd sha256  /tr /td sha256

.cat文件

不推荐

内核驱动文件

可用

不推荐

Vista内核驱动文件

/ph

可用

.msi文件

ActiveX文件

其他PE格式客户性文件

可用


以下简要概述Signtool中影响签名兼容性的部分签名参数

/fd 即 File Digest(文件摘要算法),可选值:sha1、sha256、sha284、sha512,默认值sha1

/t 即旧版时间戳地址

/tr 新版RFC3161时间戳地址

/td 新版RFC3161时间戳签名摘要算法,可选值:sha1、sha256 ,默认值sha1。如需使用sha256算法时间戳签名摘要,/td 参数必须在 /tr之后指定。

/ph 指定SignTool 应打印和验证页面哈希值。Vista内核驱动文件签名必须。

 

内核驱动文件

· .cat文件不支持双签名,只能选择单签名。微软目前对驱动文件并没有限定必须使用sha256算法的证书,为适配最优的兼容性,推荐使用sha1单签名。

· .sys、.dll等文件:内核驱动文件中的PE格式文件,微软虽未限定必须使用sha256算法证书做签名,为适配最优的应用场景,建议应尽量使用双签名。

.msi文件

· .msi文件不支持双签名,为适配最优的应用场景,建议应尽量使sha256单签名。

ActiveX控件程序

· .cab文件不支持双签名,为避免新版本操作系统中IE浏览器错误拦截,建议尽量使用sha256单签名。

· .cab文件中内含的pe格式控件文件,为避免新版本操作系统中IE浏览器错误拦截,建议尽量使用sha256单签名。

· .ocx格式直接发布的控件文件,为避免新版本操作系统中IE浏览器错误拦截,建议尽量使用sha256单签名。

其他Pe格式可执行文件

· 应用模式PE格式可执行文件,应尽量使用双签名以适配不同版本操作系统。

天威诚信代码签名证书助手

天威诚信代码签名证书助手支持创建证书请求和安装,支持管理多张证书。

当选择使用单签名规则时,代码签名证书助手将默认使用兼容性更好的 /fd sha1 及 /t 参数为您做程序签名。

如果您同时拥有sha1和sha256算法的证书,还可以创建新的签名规则从而方便快捷的支持双签名操作。双签名中将默认使用 sha1算法证书的 /fd sha1 + /t 和 sha256算法证书的 /fd sha256 + /tr + /td sha256,既保障兼容性,同时确保签名的安全性和易用性。

代码签名证书助手下载:http://www.itrus.cn/soft/iTrusSignTool.exe 

若您使用微软signtool工具做命令行下的签名,也可以参考signtool相关签名要求。


双签名系统环境要求

为解决SHA1算法证书被逐步淘汰禁用,同时SHA256算法证书在部分版本系统和环境中不被支持的问题,软件开发者可使用双签名解决方案一达到更好的兼容不同平台的目标。可为同一程序同时添加 SHA1 及 SHA256签名,允许不同操作系统自动适配程序签名信息。

要使用双签名,须升级signtool.exe到 6.3.9600或以上版本(Windows SDK V8.1及以上版本中包提取),签名用机操作系统需 Windows 8 及以上版本。Windows 7 及Server 2008 系统用户,可按照微软文档中介绍的signtool依赖文件,从sdk中提取可执行的签名工具包。您也可以选择从天威诚信下载提取好的signtool依赖文件:http://www.itrus.cn/soft/signtool.zip

双签名操作:

SHA1签名:

signtool.exe sign /f sha1.pfx  /p  /t http://timestamp.verisign.com/scripts/timstamp.dll

可附加 /ac 用法,添加交叉证书做驱动模式签名

SHA256签名:

signtool.exe sign /f sha256.pfx /p  /as /fd sha256 /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp 

可附加 /ac 用法,添加交叉证书做驱动模式签名


代码签名可选的时间戳服务器:

品牌

SHA1时间戳

SHA256时间戳

Symantec

http://timestamp.verisign.com/scripts/timstamp.dll

http://sha256timestamp.ws.symantec.com/sha256/timestamp

GlobalSign

http://timestamp.globalsign.com/scripts/timestamp.dll

http://timestamp.globalsign.com/?signature=sha2

Comodo

http://timestamp.comodoca.com/authenticode

http://timestamp.comodoca.com/rfc3161


完成两次签名操作之后,即可在 Windows 8 及以上版本系统中(Windows 7 及Server 2008 R2需安装KB3033929),通过右键点击已签名文件, “属性”=>“数字签名”,并看到 sha1 及 sha256两个版本的签名信息了。


兼容性

随着SHA1算法安全性逐年降低,各机构均制定了详细的时间表以启用新的SHA256算法。根据微软最新的策略,一些老版本Windows操作系统中,仍然存在SHA256算法的兼容性问题,而部分新版本操作系统已经开始禁用sha1算法。策略详情请参考下表:



文件摘要算法和时间戳的影响:

在Windows 7 及以上版本操作系统中,仅支持/t 时间戳用法及 /fd sha1文件摘要算法。而在2017年1月1日之后,Windows 10应用模式签名将仅支持 /tr 时间戳,并要求使用 /td sha256。


如何消除SmartScreen报告“此程序不是常见的下载内容,可能会危害您的计算机”提示?

非EV代码签名证书,需要累积软件下载安装量并基于代码签名证书来获得声誉。在累积足够的声誉后,该提示将自动消除。微软未发布声誉评价系统的详细策略数据,但微软策略表明,声誉评价与软件签发时间及安装下载量成正相关。即签发时间越久,下载安装量越大,提示消除的可能性越大。

为帮助您不受SmartScreen声誉累积系统的影响,建议您结合应用场景选择下列方法,消除提示。
1. 使用EV代码签名证书签名通过网络下载的可执行文件
EV代码签名证书可立即获得信誉,无需通过累积过程即可快速消除不友善的提示信息。
2. 使用已获得良好声誉评价的非EV代码签名证书签名通过网络下载的可执行文件。
使用新的非EV证书签名安装包中的所有可执行程序文件,然后使用已获得声誉并且不会出现拦截提示的证书签名打包后的setup文件。用户在安装setup文件后,将同时为新证书累积信誉。在获得足够安装量和信誉之后,新证书将不再出现拦截提示,可正常投入使用。
3. 将可执行程序文件打包成zip、rar等格式压缩包。用户下载解压后执行安装操作。
未标记为网络下载的可执行程序,将不会被SmartScreen拦截。因此,使用压缩软件压缩的可执行程序,将不会被拦截。注意在为可执行程序打压缩包之前,需确保可执行程序未被标记为通过网络下载的文件。
4. 尽快发布非EV代码签名证书签名的文件,累积足够信誉。
通过自然累积信誉发布应用虽然是一个非常痛苦的过程,但当上述条件均无法应用时,自然累积信誉的方式发布应用就会成为必然选择了。