代码签名证书
什么是代码签名证书
摘自 一文看懂代码签名证书
代码签名证书是提供给软件开发者对其开发的软件代码进行数字签名,用于验证开发者身份真实性、保护代码的完整性。用户下载软件时,能通过数字签名验证软件来源可信,确认软件没有被非法篡改或植入病毒木马,保护用户不会被病毒、恶意代码和间谍软件所侵害,也保护了软件开发者的利益,让软件能在互联网上快速安全地发布。
软件开发商可以使用代码签名证书来签名内核代码 .sys文件、ActiveX文件、 .exe 和 .dll 文件、Java Applets、J2ME MIDlet、Office宏文件等。
软件代码数字签名原理
以微软代码为例,为了保证微软 Windows系统的安全和用户安全,微软推出了 Microsoft Authenticode 技术,即微软认证码技术,此技术保证了只有使用了 Windows 的受信任的根证书颁发机构颁发的代码签名证书对软件代码数字签名后才允许在 Windows 上运行,从而保证了软件代码来自真实的发行者和保证软件代码没有被非法篡改。
1、软件开发商在自己电脑上生成私钥 (.pvk) 和证书请求文件 (CSR) 提交给沃通CA, 同时提交有关身份证明文件 ( 如营业执照和第三方证明文件等 ) 给沃通CA查验, 沃通CA验证软件开发商身份后,颁发代码签名证书。
2、软件开发商用代码签名工具 ( 如: WoSignCode) 给要签名的代码生成一个 Hash 表,再用其私钥加密 Hash 表产生认证摘要,接着就把认证摘要连同其公钥与软件代码一起打包生成签名后的新的软件代码,软件开发商就可以把已经签名的代码放到网上发行了。
3、最终用户从网上下载已经签名的代码时,浏览器或操作系统会从签名代码中解读出其签名证书 ( 公钥 ) 和 Hash 表摘要,并与 Windows 的受信任的根证书相比较查验公钥证书的有效性和合法性,验证签名证书正确后,就可以确认此代码确实是来自真实的软件开发商。
4、接着,再使用签名时使用的同样算法对软件代码生成一个 Hash 表,并使用公钥解密软件包中的签名认证摘要,得出原始的Hash表,将其与新生成的Hash表进行对比验证,如果一致,则表明此代码在传输过程中未有任何修改,从而可以确认代码的一致性。

代码签名证书有什么作用
1、企业身份认证,保护发行商身份安全:通过对代码进行数字签名来标识发行商的身份,可保证发行商身份和代码在签名之后不被非法篡改。高等级的企业身份认证,用户下载软件更安心。
2、确保代码完整性:通过对代码数字签名来标识软件来源,记录软件开发者的真实身份,保证代码在签名之后,不被篡改。
3、防止用户下载有害文件:用户在下载已经签名的代码时,计算机会自动验证该代码的可信性,并提示用户可以放心下载和使用。保护了用户不会被病毒、恶意代码和间谍软件所侵害。
4、自动建立信誉:在 SmartScreen® 筛选器中快速自动建立信誉,避免出现警告信息,增加用户的信任。

使用软件签名证书
常见的证书颁发机构:DigiCert、Symantec、GlobalSign、Comodo、Thawte
签名工具:SignTool(微软)、jarsigner(Java)、iOS签名(苹果)
普通代码签名证书和EV代码签名证书的区别
按验证类型来分,代码签名证书可以分为两类:普通代码签名证书和EV代码签名证书。不论是普通代码签书还是EV代码签名证书,都支持对32位或者64位.exe, .dll, .cab, .ocx(ActiveX),.msi,.xpi等文件进行数字签名,签名成功后可减少软件下载时弹出的安全警告并保证代码的完整性,以及不被恶意篡改和传播。
一、验证方式和证书签发形式不同:

二、各品牌代码签名证书功能差别

不再支持pfx
所谓代码签名证书的“软证书”,是指无需借助另外的硬件,可以直接存储在电脑里面为软件进行数字签名的证书文件,这种文件通常格式是 pfx,可以像一张图片一样被无限复制。这种形式的代码签名证书在使用上非常方便,但同时带来了一定的安全风险,即无法严格的控制代码签名证书的使用和授权,有可能造成代码签名证书的泄露或者被未授权滥用。
因此,自2023年开始,代码签名证书行业都不再支持这种难于控制使用范围的“软证书”形式。根据 CA/B 论坛的标准要求,为了加强代码签名证书的私钥安全保护,从 2023 年 06 月 01 日 开始,OV代码签名证书须与 EV代码签名证书的私钥保护机制保持一致,即私钥必须存储在 FIPS 140 2 级以上、Common Criteria EAL 4 级以上或同等认证级别的硬件上。换句话说,“软证书”形式成为历史,新签发的证书必须存在专业的硬件设备中。行业俗称“硬证书”。
不再支持软证书这种对我们来说就比较麻烦了,这几天采购回来之后给了一个USBkey,插到电脑上启动SignTool来完成签名。这真是……

使用代码获取软件签名证书信息
在Windows下面查看(从右往左)如下图,点击好几步才能看到签名证书颁发和有效期,如何进行有效期到期之前的提醒呢?

这个都是APP开发同学到期之前提前和我们说,如果加一个自动检测和提醒功能,先要获取签名证书的这些信息,Google走起。
排在第一位的 Python获取exe或dll的数字签名 这个代码无法获取到

使用signify的方式【python】获取exe文件的数字签名时间戳信息 可以获取到想要的信息

还有一个获取更详细信息的改良版

有一个C++的版本获取应用程序数字签名 可能和作者的系统版本不一样,直接运行会报错,使用通灵义码进行修改后可以得到想要的信息,如下图:

还有chatgpt推荐用微软数字签名工具–SigCheck来获取,具体如下:

软件签名证书到期
当代码签名证书过期后,之前用它签名过的程序仍然有效,例如下面的这个exe,证书去年就过期了,但是在Windows11下面直接双击运行不弹出过期提示。


在证书过期前进行的签名仍然保持有效的原因,在于时间戳服务。时间戳在代码签名过程中起到关键作用:它允许证书的有效性延伸至签名时刻,不受证书本身有效期的限制。
时间戳服务是代码签名过程中不可或缺的一部分。通过在签名时添加一个时间戳,签名将不再受证书有效期的限制。即使证书本身过期,只要签名时证书是有效的,并且包含了有效的时间戳,签名就仍然有效。从根本上解决了证书过期对软件信任度的影响。第二,时间戳能够确保长期维护软件项目的可靠性,即便多年以后,只要当时的签名含有有效的时间戳,之前签名的软件仍可验证其完整性与来源。
再来看一个十多年前的APP,因为有时间戳,就算这个软件签名证书有效期都过了十多年,但是安装的时候Windows11也未弹出过期提醒。


写在最后
不管是Python还是sigcheck都需要安装对应的包,结合定时探测和通知平台来实现提前1个月来提醒进行商务续签通知。后期的挑战是一个USBkey如何让多个业务团队来共用,通过一个机器开远程桌面来,或者把这个操作包装成为一个API,需要再研究一番了。