При установке или пересборке Discourse валидный сертификат Let’s Encrypt может быть отклонён со следующей ошибкой:
C=US, O=Let's Encrypt, CN=YR2
error 2 at 1 depth lookup: unable to get issuer certificate
error fullchain.cer: verification failed
Я воспроизвёл эту проблему сразу после успешного выпуска RSA-сертификата. Сбой проверки приводит к ненужному запросу --force, что может вызвать HTTP 429 / rateLimited / «too many certificates». В моей установке выпуск ECDSA-сертификатов был заблокирован, и HTTPS не запустился.
При наличии затронутых цепочек каждый пересбор или перезапуск контейнера может вызывать ненужное принудительное повторное выпуск RSA- и ECDSA-сертификатов, даже если они всё ещё действительны. Успешные повторные выпуски расходуют квоту Let’s Encrypt, поэтому частые пересборки или перезапуски могут быстро привести к достижению лимита частоты.
Эта проблема может оставаться незамеченной, пока HTTPS продолжает работать с уже установленными сертификатами. Удаление и переустановка экземпляра с тем же именем хоста не сбрасывает эту квоту. Если необходимые сертификаты отсутствуют в новой установке, ограничение частоты выпуска может помешать запуску HTTPS.
Исправление
В файле templates/web.letsencrypt.ssl.template.yml, внутри функции cert_exists(), замените:
- openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer
+ openssl verify -untrusted ca.cer fullchain.cer
Остальную часть функции оставьте без изменений. Исправленный шаблон должен быть включён в следующую пересборку контейнера для обновления /usr/local/bin/letsencrypt.
Если вы уже достигли лимита частоты, патч не сбрасывает квоту. Примените исправление и соблюдайте время retry after перед попытками дальнейшего выпуска.
Подтверждение проблемы с проверкой цепочки
Из каталога затронутого сертификата внутри контейнера (/shared/letsencrypt/<hostname> или <hostname>_ecc) сравните результаты:
openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer
openssl verify -untrusted ca.cer fullchain.cer
В воспроизведённом случае первая команда завершается ошибкой 2, а вторая возвращает:
fullchain.cer: OK
Причина и валидация
Команда openssl x509 -in ca.cer читает только первый сертификат из пакета эмитента. В наблюдаемой цепочке YR2 это приводит к потере перекрёстно подписанного Root YR, необходимого для достижения ISRG Root X1.
Параметр -untrusted ca.cer предоставляет полный пакет эмитента, сохраняя доверенные якоря в системном хранилище, что сохраняет намерение исправления 2021 года (#576).
Я проверил фактические цепочки RSA и ECDSA внутри контейнера. Полная пересборка с патчем переиспользовала оба существующих сертификата: два сообщения Skip, обе цепочки установлены, и nginx -t прошёл успешно.