Let’s Encrypt wydaje certyfikaty na dziewięćdziesiąt dni i odnawia je automatycznie, dlatego tydzień po konfiguracji przestaje się o nich myśleć. Kłopot w tym, że automatyczne odnawianie psuje się po cichu: błędów nikt nie widzi, a trzy miesiące później witryna wita odwiedzających ostrzeżeniem przeglądarki. Od 2025 roku Let’s Encrypt nie wysyła już powiadomień o wygasaniu, więc zniknęło i ostatnie zewnętrzne przypomnienie.

Poniżej powody, dla których odnawianie przestaje działać, w kolejności malejącej częstotliwości.

1. Certyfikat odnowiony, ale usługa go nie wczytała

Najczęstszy. certbot renew zadziałał, nowy plik leży na dysku, a nginx albo Apache dalej trzymają w pamięci stary — i wydają go odwiedzającym aż do przeładowania konfiguracji. Formalnie wszystko w porządku, faktycznie witryna ma wygasły certyfikat.

Leczy to zaczep uruchamiany po udanym odnowieniu:

sudo certbot renew --deploy-hook "systemctl reload nginx"

Zapisuje się to raz w pliku odnowienia (/etc/letsencrypt/renewal/example.com.conf, sekcja [renewalparams], wiersz renew_hook) i dalej działa samo.

2. Zmienił się serwer WWW, a weryfikacja została

Weryfikacja HTTP-01 wymaga, żeby plik z /.well-known/acme-challenge/ był wydawany zwykłym HTTP. Psuje się to zwykle tak:

  • do konfiguracji dodano bezwarunkowe przekierowanie z HTTP na HTTPS — weryfikacja wpada w przekierowanie i nie przechodzi;
  • pojawiła się reguła location ~ /\. z deny all, zamykająca wszystkie katalogi z kropką, w tym .well-known;
  • zmienił się katalog główny witryny, a w ustawieniach certbota został stary --webroot-path;
  • włączono blokowanie po krajach albo uwierzytelnianie podstawowe, pod które podpadł też serwer weryfikacji.

Właściwa kolejność w konfiguracji: najpierw osobny location dla /.well-known/acme-challenge/, a dopiero potem ogólne przekierowanie.

3. Licznik czasu jest wyłączony

Odnawianie uruchamia licznik czasu systemd albo zadanie crona, a jedno i drugie można przypadkiem wyłączyć przy debugowaniu lub zgubić przy przenosinach serwera.

systemctl list-timers | grep certbot
sudo certbot renew --dry-run

Drugie polecenie wykonuje pełny cykl odnowienia w trybie próbnym, nie zużywając limitów. To jedyne sprawdzenie, które odpowiada na pytanie „czy odnowi się za miesiąc” z wyprzedzeniem, a nie po fakcie.

4. Domena już tu nie wskazuje

Certyfikat obejmuje pięć domen, jedna z nich przeniosła się na inny hosting, DNS się zmienił. Weryfikacja tej domeny przestaje przechodzić, a certbot nie odnawia całego certyfikatu — razem z czterema działającymi domenami. Zbędne domeny trzeba usunąć z certyfikatu, a nie ignorować komunikat.

5. Osiągnięto limity

Let’s Encrypt ogranicza liczbę certyfikatów na domenę w tygodniu. Zwykle to skutek pętli „nie wyszło, spróbuję jeszcze raz” przy debugowaniu. Do eksperymentów istnieje serwer testowy (--dry-run albo --test-cert) i korzystać z niego trzeba, zanim limit zostanie wyczerpany, a nie potem.

Sprawdzać to, co jest wydawane

Każde sprawdzenie po plikach ma jedną wadę: plik może być świeży, a odwiedzający i tak dostanie stary certyfikat. Patrzeć trzeba od strony klienta:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -dates -subject -issuer

Opcja -servername jest obowiązkowa: bez niej na serwerze z kilkoma witrynami dostaniemy certyfikat pierwszego lepszego hosta wirtualnego, a nie tego, o który chodziło. W wyniku notAfter to prawdziwa data wygaśnięcia.

Przy okazji warto sprawdzić łańcuch:

echo | openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null | grep -c 'BEGIN CERTIFICATE'

Jeśli certyfikat jest jeden, pośredni nie jest wydawany. Przeglądarki taką konfigurację zwykle wybaczają — same domykają łańcuch — natomiast curl, aplikacje mobilne i klienty w Javie zgłoszą błąd weryfikacji. To klasyczne „u mnie wszystko się otwiera, a u klienta nie działa”.

Na ile dni ostrzegać

Trzydzieści dni to rozsądny pierwszy próg: tyle samo zostaje do wygaśnięcia w chwili, gdy certbot zaczyna próby odnowienia, więc jeśli do tego momentu nic się nie stało, mechanizm jest zepsuty. Czternaście dni to drugi sygnał, wymagający już działania dziś. Siedem — awaryjny.

Ważne, żeby pilnować wszystkich certyfikatów naraz, także tych spoza Let’s Encrypt: kupione na rok zapomina się najpewniej, bo przez rok wszyscy zapominają i o nich, i o tym, na czyją pocztę przychodzą powiadomienia. Jedna strona z listą domen, datami i pozostałą liczbą dni zamyka sprawę w całości — jak w demonstracji poniżej.