🔒 Jak zabezpieczyć serwer Nginx przy użyciu Let's Encrypt na Ubuntu 20.04

Szyfrowanie HTTPS stało się absolutnym standardem w dzisiejszym internecie. Dzięki Let's Encrypt możesz łatwo i całkowicie za darmo zabezpieczyć swój serwer Nginx certyfikatem SSL/TLS. Ten przewodnik krok po kroku przeprowadzi Cię przez cały proces instalacji i konfiguracji HTTPS na serwerze Nginx działającym na Ubuntu 20.04.

⚡ Ekspresowe Podsumowanie:

  1. Let's Encrypt to darmowy, zaufany dostawca certyfikatów SSL/TLS, który umożliwia łatwą implementację HTTPS.
  2. Certbot to narzędzie automatyzujące proces pozyskiwania i odnawiania certyfikatów Let's Encrypt.
  3. Prawidłowa konfiguracja HTTPS w Nginx wymaga odpowiednich ustawień wirtualnych hostów i parametrów SSL.
  4. Automatyczne odnawianie certyfikatów zapewnia nieprzerwaną ochronę bez ręcznej interwencji.

🗺️ Spis Treści - Twoja Mapa Drogowa


📋 Wymagania wstępne

Zanim przystąpimy do zabezpieczania serwera Nginx przy użyciu Let's Encrypt, upewnij się, że spełniasz następujące wymagania:

Wymagania systemowe

  • Serwer z Ubuntu 20.04 LTS
  • Co najmniej 1 GB RAM
  • Dostęp sudo lub root do serwera
  • Zainstalowany serwer Nginx
  • Zarejestrowana domena wskazująca na adres IP serwera

Przygotowanie środowiska

Jeśli nie masz jeszcze zainstalowanego Nginx, możesz go zainstalować za pomocą następujących poleceń:

# Aktualizacja repozytoriów
sudo apt update

# Instalacja Nginx
sudo apt install nginx -y

# Sprawdzenie statusu Nginx
sudo systemctl status nginx

Konfiguracja nazwy domeny

Aby Let's Encrypt mógł wydać certyfikat, Twoja domena musi wskazywać na adres IP serwera. Sprawdź czy rekord DNS został poprawnie skonfigurowany:

# Sprawdzenie za pomocą ping
ping twoja-domena.pl

# Sprawdzenie za pomocą nslookup
nslookup twoja-domena.pl

Jeśli masz dostęp do panelu DNS swojego dostawcy domeny, upewnij się, że rekord A wskazuje na adres IP Twojego serwera.

Konfiguracja zapory sieciowej

Jeśli na serwerze jest aktywna zapora sieciowa (ufw), należy otworzyć porty dla HTTP (80) i HTTPS (443):

# Sprawdzenie statusu zapory
sudo ufw status

# Jeśli zapora jest aktywna, otwórz porty dla Nginx
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP' # Opcjonalnie, usuń regułę tylko dla HTTP
sudo ufw status

🔧 Instalacja Certbot

Certbot to najpopularniejsze narzędzie do automatycznego zarządzania certyfikatami Let's Encrypt. Zainstalujmy je na naszym serwerze.

Dodanie repozytorium Certbot

Najlepszym sposobem instalacji Certbot na Ubuntu 20.04 jest użycie oficjalnego repozytorium:

# Instalacja wymaganych pakietów
sudo apt install -y software-properties-common

# Dodanie repozytorium Certbot
sudo add-apt-repository -y ppa:certbot/certbot

# Aktualizacja repozytoriów
sudo apt update

Instalacja Certbot i pluginu Nginx

Teraz zainstalujmy Certbot wraz z pluginem dla Nginx:

# Instalacja Certbot i pluginu Nginx
sudo apt install -y certbot python3-certbot-nginx

Weryfikacja instalacji

Po instalacji warto sprawdzić, czy Certbot został poprawnie zainstalowany:

# Sprawdzenie wersji Certbot
certbot --version

Powinien wyświetlić się komunikat z informacją o wersji, np. certbot 1.x.x.

🚀 Uzyskanie certyfikatu SSL dla Nginx

Teraz przystąpimy do uzyskania certyfikatu SSL dla naszej domeny i konfiguracji Nginx.

Sprawdzenie konfiguracji Nginx

Przed uruchomieniem Certbot, upewnijmy się, że konfiguracja Nginx zawiera prawidłową dyrektywę server_name dla Twojej domeny:

# Sprawdzenie plików konfiguracyjnych Nginx
sudo ls -la /etc/nginx/sites-available/

# Edycja pliku konfiguracyjnego domeny
sudo nano /etc/nginx/sites-available/twoja-domena.pl

Upewnij się, że plik zawiera prawidłową dyrektywę server_name:

server {
    listen 80;
    server_name twoja-domena.pl www.twoja-domena.pl;

    # Pozostałe ustawienia...
}

Zapisz plik (Ctrl+O, następnie Enter) i zamknij edytor (Ctrl+X).

Sprawdzenie składni konfiguracji Nginx

Przed zastosowaniem zmian, sprawdź poprawność składni konfiguracji Nginx:

sudo nginx -t

Jeśli nie ma błędów, przeładuj konfigurację Nginx:

sudo systemctl reload nginx

Uruchomienie Certbot i uzyskanie certyfikatu

Teraz możemy uruchomić Certbot, aby uzyskać certyfikat SSL i automatycznie skonfigurować Nginx:

sudo certbot --nginx -d twoja-domena.pl -d www.twoja-domena.pl

Certbot zadaje kilka pytań podczas procesu:

  1. Adres e-mail - potrzebny do powiadomień o wygaśnięciu i problemach z certyfikatem
  2. Zgoda na warunki użytkowania - wpisz 'A' (Agree), aby zaakceptować
  3. Zgoda na udostępnianie adresu e-mail - opcjonalne, możesz wybrać 'N' (No)
  4. Przekierowanie HTTP do HTTPS - zaleca się wybrać opcję 2 (Redirect), aby wszystkie połączenia HTTP były automatycznie przekierowywane na HTTPS

Po zakończeniu procesu, Certbot wyświetli informację o sukcesie i lokalizacji plików certyfikatu.

Weryfikacja konfiguracji SSL

Po zakończeniu działania Certbot, sprawdźmy czy konfiguracja została poprawnie zastosowana:

# Sprawdzenie konfiguracji Nginx
sudo nginx -t

# Przeładowanie konfiguracji
sudo systemctl reload nginx

Teraz możesz otworzyć przeglądarkę i wejść na swoją stronę przez HTTPS (https://twoja-domena.pl). Powinieneś zobaczyć zieloną kłódkę, co oznacza, że połączenie jest bezpieczne.

🔄 Automatyczne odnawianie certyfikatów

Certyfikaty Let's Encrypt są ważne przez 90 dni. Certbot domyślnie dodaje zadanie cron, które próbuje odnowić certyfikaty na 30 dni przed ich wygaśnięciem.

Sprawdzenie automatycznego odnawiania

Możemy przetestować procedurę odnawiania, uruchamiając ją w trybie testowym:

sudo certbot renew --dry-run

Jeśli nie ma błędów, oznacza to, że automatyczne odnawianie zostało poprawnie skonfigurowane.

Konfiguracja automatycznego odnawiania (jeśli potrzebne)

Jeśli automatyczne odnawianie nie zostało skonfigurowane, możemy dodać zadanie cron ręcznie:

# Otwieranie edytora crontab
sudo crontab -e

Dodaj następującą linię na końcu pliku:

0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

Ta konfiguracja spowoduje codzienne sprawdzanie certyfikatów o godzinie 3:00 nad ranem i odnowienie tych, które zbliżają się do wygaśnięcia.

🛡️ Optymalizacja bezpieczeństwa SSL/TLS

Po uzyskaniu certyfikatu warto zoptymalizować ustawienia SSL/TLS, aby zapewnić najwyższy poziom bezpieczeństwa.

Konfiguracja silnych parametrów SSL

Utwórzmy plik z silnymi parametrami Diffie-Hellmana:

# Generowanie silnych parametrów DH (może potrwać kilka minut)
sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048

Następnie utwórzmy plik z konfiguracją SSL, który będziemy mogli dołączyć do wszystkich wirtualnych hostów:

# Tworzenie pliku konfiguracyjnego
sudo nano /etc/nginx/snippets/ssl-params.conf

Wklej poniższą konfigurację:

# Parametry SSL/TLS
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ecdh_curve secp384r1;

# Sesje SSL
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

# HSTS (uncomment to enable)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

# Inne nagłówki bezpieczeństwa
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";

Aktualizacja konfiguracji wirtualnego hosta

Teraz musimy zaktualizować konfigurację wirtualnego hosta, aby dołączyć te parametry:

# Edycja pliku konfiguracyjnego domeny
sudo nano /etc/nginx/sites-available/twoja-domena.pl

Upewnij się, że blok server dla HTTPS zawiera następujący wpis:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name twoja-domena.pl www.twoja-domena.pl;

    ssl_certificate /etc/letsencrypt/live/twoja-domena.pl/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/twoja-domena.pl/privkey.pem;

    # Dołączenie zoptymalizowanych parametrów SSL
    include snippets/ssl-params.conf;

    # Pozostałe ustawienia...

    root /var/www/twoja-domena.pl/html;
    index index.html index.htm index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

# Przekierowanie HTTP do HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name twoja-domena.pl www.twoja-domena.pl;

    return 301 https://$host$request_uri;
}

Sprawdzenie konfiguracji i przeładowanie Nginx

Po wprowadzeniu zmian, sprawdź poprawność składni i przeładuj konfigurację:

# Sprawdzenie składni
sudo nginx -t

# Przeładowanie serwera Nginx
sudo systemctl reload nginx

Testowanie bezpieczeństwa SSL

Teraz możemy przetestować bezpieczeństwo naszej konfiguracji SSL za pomocą narzędzi online:

  1. SSL Labs Server Test
  2. Security Headers

Wprowadź adres swojej strony i sprawdź wynik. Przy poprawnej konfiguracji powinieneś uzyskać ocenę A lub A+.

🔍 Monitorowanie certyfikatów i rozwiązywanie problemów

Aby utrzymać serwer bezpiecznym, warto regularnie monitorować stan certyfikatów i rozwiązywać ewentualne problemy.

Sprawdzanie statusu certyfikatów

Możemy sprawdzić status wszystkich certyfikatów zainstalowanych przez Certbot:

sudo certbot certificates

Komenda wyświetli listę certyfikatów wraz z datami ich ważności.

Odnawianie certyfikatów ręczne

Jeśli potrzebujesz ręcznie odnowić certyfikaty, możesz użyć:

sudo certbot renew

Lub odnowić tylko konkretny certyfikat:

sudo certbot certonly --force-renewal -d twoja-domena.pl -d www.twoja-domena.pl

Typowe problemy i ich rozwiązania

Problem 1: Certbot nie może zweryfikować własności domeny

Challenge failed for domain twoja-domena.pl

Rozwiązanie:

  • Sprawdź, czy Twoja domena prawidłowo wskazuje na serwer
  • Upewnij się, że port 80 nie jest blokowany przez zaporę
  • Sprawdź logi Nginx: sudo tail -f /var/log/nginx/error.log

Problem 2: Błąd podczas odnawiania certyfikatu

Unable to renew certificate

Rozwiązanie:

  • Sprawdź uprawnienia do katalogów: sudo chmod -R 755 /etc/letsencrypt/
  • Sprawdź logi Certbot: sudo cat /var/log/letsencrypt/letsencrypt.log
  • Spróbuj uruchomić z opcją --force-renewal: sudo certbot renew --force-renewal

Problem 3: Mixed Content po wdrożeniu HTTPS

Jeśli przeglądarka pokazuje błędy "Mixed Content" (mieszana zawartość), oznacza to, że część zasobów (obrazy, skrypty, arkusze stylów) jest nadal ładowana przez niezabezpieczone połączenie HTTP.

Rozwiązanie:

  • Zaktualizuj odnośniki w kodzie HTML, aby używały https:// zamiast http://
  • Użyj odnośników względnych tam, gdzie to możliwe: //example.com/image.jpg lub /image.jpg
  • Sprawdź kod swojej strony za pomocą narzędzi deweloperskich w przeglądarce

Logowanie i debugowanie

Główne pliki logów, które warto sprawdzić przy problemach z SSL:

# Logi Nginx
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log

# Logi Certbot
sudo tail -f /var/log/letsencrypt/letsencrypt.log

📚 Dodatkowe konfiguracje dla specyficznych przypadków

W zależności od Twoich potrzeb, możesz potrzebować dodatkowych konfiguracji.

Konfiguracja wielu domen

Jeśli obsługujesz wiele domen na jednym serwerze, możesz uzyskać certyfikaty dla wszystkich z nich jednocześnie:

sudo certbot --nginx -d domena1.pl -d www.domena1.pl -d domena2.pl -d www.domena2.pl

Konfiguracja dla aplikacji PHP (np. WordPress)

Jeśli używasz PHP (np. dla WordPress), dodaj odpowiednią konfigurację do bloku serwera HTTPS:

server {
    listen 443 ssl http2;
    # ... pozostałe ustawienia SSL ...

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

Konfiguracja dla aplikacji Node.js

Jeśli używasz aplikacji Node.js, skonfiguruj Nginx jako reverse proxy:

server {
    listen 443 ssl http2;
    # ... pozostałe ustawienia SSL ...

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Konfiguracja dla certyfikatu wildcard

Jeśli potrzebujesz certyfikatu dla wszystkich subdomen (certyfikat wildcard), użyj:

sudo certbot certonly --manual --preferred-challenges=dns --email twoj-email@example.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d *.twoja-domena.pl -d twoja-domena.pl

Pamiętaj, że w przypadku certyfikatu wildcard będziesz musiał zweryfikować własność domeny poprzez utworzenie rekordu DNS TXT.

🔄 Aktualizacja Nginx i Certbot

Aby utrzymać serwer bezpiecznym, regularnie aktualizuj oprogramowanie:

# Aktualizacja pakietów
sudo apt update
sudo apt upgrade

# Sprawdzenie wersji Nginx
nginx -v

# Sprawdzenie wersji Certbot
certbot --version

🚨 Rozwiązywanie typowych problemów z konfiguracją HTTPS

Problem: Certyfikat wygasł

Jeśli certyfikat wygasł, odnów go ręcznie:

sudo certbot renew --force-renewal

Problem: Certyfikat nie odnawia się automatycznie

Sprawdź zadania cron:

sudo systemctl status certbot.timer

Jeśli timer nie jest aktywny, włącz go:

sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

Problem: Nginx nie startuje po konfiguracji SSL

Jeśli Nginx nie startuje po konfiguracji SSL, sprawdź błędy:

sudo nginx -t
sudo journalctl -xe

Typowe problemy to:

  1. Nieprawidłowa ścieżka do plików certyfikatu
  2. Nieprawidłowe uprawnienia do plików certyfikatu
  3. Błędy w konfiguracji SSL

❓ FAQ - Odpowiedzi na Twoje Pytania

Czy Let's Encrypt jest bezpieczny dla komercyjnych stron?
Tak, certyfikaty Let's Encrypt są uznawane za równie bezpieczne jak płatne certyfikaty i są szeroko stosowane przez firmy komercyjne, w tym duże korporacje. Wszystkie uznane przeglądarki ufają certyfikatom Let's Encrypt.

Jak często muszę odnawiać certyfikat Let's Encrypt?
Certyfikaty Let's Encrypt są ważne przez 90 dni. Certbot automatycznie próbuje odnowić je na 30 dni przed wygaśnięciem. Nie musisz ręcznie odnawiać certyfikatów, jeśli timer Certbot jest aktywny.

Czy mogę używać Let's Encrypt dla wielu subdomen?
Tak, możesz uzyskać certyfikat dla wielu subdomen, dodając je jako parametry w komendzie certbot (-d subdomena1.example.com -d subdomena2.example.com). Możesz również uzyskać certyfikat wildcard (*.example.com).

Czy Let's Encrypt obsługuje wszystkie przeglądarki?
Tak, certyfikaty Let's Encrypt są uznawane przez wszystkie główne przeglądarki, w tym Chrome, Firefox, Safari, Edge, IE11+ i przeglądarki mobilne.

Czy mogę przenieść certyfikat na inny serwer?
Tak, możesz przenieść pliki certyfikatu na inny serwer. Zwykle znajdują się one w katalogu /etc/letsencrypt/live/twoja-domena.pl/. Pamiętaj, że potrzebujesz plików fullchain.pem, privkey.pem i chain.pem.

Czy Let's Encrypt oferuje certyfikaty EV (Extended Validation)?
Nie, Let's Encrypt oferuje tylko certyfikaty DV (Domain Validation). Certyfikaty EV są dostępne tylko u płatnych dostawców certyfikatów.

Czy istnieje limit liczby certyfikatów, które mogę uzyskać?
Let's Encrypt ma pewne limity, aby zapobiec nadużyciom:

  • 50 certyfikatów na domenę w tygodniu
  • 100 nazw domen na certyfikat
  • 5 duplikatów certyfikatów na tydzień

Dla większości normalnych zastosowań limity te są więcej niż wystarczające.

🏁 Podsumowanie - Droga do bezpiecznej strony z HTTPS

Zabezpieczenie serwera Nginx przy użyciu Let's Encrypt na Ubuntu 20.04 jest procesem prostym, a jednocześnie niezwykle ważnym dla bezpieczeństwa Twojej witryny. W tym przewodniku omówiliśmy:

  1. Instalację i konfigurację Certbot dla zarządzania certyfikatami Let's Encrypt
  2. Uzyskanie i wdrożenie certyfikatów SSL/TLS dla Twojej domeny
  3. Optymalizację bezpieczeństwa poprzez konfigurację silnych parametrów SSL
  4. Automatyczne odnawianie certyfikatów dla ciągłej ochrony
  5. Rozwiązywanie typowych problemów związanych z certyfikatami

Dzięki tym krokom Twoja witryna jest teraz zabezpieczona protokołem HTTPS, co zapewnia:

  • Poufność danych użytkowników Twojej witryny
  • Ochronę przed atakami typu man-in-the-middle
  • Lepsze pozycjonowanie w wynikach wyszukiwania Google
  • Zwiększone zaufanie użytkowników dzięki zielonej kłódce w przeglądarce
  • Możliwość korzystania z nowoczesnych technologii webowych wymagających HTTPS

🚀 Potrzebujesz profesjonalnego hostingu z pełną konfiguracją SSL/TLS?

Sprawdź ofertę hostingu IQHost z darmowymi certyfikatami Let's Encrypt

Wszystkie nasze pakiety hostingowe zawierają darmowe certyfikaty SSL/TLS i profesjonalną konfigurację HTTPS, aby Twoja strona była zawsze bezpieczna!

Czy ten artykuł był pomocny?

Wróć do listy wpisów

Twoja strona WordPress działa wolno?

Sprawdź nasz hosting WordPress z ultraszybkimi dyskami NVMe i konfiguracją serwera zoptymalizowaną pod kątem wydajności. Doświadcz różnicy już dziś!

Sprawdź ofertę hostingu
30-dniowa gwarancja zwrotu pieniędzy