Сообщение об ошибке
verify error:num=10:certificate has expired
Также выводится как
- error 10 at 0 depth lookup: certificate has expired
- Verify return code: 10 (certificate has expired)
s_client выводит «verify error:num=10:certificate has expired», а затем «notAfter=…»; openssl verify выводит «error 10 at <depth> depth lookup: certificate has expired». Для сертификатов, которые ещё не действительны, выдаётся ошибка 9 — «certificate is not yet valid».
OpenSSL CLI (openssl s_client / openssl verify) — X509_V_ERR_CERT_HAS_EXPIRED
Что это означает
Ошибка OpenSSL 10 (X509_V_ERR_CERT_HAS_EXPIRED): у одного из сертификатов цепочки дата notAfter уже в прошлом относительно момента проверки, а это время локальных часов, если не задан -attime. Строка depth, которая выводится вместе с ошибкой, показывает, о каком сертификате речь: 0 — собственный сертификат сервера, номера больше — промежуточные.
Почему это происходит
Истёк срок действия сертификата сервера (глубина 0)
частоПродление не удалось, или сервер либо балансировщик нагрузки так и не загрузил продлённый сертификат.
Истёк срок действия промежуточного сертификата в отдаваемой цепочке
иногдаСтарые файлы цепочки продолжают отдавать просроченный промежуточный или перекрёстно подписанный сертификат после того, как CA перешёл на новые; замените цепочку той, которую CA публикует сейчас.
Часы на проверяющей машине спешат
иногдаЕсли часы ушли вперёд, действительные сертификаты выглядят просроченными; -attime помогает отличить проблему с часами от настоящего истечения срока действия.
Как исправить
- 1.
Определите просроченный сертификат
Посмотрите строки depth и notAfter; -checkend показывает, истечёт ли срок действия сертификата из файла в течение заданного числа секунд, и это удобно для мониторинга.
bash # The depth printed with the error identifies the certificate; s_client also prints notAfter echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>&1 | grep -E '^depth|verify error|notAfter' # Check a file, and whether it expires within 30 days (exit 1 = yes) openssl x509 -in server.pem -noout -enddate -checkend 2592000 - 2.
Проверьте на выбранный момент времени
openssl verify -attime <unix time> показывает, была ли цепочка действительна в этот момент, и так отделяет истечение срока действия от других ошибок.
bash # Would the chain verify at another moment? (useful to separate clock problems) openssl verify -attime "$(date -d '2025-02-01' +%s)" -CAfile root.pem server.pem - 3.
Продлите сертификат и перезагрузите конфигурацию
Продлите сертификат, перезагрузите всё, что терминирует TLS, и проверьте новую дату окончания срока действия со стороны сети.
bash sudo certbot renew && sudo systemctl reload nginx echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null | openssl x509 -noout -enddate
Связанные ошибки
curl: (60) SSL certificate problem: certificate has expiredcurl (OpenSSL backend)x509: certificate has expired or is not yet valid: current time 2026-08-20T15:4…Go crypto/x509[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has exp…Python ssl module (OpenSSL)certificate has expiredNode.js tls / https / fetch