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 ~ /\.zdeny 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.