a6-recipe-mtls
概览
双向 TLS(mTLS)确保客户端和服务端彼此校验 身份。标准 TLS 只校验服务端;mTLS 会额外校验客户端证书。
通过 Apache APISIX和 a6 CLI,你可以配置:
- 客户端到 Apache APISIX 的 mTLS:要求客户端提供有效证书。
- Apache APISIX到上游的 mTLS:连接后端时提供客户端证书。
- 端到端 mTLS:同时启用两个方向的 mTLS。
适用场景
- 服务间零信任网络。
- 微服务中的安全服务间通信。
- 要求双向认证的合规场景。
- 使用基于证书的认证替代或补充 API Key 认证。
- 仅授权服务可访问的内部 API。
概念
| 术语 | 描述 |
|---|---|
| CA 证书 | 用于验证客户端或服务器证书的证书颁发机构证书 |
| 服务器证书 | APISIX 向客户端提供的证书(标准 TLS) |
| 客户端证书 | 客户端向 APISIX 提供的证书(mTLS 验证) |
| 上游 TLS | APISIX 向上游后端提供客户端证书 |
第一部分:客户端到 APISIX 的 mTLS
要求客户端连接 APISIX 时提供有效的 TLS 证书。
1. 创建带客户端校验 CA 的 SSL 资源
a6 ssl create -f - <<'EOF'
{
"id": "mtls-domain",
"cert": "<SERVER_CERTIFICATE_PEM>",
"key": "<SERVER_PRIVATE_KEY_PEM>",
"snis": ["api.example.com"],
"client": {
"ca": "<CA_CERTIFICATE_PEM>"
}
}
EOF
字段:
cert/key:服务端证书和私钥(提供给客户端)。snis:服务器名称指示(Server Name Indications),即该证书覆盖的域名。client.ca:用于校验客户端证书的 CA 证书。client.depth:(可选)证书链校验的最大深度。
2. 为受保护域名创建路由
a6 route create -f - <<'EOF'
{
"id": "secure-api",
"uri": "/api/*",
"host": "api.example.com",
"upstream": {
"type": "roundrobin",
"nodes": {
"backend:8080": 1
}
}
}
EOF
3. 用客户端证书进行测试
# With valid client cert — succeeds
curl --cert client.crt --key client.key --cacert ca.crt \
https://api.example.com:9443/api/health
# Without client cert — fails with SSL handshake error
curl --cacert ca.crt https://api.example.com:9443/api/health