TLS 与 SNI 证书
入站 TLS 在 listener 实体上声明:终止(平台持证书)与直通(按 SNI 转交原始流)两种形态, 可同口并存。证书文件内容变更=握手期热加载,换证书不停机。
终止:默认证书+SNI 映射
{
"port": 5443,
"protocol": "http",
"tls": {
"default": { "certPath": "/etc/traffic/certs/default.pfx", "certPassword": "env:TLS_DEFAULT_PWD" },
"sni": [
{ "hostSuffix": ".shop.example.com", "cert": { "certPath": "/etc/traffic/certs/shop.pfx" } },
{ "hostSuffix": ".api.example.com", "cert": { "certPath": "/etc/traffic/certs/api.pem" } }
]
}
}
| 字段 | 含义 |
|---|---|
tls.default |
未命中 SNI 映射时的兜底证书 |
tls.sni[] |
后缀→证书映射(hostSuffix 匹配 ClientHello 的 SNI 名) |
certPath |
运行节点本地路径——PFX(可带 certPassword)或单文件 PEM(cert+key 合一) |
certPassword |
支持 env: 引用 |
规则:
default与sni至少其一(全缺=编译拒绝);- 证书文件内容变更热加载——握手期读文件,签名未变保证连接热态不断;
- 启用 TLS 的 listener 协商 h2-over-TLS(ALPN)。
直通:L4 分流规则
TLS 不在平台终止、按 SNI 后缀把原始 TCP 流转交给内网 TLS 服务(证书归上游管):
{
"port": 5443,
"protocol": "tcp",
"routes": [
{ "sniSuffix": ".db.internal", "target": "10.0.4.10:15432" },
{ "target": "10.0.4.99:8443" }
]
}
routes[].target 为默认/raw 转交终点(无 SNI 或未命中的连接去这里)。
终止与直通同口并存
同一监听口上,命中的 SNI 直通、未命中 SNI 的 HTTP 流量走终止+路由管线—— 探测按连接首包自动分派。
HTTP/3 的证书
HTTP/3(QUIC)复用同一份 TLS 声明(QUIC 握手即 TLS 1.3)——http3: true 的
listener 直接消费上面的 tls 块,SNI 选证共用同一映射。见HTTP/3 启用。
编译拒绝面速记
http3: true无tls→ 拒绝(H3 强制 TLS);tls块default/sni双缺 → 拒绝;quicRules(QUIC 直通)与同口http3(终止)互斥 → 拒绝。
证书内容的合法性(过期/链完整)不在编译期——由握手期暴露,metrics 里
quic.handshake_fail 等指标可见(可观测)。