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.
Subscribe and master unit testing with my FREE eBook (+60 pages)! 🚀
In these times, the benefits of writing unit tests are huge. I think that most of the recently started projects contain unit tests. In enterprise applications with a lot of business logic, unit tests are the most important tests, because they are fast and can us instantly assure that our implementation is correct. However, I often see a problem with good tests in projects, though these tests’ benefits are only huge when you have good unit tests. So in this ebook, I share many tips on what to do to write good unit tests.
Dodaj komentarz