摘要:代码签名使用私钥对与文件相关的签名数据进行签署,验证方再依据公钥、证书链及平台规则检查结果。文件被不允许的修改后,完整性验证可能失败;但签名有效不等于程序没有恶意行为。企业应围绕最终交付包验签,妥善保管Token 或 HSM 中的密钥,并保存时间戳及发布记录。
拿到一个安装包,看到发布者名称,只是检查的开始。接收方还需要确认,当前这份文件是否与签署时受保护的内容一致,以及签名是否能够建立到适用的可信证书链。
代码签名正是把发布者的证书身份与文件的完整性检查联系起来。它不会把整个软件“加密成不能看”,也不是向文件里放一段无法删除的公司名称。
文件内容怎样进入签名
签名工具按相应文件格式和签名规范处理内容,计算需要保护数据的摘要,再使用私钥生成数字签名,并将签名与证书等信息按格式保存。哈希摘要帮助识别内容变化,数字签名则使验证方可以借助公钥检查签署关系。
不能将这个过程简单说成“用私钥加密整个程序”。不同签名算法的工作方式不同,文件格式也可能规定哪些内容进入摘要、哪些变化允许发生。准确的判断应交给兼容的验证工具,而不是只比较签名前后文件是否字节完全相同。
证书提供公钥与经核实发布者身份的关联。取得证书并不意味着CA 审阅了全部源代码,也不表示平台对软件功能作出安全背书。身份、完整性和程序行为应分别理解。
私钥决定谁能够生成新的有效签名
公钥可以被验证方使用,私钥则应由获授权方保护。若私钥被滥用,攻击者可能为危险文件生成以该身份呈现的签名,因此密钥保护不是签名前的可选附加动作。
GlobalSign 代码签名方案可按需求确认 Token 或 HSM 实现。Token 需要妥善管理设备、使用权限与口令;HSM 则要核对设备与签名工具的兼容性、访问授权和运维方式。两者都不能仅因为是硬件,就被理解为无需审批或不会发生账号滥用。
发布团队还应明确谁批准签署、哪些产物可以进入签名工位,以及签后交付物如何保存。不要把“能使用证书的人”自动当成“可以批准所有发布的人”。
对最终安装包运行验证
以普通 Windows 应用的 Authenticode 签名为例,在已安装适用 WindowsSDK 工具的环境中,可以对自己的发布包使用以下检查命令,文件名应替换为真实路径:
signtool verify /pa /v app.exe
这里 /pa 使用相应默认 Authenticode 验证策略,/v 输出详细信息。它不应直接被当作所有内核驱动和目录签名场景的通用命令,那些场景需要按对应平台规则检查。
观察结果时,不只看是否出现一个成功字样。应核对签署身份是否预期、证书链与时间信息是否合理,并保留工具返回状态和详细输出。需要排查时,记录目标系统及验证环境,避免两台电脑使用不同信任库却被误判为文件内容不同。
可以在不用于分发的测试副本上检查修改后的结果,但不要随意破坏生产安装包来“测试安全性”。不同修改是否影响签名,取决于文件签名格式和平台规则;最终以正确验证方式的结果为准。
时间戳解决的是签署时间问题
证书有有效期,软件却可能在更久以后才被安装。适用的可信时间戳可为签署发生的时间提供验证依据,但最终签名接受与否仍与平台规则、证书状态及相关验证条件有关。
时间戳不会修复文件被篡改,也不会允许证书过期后继续使用它生成新的合规签名。签名后应验证时间戳是否成功加入,不能只因为命令里配置过时间戳地址就认定已经完成。
交付时还要确保发布出去的就是已经验签的那个产物。再压缩、重新打包或通过第三方下载器分发,都可能改变需要验证的对象。应保留最终包、哈希及发布版本的对应关系,让用户报告问题时能够准确定位。
FAQ
Q1:代码签名是不是将程序加密,防止别人查看?
A:不是。代码签名主要用于签署身份与完整性验证,不能代替代码加密、混淆或访问控制。
Q2:只要签名验证成功,就能确定程序没有恶意代码吗?
A:不能。签名不能证明程序行为无害,软件仍需安全测试与运行检测。
Q3:证书文件可以发给别人,为什么还要保护私钥?
A:证书中包含公钥,私钥则用于产生签名。泄露私钥或其使用权限,可能让未经批准的文件获得该身份的签名。
Q4:加了时间戳,被修改的文件就还能通过验证吗?
A:时间戳不是完整性修复工具。受保护内容发生不允许的变化,仍应由相应验证流程识别。
关于 GlobalSign 代码签名与时间戳
GlobalSign 提供相应代码签名证书和可信时间戳服务,支持企业建立发布者身份及签署时间的验证依据。Token 或 HSM 的使用、发布审批和最终产物检查仍由企业落实;签名提供完整性与身份信息,不替代软件安全测试。
资料来源
GlobalSign 代码签名
https://www.globalsign.cn/code-signing
GlobalSign 可信时间戳
https://www.globalsign.cn/timestamp-service
Microsoft 使用 SignTool 验证文件签名
https://learn.microsoft.com/en-us/windows/win32/seccrypto/using-signtool-to-verify-a-file-signature