Сообщение об ошибке
invalid peer certificate: certificate expired: verification time
Полная форма: «invalid peer certificate: certificate expired: verification time <unix> (UNIX), but certificate is not valid after <unix> (<n> seconds ago)». Более ранние релизы rustls выводили только имя варианта («invalid peer certificate: Expired»). Для сертификатов, срок действия которых ещё не начался, есть отдельный вариант «not valid yet».
rustls 0.23 (via reqwest, ureq, hyper-rustls) — CertificateError::ExpiredContext
Что это означает
rustls проверил цепочку, но на момент проверки у одного из сертификатов в ней уже прошла дата notAfter. rustls 0.23 указывает оба момента в виде меток времени Unix и сообщает, сколько секунд назад истёк срок действия сертификата, так что сразу видно, что неверно: сертификат или часы.
Почему это происходит
Истёк срок действия сертификата сервера
частоПродление не удалось, или сервер ещё не отдаёт продлённый сертификат.
Часы клиента идут неправильно
иногдаУ встраиваемых устройств и контейнеров на хостах без NTP часы могут сильно расходиться с реальным временем; сравните время проверки из сообщения с реальным.
Просроченный сертификат закреплён как якорь доверия
редкоКлиенты, которые добавляют сам сертификат сервера как корневой, продолжают проверять по этому старому сертификату и после того, как сервер продлил сертификат.
Как исправить
- 1.
Преобразуйте метки времени
date -u -d @<seconds> переводит оба значения в понятное время UTC.
bash # The message gives both instants as Unix seconds date -u -d @1743465600 # certificate's notAfter date -u # this machine's time - 2.
Продлите сертификат и разверните его заново
Продлите сертификат сервера, перезагрузите сервис и проверьте новую дату окончания действия со стороны сети.
bash echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null | openssl x509 -noout -enddate sudo certbot renew && sudo systemctl reload nginx