Zabezpieczanie serwera Nginx przy użyciu darmowego certyfikatu z Let’s Encrypt

W tym wpisie przedstawione zostaną następujące kwestie: czym jest HTTPS, zalety korzystania z HTTPS, zabezpieczanie serwera Nginx poprzez używanie szyfrowanego protokołu HTTP czyli HTTPS, ustawianie HTTPS w WordPressie.

Czym jest protokół HTTPS?

HTTPS (ang. Hypertext Transfer Protocol Secure) jest szyfrowaną wersją protokołu HTTP.  Szyfrowanie odbywa się poprzez protokół TLS(ang. Transport Layer Security) działający warstwę niżej niż HTTPS, czyli w warstwie prezentacji modelu OSI. Najpierw występuje więc wymiana kluczy, a dopiero później wykonywane jest żądanie HTTP.

Zalety korzystania z HTTPS

Główną zaletą korzystania z HTTPS jest oczywiście bezpieczeństwo. Korzystając z szyfrowanej wersji HTTP możemy być prawie pewni, że tylko serwer może odczytać dane do niego przesyłane.

Google indeksując strony bierze pod uwagę obecność certyfikatu SSL. Strony wykorzystujące HTTPS są milej widziane dla google, przez co mogą zyskać odpowiednio wyższą pozycję w wyszukiwarce.

Zabezpieczanie serwera Nginx przy użyciu Let’s Encrypt

Let’s Encrypt jest to Certificate Authority, czyli dostawca wystawiający certyfikaty TLS/SSL. Instalacja certyfikatu na serwerze jest bardzo prosta jeśli mamy serwer Apache. Natomiast w moim przypadku, gdzie używam Nginx lista rzeczy do wykonania minimalnie się wydłuża.

Istnieje specjalne narzędzie Certbot do uzyskiwania certyfikatów z Let’s Encrypt. Jest ono dostarczane przez amerykańską organizację Electronic Frontier Foundation mającą na celu walkę o wolności obywatelskie. Do takich wolności możemy na pewno zaliczyć prywatność, stąd też wsparcie dla szyfrowanego internetu. Organizacja jest również patronem sieci Tor.

Instalacja Certbot na Ubuntu 16.04

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot

 Uzyskiwanie certyfikatu

Do uzyskania certyfikatu użyjemy pluginu Webroot, w tym celu edytujemy config Nginxa dodając następujący kod:

location ~ /.well-known {
  allow all;
}

Następnie sprawdzamy poprawność konfiguracji Nginxa:

sudo nginx -t

Jeśli wszystko jest ok to restartujemy usługę:

sudo systemctl restart nginx

Teraz możemy przejść do wykorzystania narzędzia Certbot. W poniższym przykładzie użyłem sarvendev.com, jeśli certyfikat ma być uzyskany dla innej domeny, należy podać pożądaną wartość.

sudo certbot certonly --webroot --webroot-path=/var/www/html -d sarvendev.com -d www.sarvendev.com

Konfiguracja Nginx’a

Zaczynamy od wygenerowania grupy Diffiego-Hellmana, która jest niezbędna do bezpiecznego działania protokołu uzgadniania kluczy.

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Kolejno tworzymy fragmenty kodu konfiguracji, który załączymy w pliku konfiguracyjnym Nginx’a.  W tym celu tworzymy następujący plik oraz wstawiamy treść jak poniżej:

sudo nano /etc/nginx/snippets/ssl-sarvendev.com.conf
ssl_certificate /etc/letsencrypt/live/sarvendev.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/sarvendev.com/privkey.pem;

Pliki które tutaj podajemy zostały dostarczone poprzednio przez odpalenie narzędzia Certbot.

Następnie tworzymy kolejny pliki:

sudo nano /etc/nginx/snippets/ssl-params.conf

Tutaj zawieramy konfigurację protokołu SSL pochodzącą ze strony cipherli.st.

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off; # Requires nginx >= 1.5.9
ssl_stapling on; # Requires nginx >= 1.3.7
ssl_stapling_verify on; # Requires nginx => 1.3.7
resolver  8.8.8.8 8.8.4.4
valid=300s;
resolver_timeout 5s;
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

Uzupełniamy serwery DNS oraz dodatkowo dodajemy ssl_dpharam i adres pliku wygenerowanego wcześniej(Grupa Diffiego-Hellmana). Następnie przechodzimy do właściwego pliku konfiguracyjnego Nginx’a. W moim przypadku jest to /etc/nginx/sites-available/default. Dla konfiguracji SSL tworzymy drugą sekcję server{}, natomiast pierwszą odpowiadającą za zwykły protokół HTTP modyfikujemy dodając przekierowanie na HTTPS. Poniżej zostało zaprezentowane jak to powinno wyglądać:

server {
  listen 80 default_server;
  listen [::]:80 default_server;
  server_name sarvendev.com www.sarvendev.com;
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl http2 default_server;
  listen [::]:443 ssl http2 default_server;
  include snippets/ssl-sarvendev.com.conf;
  include snippets/ssl-params.conf;
       
  (...)
}

Następnie sprawdzamy poprawność konfiguracji oraz restartujemy Nginx’a.

sudo nginx -t
sudo systemctl restart nginx

Automatyczne odnawianie certyfikatu

Edytujemy tablicę crona:

sudo crontab -e

Dodajemy następującą treść:

15 6 * * 0 /usr/bin/certbot renew --quiet --renew-hook "/bin/systemctl reload nginx"

Wpis można dowolnie edytować, poniższa wersja odpowiada za odpalanie co tydzień w niedziele o 6:15 Certbota oraz restart usługi Nginx.

Sprawdzanie certyfikatu

Po wejściu na stronę widzimy zieloną kłódkę jeśli strona posiada ważny certyfikat SSL. Jeśli natomiast zależy nam na szczegółach wchodzimy w devtools, zakładka Security i widzimy następujący ekran:

Natomiast dokładniejsze informacje jak na przykład data ważności, możemy znaleźć po kliknięciu w View certificate:

WordPress – przejście z http na https

Oprócz zmiany adresu strony w ustawieniach, należy zaktualizować wszystkie linki na przykład za pomocą wtyczki Velvet Blues Update URLs (http://sarvendev.com => https://sarvendev.com) oraz jeśli gdzieś wstawiliśmy na sztywno w kodzie jakiś odnośnik bez https należy to zmienić, również gdy załączamy zewnętrzne jsy, cssy należy robić to za pomocą https, inaczej przeglądarka nie będzie wyświetlała zielonej kłódki, a w konsoli powinny pojawić się błędy o jaki zasób chodzi.

Udostępnij: