# 数字签名（Digital Signature）是什么？

> 数字签名是用私钥对消息计算出的一个值，任何持有对应公钥的人都能验证它，从而确认消息来源和内容未被篡改。

Source: https://ssl.sh/zh/glossary/digital-signature/
Last updated: 2026-11-10

数字签名方案包含三个操作：生成密钥对；签名（私钥加消息得到签名值）；验证（公钥、消息和签名值得出有效或无效）。通常先对消息做哈希，再对摘要签名。签名有效，说明它出自私钥持有者之手，而且消息之后没有被改动。常见方案有使用 PKCS#1 v1.5 或 PSS 填充的 [RSA](https://ssl.sh/zh/glossary/rsa/)、[ECDSA](https://ssl.sh/zh/glossary/ecdsa/)、Ed25519，以及后量子算法 [ML-DSA](https://ssl.sh/zh/glossary/ml-dsa/)。

## 为什么重要
TLS 在两个地方依赖签名。每张证书都带有签发者对证书内容的签名，客户端沿着[证书链](https://ssl.sh/zh/glossary/certificate-chain/)逐级验证，直到受信任的根证书。握手时服务器还要对握手记录签名（TLS 1.3 中是 CertificateVerify，TLS 1.2 使用 ECDHE 时是 ServerKeyExchange），证明自己持有证书对应的私钥。CT 日志的 SCT、OCSP 响应和 CRL 也都是签过名的。国内常说的"代码签名""电子签章"也是同一原理的应用。

## 例子
查看证书由什么算法签名，并亲手签名、验证一个文件：

```bash
openssl x509 -in example.com.crt -noout -text | grep 'Signature Algorithm'
openssl dgst -sha256 -sign example.com.key -out file.sig file.txt
openssl dgst -sha256 -verify example.com.pub -signature file.sig file.txt
```

签名匹配时最后一条命令会输出 `Verified OK`。

## 常见误区
- **签名就是用私钥加密。** 这只是对教科书 RSA 的粗略类比。ECDSA、Ed25519、ML-DSA 根本不做加密，实际的 RSA 签名也有专门的填充方式。
- **签名有效，内容就可信。** 签名只证明谁签的、内容没变，是否信任签名者是另一回事。
- **证书里的 Signature Algorithm 就是网站的密钥类型。** 那是签发者使用的算法，网站自己的密钥类型在 Subject Public Key Info 中，ECDSA 密钥的证书完全可能由 sha256WithRSAEncryption 签发。

## 相关术语

- [公钥](https://ssl.sh/zh/glossary/public-key/): 公钥是非对称密钥对中可以公开的一半，写在证书里，供他人验证由对应私钥生成的签名。
- [私钥](https://ssl.sh/zh/glossary/private-key/): 私钥是非对称密钥对中保密的那一半，TLS 服务器用它证明自己拥有证书里的那把公钥。
- [RSA](https://ssl.sh/zh/glossary/rsa/): RSA 是 1977 年提出的公钥算法，TLS 用它对证书和握手进行签名，在 TLS 1.3 之前还用它传输会话密钥。
- [ECDSA](https://ssl.sh/zh/glossary/ecdsa/): ECDSA 是基于椭圆曲线的数字签名算法，在 TLS 证书中作为 RSA 的替代方案，密钥和签名更小、签名运算更快。
- [哈希函数](https://ssl.sh/zh/glossary/hash-function/): 哈希函数（密码学哈希函数）把任意长度的输入映射为固定长度的摘要，且在计算上无法逆推输入，也无法找到摘要相同的两个输入。
- [证书链](https://ssl.sh/zh/glossary/certificate-chain/): 证书链是从网站终端证书经中间证书一直到受信任根证书的有序证书序列，每一张都由下一张签名。
- [ML-DSA](https://ssl.sh/zh/glossary/ml-dsa/): ML-DSA 是 NIST 于 2024 年 8 月在 FIPS 204 中标准化的基于格的后量子数字签名算法，源自 CRYSTALS-Dilithium。
