# 公钥（Public Key）是什么？定义、例子与常见误区

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

Source: https://ssl.sh/zh/glossary/public-key/
Last updated: 2026-11-10

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

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

## 例子
```bash
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 签名的"包装"。

## 相关术语

- [私钥](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 的替代方案，密钥和签名更小、签名运算更快。
- [X.509](https://ssl.sh/zh/glossary/x509/): X.509 是 ITU-T 制定的公钥证书标准格式，其互联网配置规范 RFC 5280 规定了 TLS 所用证书的结构和验证方法。
- [证书指纹](https://ssl.sh/zh/glossary/certificate-fingerprint/): 证书指纹是对证书 DER 编码计算出的哈希值（通常用 SHA-256），用来唯一标识一张证书，它本身并不存储在证书里。
- [证书锁定](https://ssl.sh/zh/glossary/certificate-pinning/): 证书锁定是客户端侧的一项检查：只有服务器证书链中包含事先配置好的特定证书或公钥时，客户端才接受这次连接。
- [数字签名](https://ssl.sh/zh/glossary/digital-signature/): 数字签名是用私钥对消息计算出的一个值，任何持有对应公钥的人都能验证它，从而确认消息来源和内容未被篡改。
