客户端证书 (Client Certificate)
定义
客户端证书是 TLS 客户端在握手时出示、用来向服务器证明自身身份的 X.509 证书。
客户端证书认证的是"来连接的一方",而不是服务器。服务器开启客户端认证后,会在 TLS 握手中发送 CertificateRequest 消息,客户端回送自己的证书,并用对应私钥对握手记录签名,证明私钥在自己手里。这类证书通常带有 clientAuth 扩展密钥用途(1.3.6.1.5.5.7.3.2),持有者可以是设备、微服务、API 调用方,也可以是员工的浏览器或智能卡。
为什么重要
客户端证书能实现不依赖密码、抗钓鱼的强认证,是双向 TLS的基础。国内网银的 U 盾也是类似思路:把证书私钥放在硬件里,用于身份认证和交易签名。客户端证书一般由只被相关服务器信任的私有 CA签发。公共 TLS CA 正在退出客户端认证:Let's Encrypt 的 classic 配置从 2026 年 2 月 11 日起不再包含 clientAuth,Chrome 根证书计划要求 2027 年 3 月 15 日及以后签发的用户证书只能声明 serverAuth。拿公共服务器证书兼作客户端证书的系统需要尽快迁移到专用的证书体系。
例子
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 并校验证书主题。