入口网关做 TLS 终止是多数业务系统的默认选择,但前提是网关到后端这一段必须补上再加密或内网零信任隔离;如果后端是金融核心、政务数据或跨机房调用,终止点就应该后移到业务侧,用透传加服务网格 mTLS 兜底。取舍的本质不是”哪里解密更快”,而是”私钥放在哪、明文暴露多长、证书轮换影响多大”。
先分清三种 TLS 终止模式,别把配置当成架构决策
很多团队在 Ingress 上敲一条 annotation 就以为问题解决了,真实情况是,TLS 终止位置决定了三件事:私钥的分布范围、明文流量的可见半径、故障时排查的链路长度。
边缘终止
CDN 或云上四层负载均衡直接解密,回源走 HTTP 或 HTTPS,优点是把握手开销挡在离用户最近的节点,证书只在一个地方管,缺点是明文进源站,源站与云厂商之间那条链路的安全责任要靠专线或回源加密补回来。
入口网关终止 + 后端再加密
网关解密做七层处理(路由、限流、鉴权、WAF),再以 HTTPS 或 mTLS 连后端,这是目前微服务架构最主流的组合,配置上要注意 proxy_ssl_server_name on(Nginx)或 Envoy 的 UpstreamTlsContext,否则后端 SNI 拿不到,多域名虚拟主机场景会串站。
端到端透传
网关只看 SNI 做四层转发,证书和后端一一对应,Kubernetes 里对应 ssl-passthrough: "true",好处是私钥永不出业务侧,合规审计友好;代价是网关看不到 HTTP 内容,WAF、路径路由、基于 Header 的灰度全部失效。
入口网关 TLS 终止和放在后端服务有什么区别
这是选型时绕不开的对比,两条路的差距不在握手本身,而在后续所有运维动作的半径。
性能:终止越靠后,握手越靠后
握手次数没变,变的是握手发生的位置,TLS 1.3 完整握手是 1-RTT,TLS 1.2 完整握手需要 2-RTT,如果终止在网关,用户到网关的那一跳可以用边缘节点承担,后端连接复用长连接(keepalive 到 upstream),整体抖动更小,如果终止在后端服务,每一次新连接都要落到业务进程上,Java 应用的 TLS 卸载在连接突增时更容易吃 CPU。
实测路径很简单:
curl -o /dev/null -s -w "%{time_connect} %{time_appconnect} %{time_total}\n" \
https://api.example.com/health
time_appconnect 减去 time_connect TLS 握手耗时,分别对网关地址和后端 Pod 地址跑一遍,差多少心里就有数了。
安全:私钥散落是最大代价
网关终止意味着私钥只存在少数几台机器上,配合 KMS 或密钥托管,轮换一次覆盖范围可控,后端终止意味着每个服务各持一份证书,服务数量一上去,过期漏换的概率随之上升,行业共识认为,证书过期的故障里,绝大多数来自”没人知道这张证书部署在哪些实例上”。
反过来,网关终止把明文放进内网,如果内网是生产与办公混跑的老架构,一条 tcpdump 就能抓到请求体,这个风险要自己认。
运维:证书轮换的影响半径
| 对比项 | 网关终止 | 后端服务终止 |
|---|---|---|
| 私钥存放点 | 集中在网关少量节点 | 分散到每个服务实例 |
| 证书轮换 | 改网关一处,滚动重启即可 | 需逐服务发布,容易遗漏 |
| 明文暴露范围 | 网关到后端整段 | 仅进程内 |
| 七层能力 | 路由、WAF、限流全可用 | 网关只能四层转发 |
| 后端语言适配 | 与语言无关 | 各语言 TLS 实现差异大 |
| 适合场景 | 大多数 Web/API 业务 | 支付核心、跨域强合规 |
一个折中做法
网关终止对外,后端用 mTLS 再加密,证书由内部 CA 签发并短周期轮换,私钥由服务网格或密钥管理下发,这样既保留了七层能力,又把明文窗口压缩到进程内的环回地址,配置上 Envoy 侧是 DownstreamTlsContext 与 UpstreamTlsContext 分开声明,Istio 里对应 PeerAuthentication 的 STRICT 模式。
什么场景下必须把 TLS 终止放在入口网关
不是所有系统都适合把解密往后推,以下场景把终止放在网关更合理:
- 需要按路径或 Header 做路由:灰度发布、A/B 测试、多租户分流,必须在七层拿到请求内容。
- 前面挂了 WAF 或风控:看不到明文的 WAF 只能做 IP 黑名单,规则能力废掉大半。
- 做统一鉴权:JWT 校验、OAuth2 令牌解析放在网关,后端服务就不用各自实现一遍。
- 后端技术栈混杂:存在 PHP、Go、Java 混合,各语言 TLS 配置水平不一,统一在网关收口更安全。
- 需要限流与配额:基于用户维度的限流必须有解密后的身份信息。
反过来,以下场景更适合透传或后端终止:数据库代理、gRPC 双向流、需要客户端证书直通的双向认证、以及监管明确要求”业务侧独立持有密钥”的系统。
金融行业入口网关 TLS 终止合规要求怎么落地
金融和政务类系统常遇到一条约束:密钥不能离开业务责任边界,业内专家指出,等保与行业监管在传输加密上关注的是”密钥管理和访问控制是否可审计”,而不是强制某一层终止。
落地时的操作路径大致是这样:
- 先做数据分级,把涉及账户、证件、交易的接口单独划出来。
- 这部分走透传,私钥由业务方在 HSM 或密钥管理服务中托管,网关只做 SNI 路由。
- 其余接口按常规在网关终止,后端用 mTLS 补齐。
- 网关开启完整访问日志,记录 SNI、证书序列号、上游连接标识,满足审计追溯。
证书链验证可以用一条命令确认,避免中间证书缺失导致部分客户端握手失败:
openssl s_client -connect api.example.com:443 \ -servername api.example.com -showcerts </dev/null
输出里能看到服务端下发的完整链,如果只有叶子证书,安卓旧版本和部分 Java 客户端会报 unable to find valid certification path。
TLS 终止会增加多少延迟和机器开销
这是预算评审时最常被问到的问题,结论是:握手延迟主要取决于 RTT 数量,不取决于终止点在哪一层;CPU 开销取决于连接新建速率,不取决于总请求量。
几个可以自己验证的量:
- 握手 RTT:TLS 1.3 首次握手 1-RTT,会话恢复可做到 0-RTT;TLS 1.2 完整握手 2-RTT,跨地域公网单程延迟按几十毫秒估,一个 RTT 就抵得上一次数据库查询。
- 新建连接占比:开启 HTTP/2 或长连接后,多数业务的 TLS 握手只占请求总量的一小部分,压力集中在突发扩容和客户端冷启动时段。
- 加密算法成本:AES-NI 指令集普及后,对称加密开销已不是瓶颈,真正的开销在非对称运算和证书链校验。
优化动作按性价比排序:开启 ssl_session_cache 与会话票据复用、启用 TLS 1.3、把证书链精简到必要层级、在网关侧开启 OCSP Stapling 减少客户端额外查询,这几项做完,握手开销通常能压到可接受范围,据公开的云厂商文档说明,TLS 1.3 的会话恢复在高并发短连接场景下收益最明显。
Q&A:入口网关 TLS 终止常见问题
入口网关 TLS 终止后,后端还要不要开 HTTPS?
要看内网信任边界,同机房同 VPC 且已有网络策略隔离的,可以走 HTTP 但必须限制监听地址;跨可用区、跨机房、或与办公网混跑的,建议开 HTTPS 或 mTLS,判断标准很简单:这段链路上有没有你控制不了的设备。
网关终止和 WAF 必须一起部署吗?
不必须,但拆开部署会丢能力,WAF 需要明文才能做 SQL 注入、XSS 这类规则匹配,放在 TLS 终止之前只能看 IP 和 SNI,常见做法是把 WAF 模块挂在网关的解密之后、转发之前,形成”解密检测再加密”的流水线。
透传模式下还能做灰度发布吗?
只能做基于 SNI 或源 IP 的四层灰度,无法按路径和 Header 分流,如果灰度策略依赖请求内容,透传模式就不适用,折中方案是在网关后面再加一层内部七层代理,由它终止内部 TLS 并承担灰度逻辑。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/776357.html


