在普通 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 的工作原理
- 用戶端連線併發起 TLS 握手(與普通 TLS 相同)
- 伺服器傳送其證書 —— 用戶端驗證(與普通 TLS 相同)
- 伺服器請求用戶端證書 —— 傳送
CertificateRequest訊息 - 用戶端傳送其證書 —— 伺服器根據受信任的 CA 驗證
- 雙方計算會話金鑰,加密通訊開始
步驟 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 簽發——由你決定哪些用戶端被授權。openssl、cfssl 或 step-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,以及大多數企業零信任實現。