客户端 mTLS 认证
双向 TLS(mTLS)在标准 TLS 的基础上要求客户端和服务器都在 TLS 握手期间出示证书。它可提供客户端 身份的加密证明,适用于零信任架构、机器间通信,以及仅使用 API Key(API 密钥)或令牌认证不足以满足要求的环境。
在 API7 网关中,客户端 mTLS 配置在 SSL 对象上。该对象将监听域名(SNI)与服务器证书、私钥及用于验证客户端的 CA 证书绑定。启用 mTLS 后,网关会要求客户端在 TLS 握手完成前出示由已配置 CA 之一签名的证书。
信息
本文介绍 API 客户端和网关之间的 mTLS。控制面和数据面之间的 mTLS,请参见控制面与数据面之间的双向 TLS;网关和上游服务器之间的 mTLS,请参见上游 mTLS。
工作原理
- 客户端发起到网关的 TLS 连接,并在
ClientHello的 SNI 扩展中包含目标域名。 - 网关将 SNI 匹配到已配置客户端 mTLS 的 SSL 对象。
- 网关出示服务器证书,并请求客户端证书。
- 客户端出示证书,网关使用已配置 CA 验证其证书链。
- 验证成功则 TLS 握手完成,请求被转发至上游;验证失败则在 TLS 层拒绝连接。
前置条件
- 按照从控制台获取令牌中的步骤获取令牌。
准备以下 PEM 编码证书:
| 证书 | 用途 |
|---|---|
| 服务器证书 + 私钥 | 网关向客户端出示。 |
| CA 证书 | 网关用于验证客户端证书。 |
| 客户端证书 + 私钥 | 客户端向网关出示,必须由上述 CA 签名。 |
如果没有用于测试的证书集,请使用以下命令生成:
# 生成 CA
openssl req -x509 -newkey rsa:2048 -keyout ca.key -out ca.crt -days 365 -nodes \
-subj "/CN=Test CA"
# 生成服务器证书
openssl req -newkey rsa:2048 -keyout server.key -out server.csr -nodes \
-subj "/CN=api.example.com"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 365
# 生成客户端证书
openssl req -newkey rsa:2048 -keyout client.key -out client.csr -nodes \
-subj "/CN=test-client"
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out client.crt -days 365
还需要一个用于接收流量的路由。以下示例使用 httpbin.org 服务和 /anything 路由。