W poprzednim wpisie skonfigurowaliśmy zestaw oprogramowania LEMP na serwerze. W tym poradniku zainstalujemy bezpłatny certyfikat SSL/TSL Let’s Encrypt i zabezpieczymy serwer www.

Let’s Encrypt

Certyfikat ten jest uznawany przez większość przeglądarek. Ważny jest on 90 dni, po tym okresie należy go odnowić.

Certyfikat X.509 szyfruje połączenia pomiędzy serwerem, a klientem, co zapobiega podsłuchiwaniu. Korzystanie z rozwiązania Let’s Encrypt zwiększa bezpieczeństwo danych.  Dodatkowym atutem za wdrożeniem certyfikatu SSL jest lepsze pozycjonowanie w wyszukiwarkach takich jak Google.

Firewall

Jeśli korzystamy z UFW, bądź innego firewalla należy odblokować ruch na porcie 443.

ufw allow 'nginx https'

Certbot

Certbot musi stworzyć tymczasowe pliki, aby uwierzytelnić domenę. Aby mu to umożliwić musimy dodać lokalizację w naszym pliku znajdującym się w sites-enabled

nano /etc/nginx/sites-enabled/shintest

Dodajemy następujące linijki

location /.well-known/acme-challenge {
 root /var/www/letsencrypt;
}

Przeładowujemy konfigurację

service nginx reload

Tworzymy folder

mkdir /var/www/letsencrypt/

Instalujemy gita

apt-get install git

Klonujemy repozytorium

git clone https://github.com/certbot/certbot /opt/certbot
cd /opt/certbot/

Jeśli chcemy, aby certyfikat został wygenerowany dla domeny z www oraz bez www należy pamiętać, aby zawrzeć obie wersje, tak jak poniżej.

./letsencrypt-auto certonly -a webroot --webroot-path=/var/www/letsencrypt/ -d strona.pl -d www.strona.pl

Podajemy adres mail

mail

Akceptujemy warunki

agree

Certyfikat został poprawnie wygenerowany.

congrats

Widzimy ścieżkę do certyfikatu, którą należy wpisać później w odpowiednim miejscu w konfiguracji nginx.

Dostosowanie nginx

W poprzednim wpisie skonfigurowaliśmy nginx, aby serwował nam WordPressa. Teraz dostosujemy tamtą konfigurację.

Otwórz plik konfiguracyjny znajdujący się w sites-enabled w folderze nginx.

nano /etc/nginx/sites-enabled/shintest

Powinien on wyglądać teraz tak:

server {
 listen 80;
 server_name naszadomena.pl www.naszadomena.pl;
 return 301 https://naszadomena.pl$request_uri;
}

server {
 listen 443;
 server_name naszadomena.pl;
 root /var/www/shintest/public;
 index index.php;
 access_log /var/www/shintest/logs/access.log;
 error_log /var/www/shintest/logs/error.log;

ssl on;
 ssl_certificate /etc/letsencrypt/live/naszadomena.pl/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/naszadomena.pl/privkey.pem;

location /.well-known/acme-challenge {
 root /var/www/letsencrypt;
}
location = /favicon.ico {
 log_not_found off;
 access_log off;
 }

location = /robots.txt {
 allow all;
 log_not_found off;
 access_log off;
 }

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

location ~ \.php$ {
 include fastcgi.conf;
 include fastcgi_params;
 fastcgi_pass unix:/var/run/php5-fpm.sock;
 fastcgi_intercept_errors on;
 fastcgi_index index.php;
 }
}

Po wejściu na nasza stronę powinniśmy zobaczyć przedrostek https zamiast http i zieloną kłódeczkę.

WordPress

W ustawieniach ogólnych wordpressa zmień adres URL na przedrostek https

wordpress_ssl

Przetestujmy domenę skanerem Qualys SSL Labs

ssl_scan_2

Wynik nie jest zadowalający. Przeprowadźmy pewne modyfikacje naszej konfiguracji.

SSLv2 i SSLv3

Wyłączmy SSlv2 i SSLv3, ponieważ nie są to bezpieczne protokoły. Dodajemy więc linijkę do server block (plik znajdujący się w sites-enabled)

ssl_protocols TLSv1.2;

Jeśli zależy nam na wsparciu starszych klientów ustawiamy wsparcie dla starszej wersji protokołu TLS

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

HTTP2

Nginx będzie nasłuchiwał połączeń SSL na porcie 443 korzystając z nowego protokołu HTTP/2. Należy pamiętać, że musimy posiadać wersję serwera www co najmniej 1.9.5

listen 443 ssl http2;

Zestaw szyfrów

Nginx będzie korzystał z tych szyfrów zamiast tych, które będą żądane przez klienta.

ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_prefer_server_ciphers on;

Cache

Umożliwi to wymianę cache pomiędzy wszystkimi procesami workerów. Jeden megabajt cache przechowuje około 4000 sesji. Domyślny timeout to 5 minut, który możemy zmienić korzystając z dyrektywy ssl_session_timeout

ssl_session_cache   shared:SSL:10m;
ssl_session_timeout 10m;

OCSP Stapling

Po więcej informacji odsyłam tu i tu

ssl_trusted_certificate /etc/letsencrypt/live/naszadomena.pl/chain.pem;
ssl_stapling on;
ssl_stapling_verify on;

Nagłówki

Informuje on przeglądarkę, aby korzystała z HTTPS dla naszej domeny i wszystkich subdomen.

UWAGA, należy upewnić się, ze skonfigurowaliśmy poprawnie wszystkie używane subdomeny. Połączenia korzystały będą z HTTPS przez rok, więc jeśli popełnimy błąd nasze strony będą niedostępne.

add_header Strict-Transport-Security "max-age=31557600; includeSubDomains";

Diffie Hellman Groups

Tworzymy folder

mkdir /etc/nginx/ssl

Generujemy protokół Diffiego-Hellmana

openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096

Dodajemy linijkę do naszej konfiguracji

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

A+

Ostatecznie nasza konfiguracja powinna wyglądać tak

server {
 listen 80;
 server_name naszadomena.pl www.naszadomena.pl;
 return 301 https://naszadomena.pl$request_uri;
}

server {
 listen 443;
 server_name naszadomena.pl;
 root /var/www/shintest/public;
 index index.php;
 access_log /var/www/shintest/logs/access.log;
 error_log /var/www/shintest/logs/error.log;

 ssl on;
 ssl_certificate /etc/letsencrypt/live/naszastrona.pl/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/naszastrona.pl/privkey.pem;
 ssl_session_timeout 5m;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
 ssl_prefer_server_ciphers on;
 ssl_session_cache shared:SSL:10m;
 ssl_dhparam /etc/nginx/ssl/dhparam.pem;
 ssl_trusted_certificate /etc/letsencrypt/live/naszastrona.pl/chain.pem;
 ssl_stapling on;
 ssl_stapling_verify on;

 add_header Strict-Transport-Security "max-age=31557600; includeSubDomains";


location /.well-known/acme-challenge {
 root /var/www/letsencrypt;
}
location = /favicon.ico {
 log_not_found off;
 access_log off;
 }

location = /robots.txt {
 allow all;
 log_not_found off;
 access_log off;
 }

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

location ~ \.php$ {
 include fastcgi.conf;
 include fastcgi_params;
 fastcgi_pass unix:/var/run/php5-fpm.sock;
 fastcgi_intercept_errors on;
 fastcgi_index index.php;
 }
}

Oto wynik jaki teraz pokazuje Qualys SSL Labs

ssl_scan_3

Autoodnawianie

Korzystając z crona zaplanujemy automatyczne odnawianie certyfikatu

crontab -e

Wklejamy te linijki na samym końcu

30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/cert-renew.log
35 2 * * 1 /etc/init.d/nginx reload

 

ZOSTAW ODPOWIEDŹ

Please enter your comment!
Please enter your name here