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

遊戲 Lag 白皮書 › 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 的根憑證清單
確認方式
用基礎設施工具確認(不需要遊戲程式碼)
深入了解
缺少中繼憑證的設定,用電腦瀏覽器開啟時可能看起來正常。瀏覽器會記住從其他網站取得的中繼憑證來補上缺口,但像 Android App 這樣沒有這種記憶的用戶端就會失敗。有效期也在縮短。Let’s Encrypt 預計把預設有效期在 2027 年縮短為 64 天、2028 年縮短為 45 天,固定每 60 天續約的設定遇到 64 天的憑證只剩四天餘裕,遇到 45 天的憑證則會超過到期日。AWS Certificate Manager 也不會自動續約匯入(import)的憑證,刪除驗證用的 DNS 記錄也會導致續約失敗。登入被擋的樣子和「DNS 故障與延遲」類似,差別在於憑證問題是找到伺服器位址之後在 TLS 交握(handshake)時失敗,開始時間也與到期時間或更換憑證的時間重疊。

出處

  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 天間隔續約將不夠用,建議在有效期約 2/3 時續約
  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 App 會以 SSLHandshakeException 失敗,但電腦瀏覽器可能用已取得的中繼憑證補上而不報錯;用 openssl s_client 確認伺服器送出的憑證鏈
  8. Network security configuration Android (Google)
    使用憑證釘選時,必須一併放入備用金鑰以因應金鑰更換、CA 變更,否則在 App 更新前連線都會中斷
  9. openssl-s_client OpenSSL
    -showcerts:依伺服器送出的順序原樣顯示憑證清單(未經驗證的憑證鏈)
  10. openssl-x509 OpenSSL
    -enddate:輸出憑證到期日(notAfter),-checkend:檢查是否會在指定秒數內到期
  11. CloudWatch metrics for your Application Load Balancer AWS
    ClientTLSNegotiationErrorCount:用戶端驗證伺服器憑證失敗而中斷連線等,未能建立 TLS session 的連線數
  12. CloudWatch metrics for your Network Load Balancer AWS
    ClientTLSNegotiationErrorCount:用戶端與 TLS 接聽程式(listener)之間協商失敗的 TLS 交握數

相關原因

同一層:L13 伺服器架構與維運

同一症狀(連不上/無限讀取)在其他層的原因

查看含圖解與實驗的完整版卡片