Jak wygenerować certyfikat SSL Let’s Encrypt dla NGINX na Ubuntu?

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.

Total
0
Shares

Brak połączenia z internetem