数字签名 (Digital Signature)
定义
数字签名是用私钥对消息计算出的一个值,任何持有对应公钥的人都能验证它,从而确认消息来源和内容未被篡改。
数字签名方案包含三个操作:生成密钥对;签名(私钥加消息得到签名值);验证(公钥、消息和签名值得出有效或无效)。通常先对消息做哈希,再对摘要签名。签名有效,说明它出自私钥持有者之手,而且消息之后没有被改动。常见方案有使用 PKCS#1 v1.5 或 PSS 填充的 RSA、ECDSA、Ed25519,以及后量子算法 ML-DSA。
为什么重要
TLS 在两个地方依赖签名。每张证书都带有签发者对证书内容的签名,客户端沿着证书链逐级验证,直到受信任的根证书。握手时服务器还要对握手记录签名(TLS 1.3 中是 CertificateVerify,TLS 1.2 使用 ECDHE 时是 ServerKeyExchange),证明自己持有证书对应的私钥。CT 日志的 SCT、OCSP 响应和 CRL 也都是签过名的。国内常说的"代码签名""电子签章"也是同一原理的应用。
例子
查看证书由什么算法签名,并亲手签名、验证一个文件:
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 签发。