术语表

公钥 (Public Key)

最后核实

定义

公钥是非对称密钥对中可以公开的一半,写在证书里,供他人验证由对应私钥生成的签名。

公钥是非对称密钥对中可以自由分发的一半。在 X.509 证书里,它和算法信息一起放在 SubjectPublicKeyInfo(SPKI)字段中,常见算法有 RSA、P-256 曲线上的 ECDSA 以及 Ed25519。证书存在的意义就是把公钥和名字绑在一起:CA 对证书的数字签名表明"这把公钥属于 example.com"。任何人都可以用公钥验证对应私钥生成的签名;对 RSA 来说,公钥还可以加密只有私钥能解开的数据。

为什么重要

客户端用服务器证书里的公钥验证 TLS 握手中的签名,从而确认对面就是私钥持有者,而不是冒充者。SPKI 的哈希值常用于证书固定、DANE 的 TLSA 记录,以及核对私钥、CSR 和证书是否配套。如果续期时沿用同一对密钥,证书变了,SPKI 哈希却保持不变;反过来,一旦换了密钥,所有固定了旧哈希的客户端都会连接失败,所以做公钥固定的 App 必须和密钥轮换计划一起考虑。

例子

openssl x509 -in example.com.crt -noout -pubkey > example.com.pub.pem
openssl pkey -pubin -in example.com.pub.pem -noout -text | head -1
# Public-Key: (256 bit)

常见误区

  • 公钥也要保密。 公钥本来就是公开的,需要保护的只有私钥。
  • TLS 用服务器公钥加密所有数据。 TLS 1.3 中证书密钥只负责签名,数据加密密钥来自临时的 (EC)DHE 密钥交换。
  • 公钥就是证书。 证书是在公钥外面加上身份信息、有效期和 CA 签名的"包装"。

延伸阅读