游戏卡顿白皮书 › L13 服务器架构与运维
TLS 证书过期/配置错误 TLS certificate expiry / misconfiguration
原因 ID in-cert · 主责 运维团队·网络运维 · 配合 运维团队·系统运维, 研发团队·客户端开发
在含图示和实验的完整版中打开此卡片 →
登录、API、补丁服务器的证书过期或缺少中间证书时,从那一刻起新建连接的客户端 TLS 连接都会失败。
起因 证书有效期已过,服务器发送时漏掉中间证书,或玩家设备的日期时间不对 → 结果 客户端证书校验失败,断开 TLS 连接 → 画面表现 登录、补丁阶段连不上/无限加载,只有商城这类 HTTPS 功能失败。已经在线的人大多不受影响
- 症状
- 连不上/无限加载, 吞操作/回档
- 因素
- 停顿
- 谁会遇到
- 全服, 仅特定功能, 只有我
- 何时出现
- 刚登录/维护结束后, 做特定操作时
- 负责方
- 主责 运维团队·网络运维 · 配合 运维团队·系统运维, 研发团队·客户端开发
- 研发团队要做的事
- 把证书错误记为与其他连接失败区分开的错误码并给出提示;日期错误时提示开启设备的自动日期时间;使用证书固定(pinning)时一并放入备用密钥,并与运维团队对齐证书更换计划。
- 运维团队要做的事
- 网络:在负载均衡器、CDN 上终止 TLS 时,监控托管证书的自动续期状态并对剩余天数告警(ACM 为 DaysToExpiry),保留验证用 DNS 记录。服务器/OS:在服务器上终止 TLS 时,自动化续期并在续期后重新加载配置,配置包含中间证书的完整证书链,从外部定期检查登录、API、补丁各地址的剩余有效期并告警。
- 数值参考
- Let’s Encrypt 证书有效期 90 天,建议每 60 天续期;AWS Certificate Manager 会在到期前 45 天检查经 DNS 验证的证书并自动续期。自动续期悄无声息地失败时,恰好在到期时刻新连接会一下子全部被挡住。
- 监控图上
- 连接成批断开 · 登录成功数,TLS 握手错误数
- 查看位置
- 用 openssl s_client -connect HOST:443 -showcerts 查看服务器实际发送的证书列表,用 openssl x509 -noout -enddate 确认各证书的到期日(notAfter)。在负载均衡器上终止 TLS 时,看 TLS 协商错误数(AWS ALB、NLB 为 ClientTLSNegotiationErrorCount)和登录成功数
- 确认依据
- 到期日已过,或服务器发送的列表中缺少中间证书,错误开始增加的时刻与到期时刻或换证书的时刻重合
- 排除依据
- 证书列表和到期日正常却只有部分玩家失败,看这些玩家设备的日期时间,或旧版 OS 的根证书列表
- 确认手段
- 运维工具即可确认(无需游戏代码)
- 深入了解
- 缺少中间证书的配置,用 PC 浏览器打开可能看起来一切正常。浏览器会记住从其他网站拿到的中间证书来补上缺口,Android 应用这类没有这种记忆的客户端就会失败。证书有效期也在缩短。Let’s Encrypt 计划把默认有效期在 2027 年缩短为 64 天、2028 年缩短为 45 天,固定每 60 天续期的配置,遇到 64 天的证书只剩四天余量,遇到 45 天的证书则会过期。AWS Certificate Manager 对导入(import)的证书也不会自动续期,删掉验证用 DNS 记录也会续期失败。登录被挡住的样子与“DNS 故障/延迟”相似,但证书问题是在找到服务器地址之后、在 TLS 握手阶段失败,开始时刻与到期时刻或换证书的时刻重合。
出处
- RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile IETF
证书有效期从 notBefore 到 notAfter;路径校验会逐一确认链上每张证书在当前时刻是否处于有效期内(校验方时钟不对就会失败) - FAQ Let's Encrypt
默认证书有效期 90 天,建议每 60 天续期 - Decreasing Certificate Lifetimes to 45 Days Let's Encrypt
默认有效期在 2027 年 2 月缩短为 64 天、2028 年 2 月缩短为 45 天,固定 60 天间隔续期将不够用,建议在有效期约三分之二时续期 - Renewal for domains validated by DNS AWS
到期前 45 天确认证书是否正在 AWS 服务中使用、验证用 CNAME 记录是否存在,然后自动续期;无法验证时在到期前 30、15、7、3、1 天发出通知 - Managed certificate renewal in AWS Certificate Manager AWS
导入(import)的证书和已过期的证书不在自动续期范围内 - Supported CloudWatch metrics AWS
DaysToExpiry:距离证书到期的剩余天数,到期前每天发布两次 - Security with network protocols Android (Google)
服务器漏发中间证书时,Android 应用会以 SSLHandshakeException 失败,PC 浏览器则可能用已缓存的中间证书补上而不报错;用 openssl s_client 确认服务器发送的证书链 - Network security configuration Android (Google)
使用证书固定时,为应对密钥更换、CA 变更,必须一并放入备用密钥,否则在应用更新之前连接都会中断 - openssl-s_client OpenSSL
-showcerts:按发送顺序原样显示服务器发送的证书列表(不是校验过的链) - openssl-x509 OpenSSL
-enddate:输出证书到期日(notAfter),-checkend:检查是否会在指定秒数内到期 - CloudWatch metrics for your Application Load Balancer AWS
ClientTLSNegotiationErrorCount:客户端校验服务器证书失败而断开等原因导致未能建立 TLS 会话的连接数 - CloudWatch metrics for your Network Load Balancer AWS
ClientTLSNegotiationErrorCount:客户端与 TLS 监听器之间协商失败的 TLS 握手数
相关原因
同一层:L13 服务器架构与运维
其他层中同样导致“连不上/无限加载”的原因
查看含图示和实验的原卡片