如何给软件代码双签名

今年1月中旬,微软官方发布通知:从2020年1月14日起微软正式停止对Win7系统的更新。而全球的CA机构在2020年初,也宣布已不再颁发SHA-1代码签名证书。随着操作系统更替,代码签名证书的起落,如何让自己的软件在各个版本Windows系统通行,成了软件开发者急需解决的难题。给软件代码双签名就成了无数软件开发者经常使用的一个操作方法。
如何给软件代码双签名

软件在操作系统中为什么要进行代码签名?

首先,先科普一下,软件在操作系统中为什么要进行代码签名?小编之前讲到的什么是代码签名证书中有提到,代码签名证书用于验证开发者身份真实性、保护代码的完整性。用户下载软件时,能通过数字签名验证软件来源可信,确认软件、代码没有被非法篡改或植入病毒。所以,软件开发者会在软件发行前使用代码签名证书为软件代码添加数字签名。

其次,我们来了解一下代码签名证书的算法:SHA算法,又叫安全哈希算法。它是用于数字签名的散列算法,其中包含了SHA1,SHA2(包括了SHA-224,SHA-256,SHA-384,SHA-512)这几种单向散列算法。目前使用最多的是SHA-256算法,而SHA1签名算法在很多新的操作系统中不再采用。

例如,微软表示Winows7及其以上版本操作系统在2015年12月31日之后已弃用SHA-1签名算法的代码签名,换句话说,Winows7(更新补丁后)及其以上版本操作系统不再信任采用SHA1算法签名的软件代码,而SHA-256代码证书签名的内核模式代码将在这些操作系统上可以正确运行。但是在老版本的操作系统,如Windows Vista,Windows7(未升级补丁)和Windows server 2008(未升级补丁),如果代码使用SHA-256 代码证书签名,则会触发安全警告。这时给软件代码进行双签名就可以让软件在各个版本Windows系统通行。

什么是双签名?

双签名就是对一个软件做两次签名,先进行SHA1签名,之后再进行SHA2签名的做法就叫做双签名。双签名需要一张支持SHA1和SHA2算法的代码签名证书,利用具备双签名功能的工具导入申请的代码签名证书对软件或应用程序进行双签名,签发后的软件或应用程序就支持SHA1和SHA2签名算法。
例如:同时在Windows7和Windows10上运行内核驱动签名,Windows10要求使用SHA2算法签名,而Windows7(未更新补丁的)因其兼容性只能使用SHA1算法签名,那么使用一张支持双签SHA1和SHA2算法的代码签名证书就可以实现。所以,一张双签名的代码签名证书进行数字签名后可以满足不同操作系统的兼容性。双签名成功的应用程序即可查看到数字签名的详细信息。操作如下:

右键单击已签名的应用程序文件,点击【属性】,单击【数字签名】选项可见同时列出SHA1和SHA256签名算法以及时间戳,如图所示:
如何给软件代码双签名
需要提醒您的是Windows7系统需要安装双签名补丁,否则无法识别双签名。
没有安装过双签名补丁的系统,看不到双签名,且SHA256证书会显示签名损坏。如下图所示:
如何给软件代码双签名

那么您需要下载安装补丁到您的操作系统上,打了补丁的系统将可以看到双签名,如图所示:
如何给软件代码双签名
附上补丁地址:
Security Update for Windows 7 for x64-based Systems (KB3033929)
https://www.microsoft.com/en-us/download/details.aspx?id=46148

由于SHA-256更强的安全性,现在SHA-256已经作为代码签名证书的行业标准签名算法。基于SHA-1算法的弱点以及遵循代码签名行业标准两个因素,Microsoft已在2019年4月到9月分阶段进行Windows更新以仅使用更安全的SHA-2算法。
Microsoft已发布了相关补丁提供给Windows 7 SP1,Windows Server 2008 R2 SP1(更新补丁包KB4490628 和KB4474419)和Windows Server 2008 SP2(更新补丁包KB4493730和KB4474419)用户升级,请及时更新以支持SHA-256证书签名的内核模式代码。除此之外,目前Windows大多数新的操作系统已经从支持双签(SHA-1 / SHA-2)更改为仅支持SHA-256代码签名证书了。如您还未更新系统可下载相对应的补丁包。下载地址如下:
https://support.microsoft.com/en-us/help/4472027/2019-sha-2-code-signing-support-requirement-for-windows-and-wsus

上一篇:密码学系列之:NIST和SHA算法


下一篇:漫画:什么是SHA系列算法?