TLS 终止 (TLS Termination、SSL 终结)
定义
TLS 终止是指网络路径上客户端 TLS 连接结束并被解密的位置,可以是 CDN 边缘、负载均衡、反向代理,也可以是应用服务器本身。
TLS 终止回答的是“客户端的加密连接在哪里结束”。负责终止 TLS 的组件持有证书和私钥,完成握手,此后看到的就是明文请求。常见的终止点有 CDN 边缘节点、云负载均衡(如各家云厂商的 SLB/CLB)、Kubernetes Ingress 控制器、Nginx 等反向代理,或应用服务器自己。终止点之后,流量可能以明文传到后端,也可能重新建立一条 TLS 连接再加密;代理也可以不终止,直接把加密流量透传给后端(TLS 透传)。
为什么重要
终止点就是你的安全边界。浏览器的锁形图标只说明到终止组件这一段是加密且经过认证的,之后如何完全取决于你的架构;运营这个组件的一方,比如 CDN 服务商,能看到明文流量。终止点的选择还决定了:证书要装在哪里、在哪里续签,mTLS 客户端证书能在哪里校验,以及后端会丢失哪些信息。终止之后,后端看不到客户端的 TLS 细节和真实 IP,除非代理通过 X-Forwarded-For、X-Forwarded-Proto 等请求头或 PROXY 协议转交。
例子
用 Nginx 的 stream 模块做 TLS 透传,按 SNI 分流而不解密:
stream {
map $ssl_preread_server_name $backend {
app.example.com 10.0.0.11:443;
default 10.0.0.12:443;
}
server {
listen 443;
ssl_preread on;
proxy_pass $backend;
}
}
这时 TLS 在后端终止,证书要装在后端。改用带 ssl_certificate 的 http server 块,终止点就移到了 Nginx。
常见误区
- 有锁形图标就说明一路加密到应用。 它只覆盖到终止点为止的那一段。
- TLS 必须在应用服务器上终止才安全。 在代理上终止是常规做法,关键在于保护代理之后那一段,可以重新加密,也可以做网络隔离。
- 透传模式的代理也能加请求头、做缓存。 不解密就只能看到 SNI 和加密后的字节。