# 代码签名证书是什么？定义、例子与常见误区

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

Source: https://ssl.sh/zh/glossary/code-signing-certificate/
Last updated: 2026-11-10

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

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

## 例子
```powershell
signtool sign /fd SHA256 /tr http://timestamp.example.com /td SHA256 /a setup.exe
signtool verify /pa /v setup.exe
```

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

## 相关术语

- [EKU](https://ssl.sh/zh/glossary/extended-key-usage/): EKU 即扩展密钥用途，是列出证书可用于哪些目的（如 serverAuth 服务器认证、clientAuth 客户端认证、代码签名）的 X.509 扩展。
- [HSM](https://ssl.sh/zh/glossary/hsm/): HSM 是一种防篡改的硬件设备，在内部生成、保存并使用密钥，私钥不会以明文形式离开设备。
- [数字签名](https://ssl.sh/zh/glossary/digital-signature/): 数字签名是用私钥对消息计算出的一个值，任何持有对应公钥的人都能验证它，从而确认消息来源和内容未被篡改。
- [X.509](https://ssl.sh/zh/glossary/x509/): X.509 是 ITU-T 制定的公钥证书标准格式，其互联网配置规范 RFC 5280 规定了 TLS 所用证书的结构和验证方法。
- [PKCS#7](https://ssl.sh/zh/glossary/pkcs7/): PKCS#7 是一种用于签名和加密数据的格式，在 .p7b 或 .p7c 文件中常用来打包一组证书，不含私钥。
- [证书颁发机构](https://ssl.sh/zh/glossary/certificate-authority/): 证书颁发机构（CA）是负责审核申请者、签发数字证书，并把公钥与域名或身份绑定在一起的机构。
- [私钥](https://ssl.sh/zh/glossary/private-key/): 私钥是非对称密钥对中保密的那一半，TLS 服务器用它证明自己拥有证书里的那把公钥。
