https z Let's Encrypt
Moduł 7: Domena, serwer WWW i https · Czas czytania: 12 min
Cel lekcji: Po tej lekcji będą Państwo potrafili za pomocą certbot uzyskać darmowy certyfikat Let's Encrypt dla nginx, przekierować http na https, sprawdzić automatyczne odnawianie i rozwiązać najczęstsze błędy przy wnioskowaniu o certyfikat.
Kluczowe pojęcia: certyfikat, urząd certyfikacji (CA), ACME, Let's Encrypt, walidacja domeny, HTTP-01, DNS-01, TLS-ALPN-01, certbot, odnawianie, certbot renew --dry-run, okres ważności, ARI, limity (rate limits), staging, CAA, przekierowanie na https
Dlaczego https i co potwierdza certyfikat
Bez https wszystko, co przesyłane jest między przeglądarką a serwerem, przechodzi przez sieć bez szyfrowania: hasła, formularze, pliki cookie. Każdy po drodze (publiczne wifi, zhakowany router) może to podsłuchać lub zmienić. Dlatego przeglądarki oznaczają strony http jako "niezabezpieczone", a niektóre funkcje działają wyłącznie przez https. Dla sejfu na hasła, takiego jak Vaultwarden (lekcja 9.4), https jest wręcz obowiązkowe.
https korzysta z TLS, a do tego serwer potrzebuje certyfikatu: dowodu, podpisanego przez urząd certyfikacji (CA), któremu ufają przeglądarki, że dany klucz należy do danej nazwy. Zwykły certyfikat potwierdza jedynie, że wnioskodawca zarządza nazwą domeny (walidacja domeny). Nie mówi nic o tym, kim Państwo są ani czy są Państwo wiarygodni.
Let's Encrypt to darmowy urząd certyfikacji, który wydaje wyłącznie certyfikaty z walidacją domeny, w pełni automatycznie za pomocą protokołu ACME. Program na Państwa serwerze (klient ACME) wnioskuje o certyfikat, udowadnia, że zarządza nazwą, instaluje go i odnawia na czas. W tej lekcji używamy certbot, klienta stworzonego przez EFF. Caddy (lekcja 7.4) ma wbudowanego klienta ACME.
Jak udowodnić, że zarządzają Państwo nazwą?
Let's Encrypt zna trzy rodzaje wyzwań (challenges):
| Wyzwanie | Jak | Port | Wildcard (*.example.com) |
|---|---|---|---|
| HTTP-01 | umieszczenie pliku pod http://<naam>/.well-known/acme-challenge/ | 80 | nie |
| DNS-01 | ustawienie rekordu TXT _acme-challenge.<naam> | brak | tak |
| TLS-ALPN-01 | pokazanie specjalnego certyfikatu podczas uzgadniania TLS (handshake) | 443 | nie |
Dla zwykłego VPS ze stroną internetową najprostsze jest HTTP-01. Wymaga ono, aby:
- nazwa wskazywała rekordem A (i AAAA) na Państwa serwer (lekcja 7.1);
- port 80 był otwarty dla całego świata, nawet jeśli strona poza tym używa wyłącznie https. Let's Encrypt waliduje tylko przez port 80 i z wielu miejsc w internecie; tych adresów nie da się wpisać do zapory;
- serwer odpowiadał tak samo przez IPv4 i IPv6. Jeśli nazwa ma rekord AAAA, Let's Encrypt najpierw próbuje IPv6. Dopiero gdy przez IPv6 nie da się w ogóle nawiązać połączenia, wraca do IPv4.
DNS-01 jest potrzebne do certyfikatu wildcard lub gdy serwer nie jest dostępny z zewnątrz. Klient ACME musi wtedy móc zmieniać Państwa DNS, zwykle za pomocą klucza API od dostawcy DNS. Taki klucz pozwala zmienić cały DNS: prosimy przechowywać go równie starannie jak hasło.
Instalacja certbot
Twórcy certbot zalecają wersję snap, ponieważ zawsze zawiera najnowszą wersję. Na Debianie i Ubuntu można go też zainstalować po prostu z repozytorium pakietów:
anna@web1:~$ sudo apt install certbot python3-certbot-nginxWersja z dystrybucji jest starsza, ale otrzymuje aktualizacje bezpieczeństwa przez apt (lekcje 4.1 i 4.2), co pasuje do reszty tego kursu. Prosimy wybrać jedną z dwóch opcji, nie obie: dwie instalacje przeszkadzają sobie nawzajem przy odnawianiu.
Uzyskanie certyfikatu
Gdy strona z lekcji 7.2 działa już na porcie 80:
anna@web1:~$ sudo certbot --nginx -d example.com -d www.example.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address or hit Enter to skip.
(Enter 'c' to cancel):
...
Requesting a certificate for example.com and www.example.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2027-02-07.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for example.com to /etc/nginx/sites-enabled/example.com
Successfully deployed certificate for www.example.com to /etc/nginx/sites-enabled/example.com
Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.com(Data i szczegóły są przykładowe.) Wtyczka --nginx robi trzy rzeczy: tymczasowo przygotowuje wyzwanie, pobiera certyfikat i dostosowuje Państwa server block, dodając blok listen 443 ssl oraz przekierowanie z http na https. Jeśli wolą Państwo zrobić to samodzielnie, prosimy użyć certbot certonly --nginx i samodzielnie dopisać odpowiednie wiersze do konfiguracji.
Kilka rzeczy, na które warto zwrócić uwagę:
- Prosimy zawnioskować od razu o wszystkie nazwy należące do strony (
-ddla każdej nazwy). Każda nazwa musi wskazywać na serwer, w przeciwnym razie cały wniosek się nie powiedzie. - Klucz prywatny (
privkey.pem) znajduje się w/etc/letsencrypt/live/i jest czytelny tylko dla root. Prosimy nie kopiować go w inne miejsca i nigdy nie umieszczać go w kopii zapasowej, którą mogą odczytać inne osoby. - Adres e-mail jest opcjonalny. Od czerwca 2025 Let's Encrypt nie wysyła już e-maili, gdy certyfikat zbliża się do wygaśnięcia. Muszą więc Państwo sami pilnować, czy odnawianie się udaje (lekcja 8.3).
Przekierowanie http na https
Po uruchomieniu certbot konfiguracja wygląda mniej więcej tak (w uproszczeniu; certbot sam dodaje komentarze # managed by Certbot i czasem wiersze if):
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
root /var/www/example.com;
...
}Pierwszy blok przekierowuje wszystko z http na tę samą nazwę i tę samą ścieżkę przez https, przekierowaniem stałym (301). Plik wyzwania przy odnawianiu nadal działa: Let's Encrypt podąża za tym przekierowaniem. Drugi blok to właściwa strona. Jeśli chcą Państwo dodatkowo przekierować www na samą nazwę domeny (lub odwrotnie), prosimy zrobić to w osobnym bloku, aby odwiedzający widzieli jedną stałą nazwę.
Odnawianie: automatycznie i pod kontrolą
Certyfikat Let's Encrypt jest obecnie ważny 90 dni. Ten okres będzie krótszy: Let's Encrypt zapowiedział, że standardowy profil od 10 lutego 2027 będzie wydawał certyfikaty na 64 dni, a od 16 lutego 2028 na 45 dni. Ręczne odnawianie nie wchodzi więc w grę; musi odbywać się automatycznie.
Podczas instalacji certbot tworzy timer systemd (lub wpis cron), który dwa razy dziennie sprawdza, czy certyfikat trzeba odnowić. Prosimy sprawdzić, czy istnieje, i przetestować odnawianie próbnym wnioskiem:
anna@web1:~$ systemctl list-timers 'certbot*'
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2026-11-09 22:41:00 CET 9h left - - certbot.timer certbot.service
anna@web1:~$ sudo certbot renew --dry-run
...
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/example.com/fullchain.pem (success)Po odnowieniu nginx musi też wczytać nowy certyfikat. Z wtyczką nginx certbot załatwia to sam; jeśli używają Państwo certonly, prosimy dodać deploy hook, który przeładuje nginx, na przykład wykonywalny skrypt w /etc/letsencrypt/renewal-hooks/deploy/ zawierający systemctl reload nginx.
Dobre klienty ACME korzystają z ARI (ACME Renewal Information): Let's Encrypt sam wskazuje wtedy, kiedy certyfikat należy odnowić, na przykład wcześniej, gdy z jakąś serią certyfikatów jest problem. Dlatego prosimy aktualizować swojego klienta.
Gdy wniosek się nie powiedzie
| Komunikat (skrócony) | Przyczyna | Rozwiązanie |
|---|---|---|
Timeout during connect (likely firewall problem) | port 80 zamknięty lub nazwa wskazuje na inny adres | zapora (lekcja 5.2), A/AAAA (lekcja 7.1) |
Invalid response from http://.../.well-known/acme-challenge/...: 404 | odpowiada inny serwer lub inny server block, często przez IPv6 | listen [::]:80, sprawdzić rekord AAAA |
CAA record for example.com prevents issuance | rekord CAA dopuszcza wyłącznie innego wystawcę | zmienić CAA (lekcja 7.1) |
too many certificates already issued | limit (rate limit) | odczekać; testować w środowisku staging |
Let's Encrypt stosuje limity (rate limits), aby zapobiegać nadużyciom. Najważniejsze: najwyżej 50 nowych certyfikatów na zarejestrowaną domenę w ciągu 7 dni, najwyżej 5 certyfikatów dla dokładnie tego samego zestawu nazw w ciągu 7 dni oraz najwyżej 5 nieudanych walidacji na nazwę na godzinę. Kto eksperymentuje i raz po raz składa wniosek, szybko na nie trafi. Dlatego prosimy testować w środowisku staging, które ma znacznie szersze limity, ale wydaje certyfikaty, którym przeglądarki nie ufają:
anna@web1:~$ sudo certbot certonly --nginx --staging -d test.example.comJeśli tam wszystko działa, prosimy zawnioskować o prawdziwy certyfikat.
Na AlmaLinux i Rocky Linux
Tam certbot pochodzi z EPEL (dnf install certbot python3-certbot-nginx) lub jest dostępny jako snap. Wtyczka i polecenia są takie same. Prosimy pamiętać o firewalld (--add-service=http --add-service=https) i o SELinux, jeśli certyfikaty znajdują się w nietypowym miejscu.
W praktyce
W pakiecie hostingowym panel zajmuje się certyfikatem za Państwa (w WebOké i u innych firm hostingowych z DirectAdmin, cPanel lub Plesk). Na VPS robią to Państwo sami, za pomocą certbot, Caddy lub klienta ACME dostarczonego z Państwa oprogramowaniem. Dotyczy to każdego dostawcy.
Podsumowanie
- Certyfikat Let's Encrypt potwierdza, że zarządzają Państwo nazwą; certbot wnioskuje o niego, instaluje go i odnawia za pomocą ACME.
- HTTP-01 wymaga otwartego dla wszystkich portu 80 oraz takiej samej odpowiedzi przez IPv4 i IPv6; DNS-01 służy do certyfikatów wildcard.
certbot --nginx -d ... -d ...załatwia certyfikat i przekierowanie na https; prosimy zawnioskować od razu o wszystkie nazwy strony.- Certyfikaty są obecnie ważne 90 dni, a okres ten się skraca; prosimy sprawdzić timer i
certbot renew --dry-runoraz samodzielnie pilnować daty wygaśnięcia. - Prosimy testować z
--staging, aby uniknąć limitów; warto zwrócić uwagę na CAA.
Quiz
Zadanie
Zadanie Z7.3: https z ważnym certyfikatem. Prosimy uzyskać certyfikat dla swojej strony (za pomocą certbot lub Caddy), przekierować http na https i przetestować odnawianie za pomocą certbot renew --dry-run (w przypadku Caddy: sprawdzić w logach, czy certyfikat został pobrany). Prosimy wpisać nazwę swojej strony. Program nawiązuje połączenie TLS z portem 443 i sprawdza, czy certyfikat jest ważny, podpisany przez zaufanego wystawcę i obejmuje Państwa nazwę, a następnie pobiera http://<naam>/, aby sprawdzić, czy następuje przekierowanie na https. Dodatkowo prosimy podać, kiedy wygasa Państwa certyfikat i jak u Państwa zorganizowane jest odnawianie.
Przeczytaj więcej
- Aktywacja, odnawianie i rozwiązywanie problemów z certyfikatem SSL
- Bezpłatny kurs DNS 5.2: CAA: kto może wydawać certyfikaty?
- Let's Encrypt, Challenge Types: https://letsencrypt.org/docs/challenge-types/
- Let's Encrypt, Rate Limits: https://letsencrypt.org/docs/rate-limits/
- Let's Encrypt, Decreasing Certificate Lifetimes to 45 Days: https://letsencrypt.org/2025/12/02/from-90-to-45
- Instrukcje Certbot (nginx): https://certbot.eff.org/instructions?ws=nginx&os=snap
