한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › 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 握手阶段失败,开始时刻与到期时刻或换证书的时刻重合。

出处

  1. RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile IETF
    证书有效期从 notBefore 到 notAfter;路径校验会逐一确认链上每张证书在当前时刻是否处于有效期内(校验方时钟不对就会失败)
  2. FAQ Let's Encrypt
    默认证书有效期 90 天,建议每 60 天续期
  3. Decreasing Certificate Lifetimes to 45 Days Let's Encrypt
    默认有效期在 2027 年 2 月缩短为 64 天、2028 年 2 月缩短为 45 天,固定 60 天间隔续期将不够用,建议在有效期约三分之二时续期
  4. Renewal for domains validated by DNS AWS
    到期前 45 天确认证书是否正在 AWS 服务中使用、验证用 CNAME 记录是否存在,然后自动续期;无法验证时在到期前 30、15、7、3、1 天发出通知
  5. Managed certificate renewal in AWS Certificate Manager AWS
    导入(import)的证书和已过期的证书不在自动续期范围内
  6. Supported CloudWatch metrics AWS
    DaysToExpiry:距离证书到期的剩余天数,到期前每天发布两次
  7. Security with network protocols Android (Google)
    服务器漏发中间证书时,Android 应用会以 SSLHandshakeException 失败,PC 浏览器则可能用已缓存的中间证书补上而不报错;用 openssl s_client 确认服务器发送的证书链
  8. Network security configuration Android (Google)
    使用证书固定时,为应对密钥更换、CA 变更,必须一并放入备用密钥,否则在应用更新之前连接都会中断
  9. openssl-s_client OpenSSL
    -showcerts:按发送顺序原样显示服务器发送的证书列表(不是校验过的链)
  10. openssl-x509 OpenSSL
    -enddate:输出证书到期日(notAfter),-checkend:检查是否会在指定秒数内到期
  11. CloudWatch metrics for your Application Load Balancer AWS
    ClientTLSNegotiationErrorCount:客户端校验服务器证书失败而断开等原因导致未能建立 TLS 会话的连接数
  12. CloudWatch metrics for your Network Load Balancer AWS
    ClientTLSNegotiationErrorCount:客户端与 TLS 监听器之间协商失败的 TLS 握手数

相关原因

同一层:L13 服务器架构与运维

其他层中同样导致“连不上/无限加载”的原因

查看含图示和实验的原卡片