한국어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) добавить резервный ключ и согласовать график смены сертификатов с командой инфраструктуры.
Команда инфраструктуры: задачи
Сеть: если TLS терминируется на балансировщике или CDN, следить за автообновлением управляемых сертификатов и настроить алерт на число оставшихся дней (в ACM это DaysToExpiry), сохранять DNS-записи для проверки. Серверы и ОС: если TLS терминируется на сервере, автоматизировать обновление и перечитывание конфигурации после него, настроить полную цепочку с промежуточным сертификатом, регулярно проверять снаружи оставшийся срок действия для каждого адреса авторизации, API и патчей и слать алерт.
Цифры для ориентира
Сертификаты Let’s Encrypt выдаются на 90 дней, и обновлять их рекомендуется каждые 60 дней, а AWS Certificate Manager проверяет сертификаты, подтверждённые через DNS, за 45 дней до истечения и обновляет их автоматически. Если автообновление тихо сломалось, ровно в момент истечения разом перестают проходить все новые подключения.
На графике
Массовый обрыв соединений · число успешных входов, число ошибок TLS-рукопожатия
Где смотреть
Посмотреть через openssl s_client -connect HOST:443 -showcerts, какие сертификаты сервер реально отдаёт, и проверить срок действия каждого (notAfter) через openssl x509 -noout -enddate. Если TLS терминируется на балансировщике, смотреть число ошибок согласования TLS (в AWS ALB и NLB это ClientTLSNegotiationErrorCount) и число успешных входов
Подтверждает
Срок действия истёк или в отдаваемом списке нет промежуточного сертификата, а рост ошибок начался в момент истечения или замены сертификата
Опровергает
Если список сертификатов и сроки в порядке, а ошибка только у части игроков, проверить дату и время на их устройствах или список корневых сертификатов в старой ОС
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Конфигурация без промежуточного сертификата может выглядеть рабочей, если открыть адрес в браузере на ПК. Браузер помнит промежуточные сертификаты, полученные с других сайтов, и подставляет недостающие, а клиент без такой памяти, например Android-приложение, получает ошибку. Сроки действия тоже сокращаются. Let’s Encrypt планирует уменьшить стандартный срок до 64 дней в 2027 году и до 45 дней в 2028 году, поэтому при жёстко заданном обновлении раз в 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
    Стандартный срок действия сокращается до 64 дней с февраля 2027 года и до 45 дней с февраля 2028 года. Обновления с фиксированным интервалом 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-приложение получает SSLHandshakeException, а браузер на ПК может подставить сохранённый промежуточный сертификат и обойтись без ошибки. Цепочку, которую отдаёт сервер, проверяют через 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 Архитектура и эксплуатация серверов

Причины с тем же симптомом (Ошибка входа / бесконечная загрузка) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами