所有 SSL 文章 SSL 与证书

什么是双向 TLS(mTLS)?客户端证书认证

在普通 HTTPS 中,只有服务器用证书证明身份。客户端(浏览器)是匿名的——服务器不知道是谁在连接。

**双向 TLS(mTLS)**增加了第二步:客户端也出示证书。双方相互认证。服务器根据受信任的 CA 验证客户端证书,客户端验证服务器的——因此称为”双向”。

普通 TLS vs 双向 TLS

普通 TLS双向 TLS(mTLS)
服务器证明身份✅ 证书 + CA 签名✅ 相同
客户端证明身份❌ 匿名✅ 客户端证书
认证方式单向(仅服务器)双向(双方)
使用场景公开网站内部 API、零信任
客户端需要仅浏览器证书 + 私钥
配置复杂度标准较高——需要管理客户端证书

何时使用 mTLS

服务间通信

微服务之间通过网络相互通信。mTLS 确保只有授权的服务才能连接——不是任何知道 URL 的人。

Service A ←──mTLS──→ Service B
Both verify: "Are you who you claim to be?"

零信任架构

在零信任中,没有网络连接是默认受信任的——即使在企业网络内部。mTLS 用基于身份的信任(证书)取代基于网络的信任(防火墙、VPN)。

API 安全

超越 API 密钥保护敏感 API。被窃取的 API 密钥任何人都能使用。客户端证书绑定到特定私钥——更难窃取和使用。

物联网设备认证

设备在制造时预置客户端证书连接到后端。服务器知道它在与真实设备通信,而非伪造的。

mTLS 的工作原理

  1. 客户端连接并发起 TLS 握手(与普通 TLS 相同)
  2. 服务器发送其证书 —— 客户端验证(与普通 TLS 相同)
  3. 服务器请求客户端证书 —— 发送 CertificateRequest 消息
  4. 客户端发送其证书 —— 服务器根据受信任的 CA 验证
  5. 双方计算会话密钥,加密通信开始

步骤 3-4 使其成为”双向”。

Nginx mTLS 配置

server {
    listen 443 ssl;
    server_name api.example.com;

    # Server certificate (same as regular HTTPS)
    ssl_certificate     /etc/ssl/server-fullchain.pem;
    ssl_certificate_key /etc/ssl/server-privkey.pem;

    # Client certificate verification
    ssl_client_certificate /etc/ssl/client-ca.pem;  # CA that signed client certs
    ssl_verify_client on;                            # Require client cert

    # Optional: pass client cert info to your app
    proxy_set_header X-Client-DN $ssl_client_s_dn;
    proxy_set_header X-Client-Verify $ssl_client_verify;
}

mTLS vs 其他认证方式

方式安全级别复杂度最适合
API key低(可共享)公开 API、速率限制
OAuth/JWT面向用户的 API
mTLS高(密码学绑定)服务间通信、零信任
mTLS + JWT最高传输层和应用层双重认证

mTLS 与 GetHTTPS

GetHTTPS 签发的是服务器证书——你的 Web 服务器用来证明身份的证书。这是所有 HTTPS 网站使用的标准 SSL 证书。

mTLS 的客户端证书通常由私有 CA(你组织的内部 CA)签发,而非像 Let’s Encrypt 这样的公共 CA。Let’s Encrypt 不签发客户端证书——它们只为公共域名签发服务器证书。

常见问题

能用 Let’s Encrypt 做 mTLS 吗?

服务器证书:可以。客户端证书:不行。客户端证书需要由你控制的私有 CA 签发——由你决定哪些客户端被授权。opensslcfsslstep-ca 等工具可以充当你的私有 CA。

mTLS 和”客户端证书认证”是同一个东西吗?

是的。“双向 TLS”、“mTLS”、“双向 TLS”和”客户端证书认证”都指同一个东西——双方在 TLS 握手时都出示证书。

mTLS 能替代 API 密钥吗?

可以,但它们服务于不同目的。mTLS 证明的是传输层身份(哪个服务在连接)。API 密钥/JWT 证明的是应用层身份(哪个用户/权限)。许多系统同时使用两者以实现纵深防御。

mTLS 常用在哪里?

Kubernetes(使用 Istio/Linkerd 的服务网格)、Cloudflare Access、AWS API Gateway(双向 TLS)、Google Cloud 的 BeyondCorp,以及大多数企业零信任实现。

相关文章

SSL 与证书 2026-05-07
SSL/TLS 如何工作:TLS 握手详解
TLS 握手的可视化解析——浏览器和服务器如何在毫秒内建立加密连接。涵盖 TLS 1.2、TLS 1.3、会话恢复和前向保密。
SSL 与证书 2026-05-08
公钥密码学:SSL 加密的实际工作原理
公钥密码学使用密钥对——一个公钥、一个私钥——来保护 HTTPS 连接。了解非对称加密、数字签名和密钥交换如何使 SSL/TLS 成为可能。
SSL 与证书 2026-05-08
什么是 SSL 证书?
SSL 证书是一个数字文件,用于验证网站身份并启用加密 HTTPS 连接。了解证书包含什么、如何工作、如何免费获取,以及为什么每个站点都需要。
在浏览器中获取免费 SSL 证书
无需安装,无需账号。私钥始终留在你的设备上。
获取证书