Table of Contents

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 等指标可见(可观测)。