术语表

代码签名证书 (Code Signing Certificate)

最后核实

定义

代码签名证书是带有 codeSigning 扩展密钥用途、用来给软件做数字签名,让用户能核实发布者身份和文件完整性的 X.509 证书。

代码签名证书把软件发布者的身份和一对密钥绑定在一起,证书里带有 codeSigning 扩展密钥用途(OID 1.3.6.1.5.5.7.3.3)。开发者用私钥对 exe、msi 安装包、驱动、脚本等文件签名,操作系统或运行环境在安装、运行前用受信任的根证书验证签名。Windows Authenticode 使用的公共代码签名证书按 CA/浏览器论坛的《代码签名基线要求》签发,这套规则独立于 TLS 证书的基线要求;macOS、iOS 则使用 Apple 给注册开发者签发的证书。

为什么重要

有效签名能告诉用户和安全软件"这个文件是谁发布的、签名后没被改过",未签名的安装包更容易触发系统和安全软件的警告。由于被盗的签名私钥曾被用来给恶意软件签名,现行规则要求代码签名私钥必须在硬件中生成和保存,例如 USB Key 硬件令牌、HSM 或云端签名服务,不能再以可导出的文件形式交付。签名时附加可信时间戳(RFC 3161),证书过期后签名依然有效。

例子

signtool sign /fd SHA256 /tr http://timestamp.example.com /td SHA256 /a setup.exe
signtool verify /pa /v setup.exe

常见误区

  • 网站的 TLS 证书也能签代码。 TLS 证书没有 codeSigning 用途,浏览器根证书计划也要求 TLS 证书体系只用于服务器认证。
  • 签了名的软件就安全。 签名只证明发布者身份和文件完整,不代表代码没有恶意。
  • 证书过期后签名就失效。 签名时加了时间戳就不会;只有没加时间戳的签名会在证书过期后失效。

延伸阅读