Jak Zainstalować Certyfikat SSL na Serwerze Nginx
Nginx jest jednym z najpopularniejszych serwerów webowych, obsługującym miliony stron internetowych na całym świecie. Ten przewodnik przeprowadzi Cię przez proces instalacji certyfikatów SSL/TLS na Nginx, od pozyskania certyfikatów po optymalną konfigurację.
Wymagania Wstępne
Przed rozpoczęciem upewnij się, że posiadasz:
- Dostęp root lub sudo do serwera
- Zainstalowany i działający Nginx
- Nazwę domeny wskazującą na Twój serwer
- Podstawową znajomość wiersza poleceń
Sprawdź wersję Nginx:
nginx -v
Metoda 1: Instalacja Certyfikatu Let’s Encrypt z Certbot
Let’s Encrypt zapewnia darmowe certyfikaty SSL z automatycznym odnawianiem. To zalecane podejście dla większości stron internetowych.
Krok 1: Instalacja Certbot
Ubuntu/Debian:
sudo apt update
sudo apt install certbot python3-certbot-nginx
CentOS/RHEL:
sudo yum install certbot python3-certbot-nginx
Fedora:
sudo dnf install certbot python3-certbot-nginx
Krok 2: Pozyskanie Certyfikatu
Certbot może automatycznie skonfigurować Nginx:
sudo certbot --nginx -d example.com -d www.example.com
Postępuj zgodnie z instrukcjami:
- Wprowadź adres e-mail (do powiadomień o odnowieniu)
- Zaakceptuj Warunki Użytkowania
- Zdecyduj, czy przekierowywać HTTP na HTTPS (zalecane)
Certbot:
- Zweryfikuje własność domeny
- Pozyska certyfikat
- Zaktualizuje konfigurację Nginx
- Przeładuje Nginx
Krok 3: Testowanie Automatycznego Odnawiania
Certyfikaty Let’s Encrypt wygasają po 90 dniach. Certbot konfiguruje automatyczne odnawianie:
# Testowanie procesu odnawiania
sudo certbot renew --dry-run
# Sprawdzenie timera odnawiania (systemd)
sudo systemctl status certbot.timer
Krok 4: Weryfikacja Instalacji
Odwiedź swoją stronę używając https://:
# Testowanie konfiguracji SSL
curl -I https://example.com
# Sprawdzenie szczegółów certyfikatu
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
Metoda 2: Instalacja Komercyjnego Certyfikatu SSL
Jeśli zakupiłeś certyfikat SSL od komercyjnego CA (DigiCert, GlobalSign, Sectigo, itp.), wykonaj te kroki.
Krok 1: Generowanie Żądania Podpisania Certyfikatu (CSR)
Utwórz klucz prywatny i CSR:
# Generowanie klucza prywatnego (RSA 2048-bit)
sudo openssl genrsa -out /etc/ssl/private/example.com.key 2048
# Zabezpieczenie klucza prywatnego
sudo chmod 600 /etc/ssl/private/example.com.key
# Generowanie CSR
sudo openssl req -new -key /etc/ssl/private/example.com.key -out /etc/ssl/certs/example.com.csr
Podczas generowania CSR podaj:
- Kod Kraju: Dwuliterowy kod kraju (np. US, GB, PL)
- Stan/Województwo: Pełna nazwa (np. California, Mazowieckie)
- Miasto: Pełna nazwa miasta
- Nazwa Organizacji: Nazwa Twojej firmy
- Jednostka Organizacyjna: Dział (opcjonalne)
- Common Name: Twoja domena (np. example.com)
- Adres E-mail: E-mail kontaktowy
Krok 2: Przesłanie CSR do Urzędu Certyfikacji
- Skopiuj zawartość CSR:
cat /etc/ssl/certs/example.com.csr
- Wklej do formularza żądania certyfikatu CA
- Ukończ walidację domeny (e-mail, DNS lub plikową)
- Pobierz wydany certyfikat i certyfikaty pośrednie
Krok 3: Instalacja Plików Certyfikatu
Prześlij pliki certyfikatu na serwer:
# Główny certyfikat
sudo nano /etc/ssl/certs/example.com.crt
# Certyfikaty pośrednie (łańcuch)
sudo nano /etc/ssl/certs/example.com-chain.crt
# Lub połącz je w jeden plik
cat example.com.crt example.com-chain.crt > example.com-fullchain.crt
sudo mv example.com-fullchain.crt /etc/ssl/certs/
Ustaw odpowiednie uprawnienia:
sudo chmod 644 /etc/ssl/certs/example.com*.crt
sudo chmod 600 /etc/ssl/private/example.com.key
Konfiguracja Nginx dla SSL
Podstawowa Konfiguracja SSL
Edytuj konfigurację strony Nginx:
sudo nano /etc/nginx/sites-available/example.com
Dodaj konfigurację SSL:
server {
listen 80;
server_name example.com www.example.com;
# Przekieruj cały HTTP na HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# Ścieżki certyfikatu SSL
ssl_certificate /etc/ssl/certs/example.com-fullchain.crt;
ssl_certificate_key /etc/ssl/private/example.com.key;
# Konfiguracja SSL
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';
# Sesja SSL
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/certs/example.com-chain.crt;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Nagłówki Bezpieczeństwa
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# Konfiguracja aplikacji
root /var/www/example.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
Testowanie Konfiguracji
Przed restartem Nginx, przetestuj konfigurację:
sudo nginx -t
Jeśli sukces, przeładuj Nginx:
sudo systemctl reload nginx
Optymalna Konfiguracja SSL w Nginx
Silne Ustawienia SSL
Dla maksymalnego bezpieczeństwa (ocena A+ na SSL Labs):
# Nowoczesna konfiguracja (obsługuje tylko TLS 1.2 i 1.3)
ssl_protocols TLSv1.2 TLSv1.3;
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_prefer_server_ciphers off;
# Parametr Diffie-Hellman dla szyfrów DHE
ssl_dhparam /etc/ssl/certs/dhparam.pem;
# HSTS (wymuszaj HTTPS przez 1 rok, włącznie z subdomenami)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
Generowanie parametrów DH (to zajmuje czas):
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Optymalizacja Wydajności
# Wznowienie Sesji SSL
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# Włącz HTTP/2
listen 443 ssl http2;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/certs/chain.pem;
Rozwiązywanie Typowych Problemów
Problemy z Łańcuchem Certyfikatów
Problem: Przeglądarka pokazuje “Niekompletny łańcuch certyfikatów”
Rozwiązanie: Dołącz certyfikaty pośrednie:
# Połącz certyfikat i łańcuch
cat certificate.crt intermediate.crt > fullchain.crt
# Lub użyj pliku bundle od CA
ssl_certificate /etc/ssl/certs/fullchain.crt;
Ostrzeżenia o Mieszanej Zawartości
Problem: Strona załadowana przez HTTPS zawiera zasoby HTTP
Rozwiązanie: Zaktualizuj wszystkie URL-e aby używały HTTPS:
<!-- Źle -->
<script src="http://example.com/script.js"></script>
<!-- Dobrze -->
<script src="https://example.com/script.js"></script>
<!-- Też dobrze (względny protokół) -->
<script src="//example.com/script.js"></script>
ERR_SSL_PROTOCOL_ERROR
Problem: Przeglądarka nie może nawiązać połączenia SSL
Rozwiązania:
- Sprawdź czy Nginx nasłuchuje na porcie 443
- Zweryfikuj czy firewall zezwala na port 443
- Przetestuj konfigurację SSL:
nginx -t - Sprawdź czy ścieżki certyfikatów są poprawne
# Sprawdź czy Nginx nasłuchuje na 443
sudo netstat -tlnp | grep :443
# Testuj firewall
sudo ufw status
sudo ufw allow 443/tcp
# Sprawdź czy pliki certyfikatów istnieją
ls -la /etc/ssl/certs/example.com*
ls -la /etc/ssl/private/example.com.key
Najlepsze Praktyki Bezpieczeństwa
Zabezpiecz Klucze Prywatne
- Używaj restrykcyjnych uprawnień (600)
- Nigdy nie commituj do kontroli wersji
- Rozważ moduły sprzętowe bezpieczeństwa (HSM) dla wrażliwych aplikacji
Regularne Aktualizacje
- Utrzymuj Nginx zaktualizowany
- Aktualizuj konfigurację SSL/TLS zgodnie z ewolucją standardów
- Monitoruj komunikaty bezpieczeństwa
Używaj Silnych Protokołów
- Wyłącz SSLv3, TLS 1.0, TLS 1.1
- Włącz tylko TLS 1.2 i TLS 1.3
- Używaj silnych zestawów szyfrów
Włącz HSTS
- Wymuszaj połączenia HTTPS
- Zapobiegaj atakom obniżenia protokołu
- Rozważ listę preload HSTS
Monitoruj Wygasanie Certyfikatów
- Używaj narzędzi monitoringu jak CrtMgr
- Konfiguruj alerty odnowienia
- Regularnie testuj procesy odnowienia
Testowanie Konfiguracji SSL
Narzędzia Online
- SSL Labs: https://www.ssllabs.com/ssltest/
- Security Headers: https://securityheaders.com/
- Mozilla Observatory: https://observatory.mozilla.org/
Testowanie Linii Poleceń
# Testuj połączenie SSL
openssl s_client -connect example.com:443 -servername example.com
# Sprawdź łańcuch certyfikatów
openssl s_client -connect example.com:443 -servername example.com -showcerts
# Testuj konkretną wersję TLS
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3
# Sprawdź OCSP stapling
openssl s_client -connect example.com:443 -status
Podsumowanie
Instalacja certyfikatów SSL na Nginx jest prosta, niezależnie od tego, czy używasz darmowych certyfikatów Let’s Encrypt, czy komercyjnych. Kluczowe punkty do zapamiętania:
- Używaj Certbot dla Let’s Encrypt (najłatwiejsza metoda)
- Przestrzegaj najlepszych praktyk bezpieczeństwa dla konfiguracji
- Włącz HTTP/2 dla lepszej wydajności
- Skonfiguruj właściwe monitorowanie wygasania certyfikatów
- Przetestuj konfigurację z SSL Labs
Przy właściwej konfiguracji SSL, Twój serwer Nginx będzie zapewniał bezpieczne, szybkie połączenia HTTPS użytkownikom. Używaj narzędzi takich jak CrtMgr do monitorowania certyfikatów i upewnienia się, że nigdy nie wygasną nieoczekiwanie.