Wyszukiwanie w witrynie

Jak zabezpieczyć Nginx za pomocą protokołu SSL i szyfrowania w FreeBSD


W tym przewodniku omówimy, jak zabezpieczyć serwer WWW Nginx w FreeBSD za pomocą certyfikatów TLS/SSL oferowanych przez Let's Encrypt Certyfikat Autorytet. Pokażemy Ci również, jak automatycznie odnowić certyfikaty Lets’ Encrypt przed datą wygaśnięcia.

TLS, akronim od Transport Layer Security, to protokół działający w oparciu o protokół HTTP i wykorzystujący certyfikaty i klucze do hermetyzacji pakietów i szyfrować dane wymieniane pomiędzy serwerem a klientem, lub w tym przypadku pomiędzy serwerem WWW Nginx a przeglądarką klienta, w celu zabezpieczenia połączenia, tak aby osoba trzecia, która mogłaby przechwycić ruch, nie mogła odszyfrować transmisja.

Przeczytaj także: Zainstaluj Let’s Encrypt dla Apache na FreeBSD

Proces uzyskiwania bezpłatnego certyfikatu Let's Encrypt w FreeBSD można znacznie uprościć, instalując narzędzie klienckie certboot, które jest oficjalnym używanym klientem Let's Encrypt do generowania i pobierania certyfikatów.

Wymagania

  1. Zainstaluj stos FBEMP (Nginx, MariaDB i PHP) we FreeBSD

Krok 1: Skonfiguruj Nginx TLS/SSL

1. Domyślnie konfiguracja serwera TLS/SSL nie jest włączona w FreeBSD, ponieważ instrukcje blokowania serwera TLS są komentowane w domyślnym pliku konfiguracyjnym Nginx.

Aby aktywować serwer TLS w Nginx, otwórz plik konfiguracyjny nginx.conf, wyszukaj linię określającą początek SSL i zaktualizuj cały blok tak, aby wyglądał jak w poniższym przykładzie.

nano /usr/local/etc/nginx/nginx.conf

Fragment bloku Nginx HTTPS:

server {
       listen 443 ssl  default_server;
       server_name  www.yourdomain.com;
	
	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;
	error_page   500 502 503 504  /50x.html;
        
	location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
	
	location / {
	    root   /usr/local/www/nginx;
       	    index  index.html index.htm;
	    try_files $uri $uri/ /index.php?$args;
				}

	ssl_certificate "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
	ssl_certificate_key "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_dhparam /usr/local/etc/nginx/dhparam.pem;
	ssl_session_cache shared:SSL:1m;
	ssl_session_timeout 10m;
	ssl_ciphers HIGH:!aNULL:!MD5;
	ssl_prefer_server_ciphers  on;

	# Use gzip compression
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_buffers 16 8k;
gzip_http_version 1.0;

	# Set a variable to work around the lack of nested conditionals
	
	set $cache_uri $request_uri;
	
	location ~ /.well-known {
	allow all;
		}
    


        location ~ \.php$ {
        root	/usr/local/www/nginx;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        #fastcgi_param  SCRIPT_FILENAME /scripts$fastcgi_script_name;
        fastcgi_param SCRIPT_FILENAME $request_filename;    
		include        fastcgi_params;
        }	
    }

Powyższy blok, oprócz bloku SSL, zawiera także pewne instrukcje umożliwiające włączenie kompresji gzip oraz FastCGI Process Manager, używany do przekazywania kodu PHP do PHP-FPM< brama w celu uruchamiania dynamicznych aplikacji internetowych.

Po dodaniu powyższego kodu do głównego pliku konfiguracyjnego Nginx nie uruchamiaj ponownie demona ani nie stosuj ustawień przed instalacją i uzyskaniem certyfikatu Let's Encrypt dla swojej domeny.

Krok 2: Zainstaluj klienta Certbot we FreeBSD

2. Proces instalacji narzędzia klienckiego Let's Encrypt certbot we FreeBSD obejmuje pobranie kodu źródłowego py-certbot i lokalną kompilację go poprzez wydanie poniższe polecenia.

cd /usr/ports/security/py-certbot
make install clean

3. Kompilacja narzędzia py-certbot zajmuje dużo czasu w porównaniu z instalacją zwykłego pakietu binarnego. W tym czasie należy pobrać szereg zależności skompilowanych lokalnie we FreeBSD.

Ponadto na ekranie pojawi się seria monitów wymagających wybrania pakietów, które będą używane w czasie kompilacji dla każdej zależności. Na pierwszym ekranie wybierz następujące narzędzia, naciskając klawisz [spacja], aby skompilować zależność python27, jak pokazano na poniższym obrazku.

  • IPV6
  • LIBFFI
  • NLS
  • PYMALLOK
  • WĄTKI
  • UCS4 dla obsługi Unicode

4. Następnie wybierz DOCS i THREADS dla zależności gettext-tools i naciśnij OK aby kontynuować, jak pokazano na poniższym obrazku.

5. Na następnym ekranie pozostaw opcję TESTY wyłączoną dla libffi-3.2.1 i naciśnij OK, aby przejść dalej.

6. Następnie naciśnij spację, aby wybrać DOCS dla zależności py27-enum34, która zainstaluje dokumentację dla tego narzędzie i naciśnij OK, aby kontynuować, jak pokazano na poniższym zrzucie ekranu.

7. Na koniec wybierz instalację przykładowych próbek dla zależności py27-openssl, naciskając klawisz [spacja] i naciśnij OK aby zakończyć proces kompilacji i instalacji klienta py-certbot.

8. Po zakończeniu procesu kompilacji i instalacji narzędzia py-certbot uruchom poniższe polecenie, aby zaktualizować narzędzie do najnowszej wersji pakietu, jak pokazano w poniżej zrzuty ekranu.

pkg install py27-certbot

9. Aby uniknąć pewnych problemów, może się to zdarzyć podczas uzyskiwania bezpłatnego certyfikatu Let's Encrypt. Najczęstszym błędem jest „pkg_resources.DistributionNotFound” , upewnij się, że w Twoim systemie występują także dwie zależności: py27-salt i py27-acme.

pkg install py27-salt
pkg install py27-acme

Krok 3: Zainstaluj certyfikat Let’s Encrypt dla Nginx na FreeBSD

10. Aby uzyskać samodzielny certyfikat Let's Encrypt dla swojej domeny, uruchom następujące polecenie i podaj nazwę domeny oraz wszystkie subdomeny, dla których chcesz uzyskać certyfikaty, sugerując -d flaga.

certbot certonly --standalone -d yourdomain.com -d www.yourdomain.com

11. Podczas generowania certyfikatu zostaniesz poproszony o podanie adresu e-mail i akceptację warunków korzystania z usługi Let's Encrypt. Wpisz a na klawiaturze, aby wyrazić zgodę i kontynuować. Zostaniesz także zapytany, czy chcesz udostępnić swój adres e-mail partnerom Let’s Encrypt.

Jeśli nie chcesz udostępniać swojego adresu e-mail, po prostu wpisz słowo no w wierszu poleceń i naciśnij klawisz [enter], aby kontynuować. Po pomyślnym uzyskaniu certyfikatów dla Twojej domeny otrzymasz kilka ważnych informacji, które poinformują Cię, gdzie certyfikaty są przechowywane w Twoim systemie i kiedy wygasają.

12. Jeśli chcesz uzyskać certyfikat Let's Encrypt za pomocą wtyczki „webroot” poprzez dodanie katalogu webroot serwera Nginx dla swojej domeny , wydaj następujące polecenie z flagami --webroot i -w. Domyślnie, jeśli nie zmieniłeś ścieżki webroot Nginx, powinna ona znajdować się w ścieżce systemowej /usr/local/www/nginx/.

certbot certonly --webroot -w /usr/local/www/nginx/ -d yourdomain.com -d www.yourdomain.com

Podobnie jak w procedurze --strandalone uzyskiwania certyfikatu, procedura --webroot również poprosi Cię o podanie adresu e-mail w celu odnowienia certyfikatu i powiadomienia o bezpieczeństwie, a następnie o naciśnięcie klawisza a, aby wyrazić zgodę na warunki Let's Encrypt i nie lub tak, aby lub nie udostępniać adresów e-mail partnerom Let's Encrypt, jak pokazano w poniższym przykładzie.

Pamiętaj, że klient certbot może wykryć fałszywy adres e-mail i nie pozwoli Ci kontynuować generowania certyfikatu, dopóki nie podasz prawdziwego adresu e-mail.

Próbka Cerbota:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):[email   #A fake email address will be detected
There seem to be problems with that address. Enter email address (used for
urgent renewal and security notices)  If you really want to skip this, you can
run the client with --register-unsafely-without-email but make sure you then
backup your account key from /etc/letsencrypt/accounts   (Enter 'c' to cancel):[email 

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a ------------------------------------------------------------------------------- Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about EFF and our work to encrypt the web, protect its users and defend digital rights. ------------------------------------------------------------------------------- (Y)es/(N)o: n Obtaining a new certificate Performing the following challenges: http-01 challenge for www.domain.com Using the webroot path /usr/local/www/nginx/ for all unmatched domains. Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /usr/local/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem. Your cert will expire on 2017-12-28. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /usr/local/etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

Krok 4: Zaktualizuj certyfikaty Nginx TLS

13. Lokalizacja uzyskanych certyfikatów i kluczy Let’s Encrypt we FreeBSD to ścieżka systemowa /usr/local/etc/letsencrypt/live/www.yourdomain.com/. Wydaj polecenie ls, aby wyświetlić składniki certyfikatu Let’s Encrypt: plik łańcucha, plik pełnego łańcucha, klucz prywatny i plik certyfikatu, jak pokazano w poniższym przykładzie.

ls /usr/local/etc/letsencrypt/live/www.yourdomain.com/

14. Aby zainstalować certyfikaty Let's Encrypt dla Twojej domeny na serwerze internetowym Nginx, otwórz główny plik konfiguracyjny Nginx lub plik konfiguracyjny serwera Nginx TLS, jeśli jest to oddzielny plik, i zmodyfikuj poniższe linie aby odzwierciedlić ścieżkę wystawionych certyfikatów Let's Encrypt, jak pokazano poniżej.

nano /usr/local/etc/nginx/nginx.conf

Zaktualizuj następujące wiersze, aby wyglądały tak, jak w tym przykładzie:

ssl_certificate "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
	ssl_certificate_key "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";

15. Ponadto, jeśli linia ssl_dhparam jest obecna w konfiguracji Nginx SSL, powinieneś wygenerować nowy bit 2048 klawisz Diffie–Hellman za pomocą następującego polecenia:

openssl dhparam –out /usr/local/etc/nginx/dhparam.pem 2048 

16. Na koniec, aby aktywować konfigurację Nginx TLS, najpierw sprawdź globalną konfigurację Nginx pod kątem możliwych błędów składniowych, a następnie zrestartuj usługę Nginx, aby zastosować konfigurację SSL, wydając poniższe polecenia.

nginx -t
service nginx restart

17. Sprawdź, czy demon Nginx jest powiązany z portem 443, wydając następujące polecenia, które mogą wyświetlić listę wszystkich otwartych gniazd sieciowych w systemie w stanie nasłuchiwania.

netstat -an -p tcp| grep LISTEN
sockstat -4 

18. Możesz także odwiedzić adres swojej domeny za pośrednictwem protokołu HTTPS, otwierając przeglądarkę i wpisując następujący adres, aby potwierdzić, że certyfikaty Let's Encrypt działają zgodnie z oczekiwaniami. Ponieważ używasz certyfikatów wygenerowanych przez ważny urząd certyfikacji, przeglądarka nie powinna wyświetlać żadnych błędów.

https://www.yourdomain.com

19. Narzędzie Openssl może również pomóc w znalezieniu informacji o certyfikacie uzyskanym od Let's Encrypt CA, uruchamiając polecenie z następującymi opcjami.

openssl s_client -connect www.yourdomain.com:443

Jeśli chcesz zmusić Nginx do kierowania wszystkich żądań http na https otrzymanych dla Twojej domeny na porcie 80 do HTTPS, otwórz plik konfiguracyjny Nginx, znajdź dyrektywę serwera dla portu 80 i dodaj poniższą linię po instrukcji nazwa_serwera, jak pokazano w poniższym przykładzie.

rewrite ^(.*) https://www.yourdomain.com$1 permanent;

20. Konfigurowanie automatycznego odnawiania certyfikatów wydanych przez urząd Let's Encrypt przed ich wygaśnięciem można wykonać, planując uruchamianie zadania cron raz dziennie, wydając następujące polecenie.

crontab -e

Zadanie Cron polegające na odnowieniu certyfikatu.

0 0 * * * certbot renew >> /var/log/letsencrypt.log

To wszystko! Nginx może teraz udostępniać odwiedzającym zabezpieczone aplikacje internetowe, korzystając z bezpłatnych certyfikatów Let’s Encrypt.