mTLS (双向 TLS 认证)
定义
mTLS 是服务器和客户端在握手中都用 X.509 证书向对方证明身份的 TLS,也叫双向 TLS 认证。
mTLS(Mutual TLS)不是一个新协议,而是开启了客户端认证的标准 TLS。服务器照常出示自己的证书,然后要求客户端也出示证书;客户端发送客户端证书并用私钥对握手签名,服务器再用自己信任的 CA 校验这张证书。握手结束后,不只是客户端知道服务器是谁,服务器也确切知道客户端是谁。
为什么重要
mTLS 是零信任网络和服务网格(如 Istio、Linkerd)里服务间认证的主力,也广泛用于物联网设备身份、银行和支付类开放 API,国内一些金融机构的对接接口也要求双向证书认证。身份证书一般由私有 CA签发,有效期短、自动轮换。由于公共 CA 正在把 clientAuth 从 TLS 证书中移除(Let's Encrypt 自 2026 年 2 月 11 日起;Chrome 要求 2027 年 3 月 15 日起签发的用户证书只含 serverAuth),客户端一侧不要再依赖公共服务器证书。
例子
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_client_certificate /etc/nginx/certs/client-ca.pem;
ssl_verify_client on;
}
校验结果可以从 $ssl_client_verify 变量读取,客户端证书主题在 $ssl_client_s_dn 里,可交给后端做授权判断。
常见误区
- mTLS 是另一种协议。 它就是开启了可选客户端认证步骤的 TLS 1.2 或 1.3。
- 用了 mTLS 就不用做授权。 mTLS 只解决"你是谁","你能做什么"仍要应用自己判断。
- 经过任何代理都能用。 如果负载均衡做了 TLS 终止,后端看不到客户端证书,除非代理自己校验并把身份信息转发过去。