2.2 TLS 1.3 与证书自动化:从握手到轮换
TLS 同时建立会话密钥、认证端点并保护后续记录。它不是“用证书公钥把 HTTP 加密”:TLS 1.3 通常用临时 (EC)DHE 建立共享秘密,证书私钥负责给握手上下文签名。
TLS 1.3 握手绑定协商结果
简化流程:
ClientHello
supported_versions, cipher_suites, key_share, SNI, ALPN
↓
ServerHello + key_share
↓ 双方派生握手密钥
EncryptedExtensions
Certificate
CertificateVerify ← 服务端用证书私钥签名握手 transcript
Finished ← 证明握手密钥与 transcript 完整
↓
应用流量密钥证书验证回答“这个公钥是否被信任用于目标服务名”,CertificateVerify 回答“对端是否持有对应私钥”,Finished 把此前协商内容和派生密钥绑定起来。缺一项都不能把连接视为目标服务的安全通道。
TLS 1.3 cipher suite 只选择 AEAD 与 hash,密钥交换和签名算法在独立扩展中协商。这与 TLS 1.2 的套件命名不同,不能用旧的字符串检查逻辑判断全部安全属性。
SNI 与 ALPN 参与服务选择
SNI 告诉共享地址上的服务端客户端要访问哪个 hostname,服务端据此选择证书和虚拟主机;ALPN 协商 HTTP/2、HTTP/1.1 等应用协议。两者配置错误会导致拿错证书、路由到错误租户或协议降级。
SNI 在传统 TLS 1.3 ClientHello 中通常可见,TLS 本身不隐藏访问的域名。需要保护这一元数据时,要关注 ECH 的实际客户端、DNS 和服务端生态支持,不能假设“用了 HTTPS,所有信息都看不见”。
0-RTT 以重放风险换取延迟
恢复会话时,TLS 1.3 可以让客户端在完整握手前发送 early data。0-RTT 不具备一般意义上的重放保护,攻击者可能让服务端多次接收同一请求。
因此转账、创建订单、修改权限、发放凭据等非幂等操作不应接受 0-RTT。即使 GET 被设计为幂等,也要确认它没有隐藏的计费、一次性 token 消耗或审计副作用。防重放需要应用与 TLS 终止层共同设计,不能仅靠库开关。
mTLS 认证的是证书主体,不是业务授权
双向 TLS 中,服务端也请求客户端证书并验证 CertificateVerify。它适合受控设备、服务间身份和高保证管理接口,但仍需映射:
validated certificate identity
→ workload / device principal
→ authorization policy
→ permitted resource and action“来自受信 CA 的任意证书”通常过宽。要检查 SAN/URI identity、EKU、签发层级、环境和吊销状态,并限制哪个 issuer 能为哪个命名空间发证。证书轮换时连接池和长连接何时重新握手,也必须进入撤销窗口分析。
ACME 把域名控制验证变成协议
ACME 的核心对象关系:
Account → Order → Authorization → Challenge → Finalize CSR → CertificateHTTP-01、DNS-01 等 challenge 证明申请者控制相应命名空间。DNS-01 适合通配符和不直接暴露 HTTP 的服务,但 DNS API 凭据往往权限很大;应限制到特定 zone/record、使用短期凭据并隔离签发控制器。
证书自动化不是一个 cron:
- 提前续签并加入随机抖动,避免同一时刻风暴;
- 原子发布新证书与私钥,避免不匹配;
- 让进程 reload 或热更新,并验证实际 listener 已加载新 serial;
- 保留短暂重叠以支持连接和多副本滚动;
- 从外部探针检查链、SAN、协议和剩余期限;
- 对签发、challenge、reload 和握手错误分别告警。
只监控磁盘上的 .pem 到期日,会漏掉负载均衡器仍在提供旧证书的情况。
私有 PKI 要控制故障半径
服务网格或工作负载身份平台常签发数小时到数天的短期证书。短生命周期降低静态凭据长期泄露风险,却把可用性依赖转移到 issuer、身份 attestation、时钟和轮换代理。
根密钥应离线或严密保护,在线 intermediate 按环境、区域或用途隔离。轮换 CA 需要 trust bundle 先加入新根、再签发新叶子、最后移除旧根的重叠阶段;直接替换根会把整个集群切断。
TLS 生产基线
- 优先 TLS 1.3;需要 TLS 1.2 兼容时按 BCP 195 限制协议与套件;
- 禁用证书校验失败后的默认继续路径;
- 使用提供前向保密的密钥交换并安全管理 session ticket key;
- 明确是否启用 0-RTT,以及哪些请求可以接受;
- 对外部与内部服务都验证完整链、reference identity 和用途;
- 自动签发、续期、部署、reload 与外部验证连成可复验流程;
- 监控握手失败率、协议版本、证书剩余期限和异常新证书。
下一章从服务身份转向用户与应用身份:认证因素、会话、OAuth/OIDC 和授权策略。