Let’s Encrypt zapewnia darmowe certyfikaty TLS/SSL umożliwiające szyfrowaną komunikację po protokole HTTPS. W niniejszym poradniku pokazujemy jak w prosty sposób wygenerować certyfikat dla domeny i skonfigurować serwer NGINX w systemie Ubuntu.
Instalacja Certbota
Certbot jest stworzonym przez Let’s Encrypt narzędziem ułatwiającym i automatyzującym proces pozyskiwania certyfikatu, a także dodającym odpowiednie zapisy w plikach konfiguracyjnych certyfikowanych stron na serwerze WWW.
Certbota wraz z odpowiednim rozszerzeniem do obsługi NGINX instalujemy podobnie jak inne oprogramowanie na Ubuntu:
sudo apt update sudo apt install certbot python3-certbot-nginx
Po udanej instalacji Certbot jest już gotowy do działania, wcześniej musimy jednak sprawdzić konfigurację firewalla i dostosować ustawienia serwera www nginx.
Sprawdzenie firewalla
Warto upewnić się, czy firewall działa i – jeśli działa – przepuszcza ruch po protokole HTTPS. Stan firewalla w systemie Ubuntu sprawdzić można poleceniem:
sudo ufw status
Odpowiedź “inactive” oznacza że firewall ufw jest wyłączony, a my możemy przejść do kolejnego kroku. Choć oczywiście w przyszłości warto dla bezpieczeństwa rozważyć włączenie go i odpowiednie skonfigurowanie.
W przypadku uzyskania odpowiedzi “active”, warto przyjrzeć się ustawionym regułom. Powinny się wśród z nich znajdować zezwolenia (ALLOW) na ruch po HTTPS dla wszystkich usług lub choćby samego NGINX. Jeśli ich brakuje, konieczne będzie odpowiedniej reguły:
sudo ufw allow 'Nginx Full'
Jeśli już wcześniej wśród reguł znajdowała się taka odnosząca się do NGINX, np. “Nginx HTTP”, warto ją usunąć, ponieważ wprowadzona w poprzednim kroku reguła będzie duplikować się z nią w zakresie ruchu nieszyfrowanego:
sudo ufw delete allow 'Nginx HTTP'
Konfiguracja NGINX
Certbot musi być w stanie odnaleźć właściwy blok “server” w istniejącej konfiguracji NGINX, a dokładniej dyrektywy “server_name” identycznej do nazwy domeny, o której certyfikację będziemy występować.
Konfigurację tę znajdziemy w katalogu /etc/nginx/sites-available/
Zależnie od konkretnego przypadku, wszystkie wirtualne hosty (“serwery”) mogą znajdować się w jednym pliku, np. /etc/nginx/sites-available/default lub być podzielone, np. /etc/nginx/sites-available/domena1.pl, /etc/nginx/sites-available/domena2.pl itd.
Należy upewnić się, że istnieje konfiguracja dla domeny, którą chcemy zabezpieczyć. Powinna ona znajdować się w jednym z plików w katalogu /etc/nginx/sites-available/ i wyglądać podobnie:
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; server_name <nazwa_domeny> www.<nazwa_domeny>; }
Oczywiście <nazwa_domeny> oraz www.<nazwa_domeny> zastępujemy swoją własną domeną, np. mojadomena.pl i www.mojadomena.pl.
Jeśli dyrektywa server_name nie jest podana, konieczne jest jej wpisanie wraz z nazwą domeny i – najlepiej – nazwą domeny z subdomeną WWW, na wzór powyższego przykładu.
Po dodaniu zmian, wykonujemy sprawdzenie konfiguracji NGINX:
sudo nginx -t
Jeśli sprawdzenie konfiguracji przebiegło pomyślnie, można przejść do restartu NGINX. Jeśli nie, konieczne będzie ponowne ręczne sprawdzenie poprawności konfiguracji w edytowanym wcześniej pliku, szczególnie pod kątem literówek lub pominiętych znaków.
Restart NGINX wykonujemy poleceniem:
sudo systemctl restart nginx
Wygenerowanie certyfikatu SSL poprzez Certbot
Po instalacji Certbota, sprawdzeniu firewalla i konfiguracji wirtualnego hosta w NGINX, przyszedł wreszcie czas na wygenerowanie certyfikatu.
sudo certbot --nginx -d <NAZWA_DOMENY> -d www.<NAZWA_DOMENY>
Powyższe polecenie, wykonywane z argumentem –nginx, umożliwi Certbotowi dodanie odpowiedniej konfiguracji, a także wygenerowanie certyfikatu dla domen wskazanych po argumentach -d.
Jeśli jest to pierwsze uruchomienie certbota na tym serwerze, zostaniemy zapytani o adres e-mail, na który wysyłane będą powiadomienia o odnowieniu certyfikatu, zgodę na warunki, a także opcjonalną zgodę na przesyłanie dodatkowych informacji na wskazany adres e-mail przez Electronic Frontier Foundation.
Po udanym pozyskaniu certyfikatu, Certbot zapyta o automatyczne ustawienie przekierowań z HTTP na HTTPS. Nie zalecam korzystania z tej opcji, szczególnie jeśli nie mamy pewności, że strona zadziała prawidłowo po tym drugim protokole.
Teraz czas sprawdzić działanie naszej strony, wpisując jej domenę z protokołem HTTPS w pole adresu przeglądarki:
https://<NAZWA_DOMENY>
Ręczne ustawienie przekierowania na HTTPS
Jeśli nie wybraliśmy opcji automatycznego przekierowania na HTTPS, czas wrócić do pliku konfiguracyjnego naszego wirtualnego hosta. Pojawiły się tam dodatkowe zapisy z komentarzem # managed by certbot.
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; server_name <nazwa_domeny> www.<nazwa_domeny>;listen 443 ssl;
ssl_certificate
/etc/letsencrypt/live/<NAZWA_DOMENY>/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/<NAZWA_DOMENY>/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
}
Należy dodać nowy wirtualny host obsługujący ruch po HTTP dla naszej domeny i przekierowujący go na HTTPS. Przy okazji przekierowujemy również wersję www na tę bez www lub – ewentualnie – na odwrót.
server { listen 80; listen [::]:80; server_name <NAZWA_DOMENY> www.<NAZWA_DOMENY>; if ($scheme != "https") { return 301 https://<NAZWA_DOMENY>$request_uri; } }
Przy “return 301 https://<NAZWA_DOMENY>$request_uri;” w miejscu <NAZWA_DOMENY> wprowadzamy nazwę domeny naszej strony, zależnie od preferencji i wcześniejszych ustawień z lub bez www.
Następnie z wcześniejszego wirtualnego hosta usuwamy linijki zawierające informacje o nasłuchiwaniu na porcie 80:
listen 80; listen [::]:80;
Nie są one już potrzebne, ponieważ korzystamy z portu 443. Usuwamy również server_name z www, ponieważ ruch z www przekierowujemy na wersję bez www. Chyba że wybraliśmy odwrotną opcję, wtedy zostawiamy www.<NAZWA_DOMENY> usuwając wersję bez www.
Ostateczny plik powinien wyglądać podobnie do tego:
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; server_name <NAZWA_DOMENY>; listen 443 ssl; ssl_certificate /etc/letsencrypt/live/<NAZWA_DOMENY>/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/<NAZWA_DOMENY>/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; } server { listen 80; listen [::]:80; server_name www.; if ($scheme != "https") { return 301 https://$request_uri; } }
Ponownie sprawdzamy poprawność konfiguracji poleceniem:
sudo nginx -t
A następnie, jeśli nie pojawił się żaden problem, restartujemy serwer NGINX:
sudo systemctl restart nginx
Odnawianie certyfikatu
Certyfikaty SSL/TLS są wystawiane na określony czas, w przypadku tych pochodzących od Let’s Encrypt jest to 90 dni.
Certbot automatycznie odnawia wygenerowane certyfikaty dodając timer w systemd. Jego stan można sprawdzić poleceniem:
sudo systemctl status certbot.timer
Aby przetestować działanie odnawiania, możemy dodatkowo wykonać polecenie:
sudo certbot renew --dry-run
Jeśli nie pojawił się żaden błąd, Certbot będzie automatycznie odnawiał certyfikat i restartował NGINX w celu wczytania zmian. Nie będzie wymagane żadne działanie ze strony administratora. Gdyby odnawianie któregoś razu się nie powiodło, na wskazany podczas generowania certyfikatu adres e-mail zostanie wysłana odpowiednia informacja.