首页/网络/协议速查/双向 TLS(mTLS)

双向 TLS(mTLS)

除服务器证书外还要求客户端提供证书并验证:服务间通信、零信任、K8s 网关的常见做法;证书即身份,需配套签发与吊销体系。

协议速查网络更新于 2026-10-13

mTLS 是什么

普通 TLS 只验证服务器证书,双向 TLS(mTLS)要求客户端也出示证书并通过验证:服务器用配置的 CA 证书链校验客户端证书,客户端身份就来自证书里的主体信息。它是服务间通信、零信任架构、Kubernetes 网关的常见做法,代价是要有一套签发、分发与轮换体系。

基本信息

验证方向双向:客户端验服务器,服务器也验客户端
服务器侧关键项ssl_client_certificate 指定受信 CA,ssl_verify_client on 开启校验
客户端侧curl 用 --cert / --key,openssl s_client 同样支持指定证书
身份提取Nginx 可用 $ssl_client_s_dn 把证书主体传给后端做鉴权
有效期通常很短(小时级到 90 天),依赖自动化轮换

典型使用场景

  • 服务间调用互认身份:替代长期共享的静态 Token
  • 零信任网关:只有持有效设备证书的终端才能访问内部系统
  • 服务网格与网关入口:由控制面自动签发与轮换工作负载证书
  • 对外 API 合作方接入:给合作方单独的客户端证书,按主体限流与审计
  • 数据库或中间件开启客户端证书校验,阻断未授权客户端
  • 替换老旧的 IP 白名单机制,让授权关系随证书而非网络位置变化

最小示例

最小示例
ssl_client_certificate /etc/nginx/ca.pem;  # 受信的客户端 CA 链
ssl_verify_client on;                      # 强制校验,optional 为可选
ssl_verify_depth 2;                        # 允许的链深度
# 后端读取 $ssl_client_s_dn / $ssl_client_verify 做鉴权与审计

客户端验证

客户端验证
curl --cert client.pem --key client.key https://m.example.com/ -v 2>&1 | grep -i 'certificate'
openssl s_client -connect m.example.com:443 -cert client.pem -key client.key </dev/null 2>&1 | grep -i 'verify return'
openssl s_client -connect m.example.com:443 </dev/null 2>&1 | grep -i 'verify return'  # 不带证书应当失败

常见失败与定位

现象原因确认方法
握手直接断开无提示服务器要求客户端证书但客户端未提供不带证书再跑一次对比
certificate verify failed客户端证书的签发者不在服务器受信 CA 中核对客户端证书的签发者与 CA 链
主体取值为空证书与私钥不匹配或未配置 ssl_client_certificate比对证书与私钥模数
业务侧鉴权失败DN 格式与后端解析规则不一致打印 $ssl_client_s_dn 看实际格式
mTLS 证书的有效期通常很短,靠人工分发不可持续。生产上要用 cert-manager、SPIFFE 之类的体系做自动签发与轮换,否则证书到期就是一次系统性故障。

易错点

  • 客户端证书吊销基本不落地:CRL 与 OCSP 在服务间通信里很少真正生效,现实方案是短有效期加自动轮换
  • 把 mTLS 当访问控制用却不看主体:任何持有受信 CA 签发证书的客户端都能通过校验,必须再按 DN 或 SAN 做授权
  • CA 私钥与被签发的服务证书放在同一处:一处泄露即全盘失效,CA 必须离线或由专门的签发服务保管
  • 只配了 ssl_client_certificate 却忘了 ssl_verify_client on:证书被请求但结果不校验,形成「看着有证书其实没验证」的假安全
  • 证书链不完整:中间 CA 缺失时客户端校验失败,务必把完整链配给对端

数据来源与参考

  • RFC 8446 §4.4(客户端证书)
  • NIST SP 800-204 系列

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌