Envoy Proxy Gateway 后端 mTLS 配置实战指南
前言
在现代微服务架构中,服务间的安全通信至关重要。双向 TLS(mTLS)作为一种强大的安全机制,不仅能够加密通信内容,还能确保通信双方的身份真实性。本文将详细介绍如何在 Envoy Proxy Gateway 中配置后端服务的 mTLS 认证。
基础概念
什么是 mTLS?
mTLS(Mutual TLS)是标准 TLS 协议的扩展,它要求通信双方都提供并验证对方的证书。与普通 TLS 仅客户端验证服务器身份不同,mTLS 实现了双向认证:
- 客户端验证服务器证书
- 服务器验证客户端证书
- 建立加密通信通道
为什么需要 mTLS?
- 增强安全性:防止中间人攻击
- 服务身份认证:确保只有授权服务可以相互通信
- 零信任架构:实现最小权限原则的基础
准备工作
环境要求
- 已安装 OpenSSL 工具链
- 已部署 Envoy Proxy Gateway
- 已配置基本的后端 TLS(单向认证)
证书体系设计
我们将创建以下证书:
- CA 根证书:用于签发其他证书
- 客户端证书:由 Gateway 使用,用于向后端证明身份
- 服务器证书:后端服务使用(已在基础 TLS 配置中创建)
证书创建实战
1. 创建 CA 证书
openssl req -x509 -sha256 -nodes -days 365 \
-newkey rsa:2048 \
-subj '/O=example Inc./CN=example.com' \
-keyout clientca.key \
-out clientca.crt
参数说明:
-x509
:生成自签名证书-sha256
:使用 SHA-256 哈希算法-nodes
:不加密私钥-days 365
:有效期1年-newkey rsa:2048
:生成2048位RSA密钥
2. 创建客户端证书
生成私钥和证书签名请求(CSR):
openssl req -new -newkey rsa:2048 -nodes \
-keyout client.key \
-out client.csr \
-subj "/CN=example-client/O=example organization"
使用 CA 签发证书:
openssl x509 -req -days 365 \
-CA clientca.crt \
-CAkey clientca.key \
-set_serial 0 \
-in client.csr \
-out client.crt
Kubernetes 资源配置
1. 存储客户端证书
kubectl -n envoy-gateway-system create secret tls example-client-cert \
--key=client.key \
--cert=client.crt
2. 存储 CA 证书
kubectl create configmap example-client-ca \
--from-file=clientca.crt
后端服务配置
我们需要修改后端部署以启用客户端证书验证:
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
spec:
template:
spec:
containers:
- name: backend
volumeMounts:
- name: client-certs-volume
mountPath: /etc/client-certs
- name: secret-volume
mountPath: /etc/secret-volume
env:
- name: TLS_CLIENT_CACERTS
value: /etc/client-certs/crt
volumes:
- name: client-certs-volume
configMap:
name: example-client-ca
items:
- key: clientca.crt
path: crt
- name: secret-volume
secret:
secretName: example-cert
items:
- key: tls.crt
path: crt
- key: tls.key
path: key
关键配置说明:
TLS_CLIENT_CACERTS
:指定用于验证客户端证书的 CA- 挂载服务器证书和私钥用于 TLS
- 挂载 CA 证书用于客户端验证
Envoy Proxy 配置
1. 配置 GatewayClass 引用 EnvoyProxy
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: eg
spec:
controllerName: gateway.envoyproxy.io/gatewayclass-controller
parametersRef:
group: gateway.envoyproxy.io
kind: EnvoyProxy
name: custom-proxy-config
namespace: envoy-gateway-system
2. 配置 EnvoyProxy 资源
apiVersion: gateway.envoyproxy.io/v1alpha1
kind: EnvoyProxy
metadata:
name: custom-proxy-config
namespace: envoy-gateway-system
spec:
backendTLS:
clientCertificateRef:
kind: Secret
name: example-client-cert
namespace: envoy-gateway-system
关键配置说明:
backendTLS
:指定后端 TLS 配置clientCertificateRef
:引用包含客户端证书的 Secret
验证配置
发送测试请求并检查响应:
curl -v -HHost:www.example.com \
--resolve "www.example.com:80:127.0.0.1" \
http://www.example.com:80/get
预期响应中应包含 TLS 握手详情:
{
"tls": {
"version": "TLSv1.2",
"serverName": "www.example.com",
"negotiatedProtocol": "http/1.1",
"cipherSuite": "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
"peerCertificates": ["-----BEGIN CERTIFICATE-----\n...-----END CERTIFICATE-----\n"]
}
}
安全最佳实践
-
生产环境建议:
- 使用企业级 CA 而非自签名证书
- 定期轮换证书
- 实施证书吊销检查(CRL/OCSP)
-
性能考虑:
- 启用会话恢复以减少握手开销
- 考虑使用 ECDSA 证书而非 RSA 以提高性能
-
监控告警:
- 监控证书过期时间
- 设置 TLS 握手失败告警
常见问题排查
-
握手失败:
- 检查证书链是否完整
- 验证证书中的 SAN/CN 是否符合预期
- 检查时间同步(NTP)
-
连接被拒绝:
- 确认后端服务监听端口正确
- 检查网络策略是否允许流量
-
证书验证错误:
- 确保证书未过期
- 验证 CA 证书是否正确加载
总结
通过本文,我们详细介绍了在 Envoy Proxy Gateway 中配置后端 mTLS 的全过程。从证书创建到 Kubernetes 资源配置,再到 Envoy 特定配置,我们展示了如何构建一个安全的服务间通信通道。mTLS 作为现代云原生架构的关键安全组件,能够有效提升系统的整体安全性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考