# 客户端证书是什么？定义、例子与常见误区

> 客户端证书是 TLS 客户端在握手时出示、用来向服务器证明自身身份的 X.509 证书。

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

客户端证书认证的是"来连接的一方"，而不是服务器。服务器开启客户端认证后，会在 [TLS 握手](https://ssl.sh/zh/glossary/tls-handshake/)中发送 CertificateRequest 消息，客户端回送自己的证书，并用对应私钥对握手记录签名，证明私钥在自己手里。这类证书通常带有 clientAuth [扩展密钥用途](https://ssl.sh/zh/glossary/extended-key-usage/)（1.3.6.1.5.5.7.3.2），持有者可以是设备、微服务、API 调用方，也可以是员工的浏览器或智能卡。

## 为什么重要
客户端证书能实现不依赖密码、抗钓鱼的强认证，是[双向 TLS](https://ssl.sh/zh/glossary/mtls/)的基础。国内网银的 U 盾也是类似思路：把证书私钥放在硬件里，用于身份认证和交易签名。客户端证书一般由只被相关服务器信任的[私有 CA](https://ssl.sh/zh/glossary/private-ca/)签发。公共 TLS CA 正在退出客户端认证：Let's Encrypt 的 classic 配置从 2026 年 2 月 11 日起不再包含 clientAuth，Chrome 根证书计划要求 2027 年 3 月 15 日及以后签发的用户证书只能声明 serverAuth。拿公共服务器证书兼作客户端证书的系统需要尽快迁移到专用的证书体系。

## 例子
```bash
curl --cert client.crt --key client.key https://api.example.com/v1/status
openssl x509 -in client.crt -noout -ext extendedKeyUsage
# X509v3 Extended Key Usage:
#     TLS Web Client Authentication
```

## 常见误区
- **什么证书都能当客户端证书。** 服务器和 TLS 库会检查 clientAuth 用途，而公共 TLS 证书正在失去它。
- **客户端证书负责加密流量。** 加密用的是密钥交换得出的会话密钥，客户端证书只负责证明身份。
- **服务端信任公共 CA 做客户端认证没问题。** 这样任何能从该 CA 拿到证书的人都能通过认证，应使用专用私有 CA 并校验证书主题。

## 相关术语

- [mTLS](https://ssl.sh/zh/glossary/mtls/): mTLS 是服务器和客户端在握手中都用 X.509 证书向对方证明身份的 TLS，也叫双向 TLS 认证。
- [EKU](https://ssl.sh/zh/glossary/extended-key-usage/): EKU 即扩展密钥用途，是列出证书可用于哪些目的（如 serverAuth 服务器认证、clientAuth 客户端认证、代码签名）的 X.509 扩展。
- [私有 CA](https://ssl.sh/zh/glossary/private-ca/): 私有 CA 是企业为自己的系统和设备搭建的证书颁发机构，其根证书只在企业主动安装的设备上受信任。
- [TLS 握手](https://ssl.sh/zh/glossary/tls-handshake/): TLS 握手是 TLS 连接开始时的一组消息交换，客户端与服务器在其中协商协议版本和密码套件、验证服务器身份并派生会话密钥。
- [X.509](https://ssl.sh/zh/glossary/x509/): X.509 是 ITU-T 制定的公钥证书标准格式，其互联网配置规范 RFC 5280 规定了 TLS 所用证书的结构和验证方法。
- [PKCS#12](https://ssl.sh/zh/glossary/pkcs12/): PKCS#12 是一种用口令保护的二进制容器格式，可以把私钥、证书和证书链打包进一个文件，扩展名通常是 .p12 或 .pfx。
- [S/MIME](https://ssl.sh/zh/glossary/smime/): S/MIME 是一种使用 X.509 证书和 CMS 格式对电子邮件进行端到端签名和加密的标准。
