Cum să securizați Nginx cu SSL și să criptăm în FreeBSD


În acest ghid, vom discuta despre cum să securizăm serverul web Nginx în FreeBSD cu certificate TLS/SSL oferite de Let's Encrypt Certificate Autoritatea. De asemenea, vă vom arăta cum să reînnoiți automat certificatele Lets’ Encrypt înainte de data de expirare.

TLS, acronim pentru Transport Layer Security, este un protocol care rulează sub protocolul HTTP și utilizează certificate și chei pentru a încapsula pachetele și criptați datele schimbate între un server și un client, sau în acest caz între serverul web Nginx și browserul clientului, pentru a securiza conexiunea, astfel încât o terță parte, care ar putea intercepta traficul, să nu poată decripta transmisia.

Citiți și: Instalați Let’s Encrypt for Apache pe FreeBSD

Procesul de obținere a unui certificat gratuit Let's Encrypt în FreeBSD poate fi foarte simplificat prin instalarea utilitarului client certboot, care este clientul oficial Let's Encrypt utilizat pentru generarea și descărcarea certificatelor.

Cerințe

  1. Instalați stiva FBEMP (Nginx, MariaDB și PHP) în FreeBSD

Pasul 1: Configurați Nginx TLS/SSL

1. În mod implicit, configurația serverului TLS/SSL nu este activată în FreeBSD deoarece instrucțiunile de blocare a serverului TLS sunt comentate în fișierul de configurare implicit Nginx.

Pentru a activa serverul TLS în Nginx, deschideți fișierul de configurare nginx.conf, căutați linia care definește începutul SSLserver și actualizați întregul bloc pentru a arăta ca în exemplul de mai jos.

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

Extras de bloc HTTPS Nginx:

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;
        }	
    }

Blocul de mai sus, pe lângă blocul SSL, conține și câteva instrucțiuni pentru activarea compresiei gzip și a FastCGI Process Manager, utilizate pentru a transmite codul PHP către PHP-FPM< gateway pentru a rula aplicații web dinamice.

După ce ați adăugat codul de mai sus la fișierul de configurare principal Nginx, nu reporniți demonul și nu aplicați setările înainte de a instala și de a obține un certificat Let’s Encrypt pentru domeniul dvs.

Pasul 2: Instalați Certbot Client în FreeBSD

2. Procesul de instalare a utilitarului client Let's Encrypt certbot în FreeBSD implică descărcarea codului sursă pentru py-certbot și compilarea locală a acestuia, prin emiterea comenzile de mai jos.

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

3. Compilarea utilitarului py-certbot necesită mult timp în comparație cu instalarea unui pachet binar obișnuit. În acest timp, este necesară descărcarea unei serii de dependențe compilate local în FreeBSD.

De asemenea, pe ecran va apărea o serie de solicitări, cerându-vă să selectați ce pachete vor fi folosite la compilare pentru fiecare dependență. La primul ecran, selectați următoarele instrumente, apăsând tasta [spațiu], pentru a compila dependența python27, așa cum este ilustrat în imaginea de mai jos.

  • IPV6
  • LIBFFI
  • NLS
  • PYMALLOC
  • IRE
  • UCS4 pentru suport Unicode

4. Apoi, selectați DOCS și THREADS pentru dependența de gettext-tools și apăsați pe OK > pentru a continua așa cum se arată în imaginea de mai jos.

5. Pe următorul ecran lăsați opțiunea TESTE dezactivată pentru libffi-3.2.1 și apăsați pe OK pentru a muta mai departe.

6. Apoi, apăsați pe spațiu pentru a selecta DOCS pentru dependența py27-enum34, care va instala documentația pentru acest lucru. instrument și apăsați pe OK pentru a continua, așa cum este ilustrat în captura de ecran de mai jos.

7. În cele din urmă, alegeți să instalați exemple de exemplu pentru dependența de py27-openssl apăsând tasta [spațiu] și apăsând OK > pentru a finaliza procesul de compilare și instalare pentru clientul py-certbot.

8. După ce se termină procesul de compilare și instalare a utilitarului py-certbot, rulați comanda de mai jos pentru a actualiza instrumentul la cea mai recentă versiune a pachetului, așa cum este ilustrat în mai jos capturile de ecran.

pkg install py27-certbot

9. Pentru a evita unele probleme, poate apărea în timpul obținerii unui certificat gratuit Let's Encrypt, cea mai frecventă eroare fiind „pkg_resources.DistributionNotFound ” , asigurați-vă că următoarele două dependențe sunt prezente și în sistemul dvs.: py27-salt și py27-acme.

pkg install py27-salt
pkg install py27-acme

Pasul 3: Instalați Let’s Encrypt Certificate pentru Nginx pe FreeBSD

10. Pentru a obține un certificat autonom Let's Encrypt pentru domeniul dvs., executați următoarea comandă și furnizați-vă numele de domeniu și toate subdomeniile pentru care doriți să obțineți certificate, implicând -d steag.

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

11. În timp ce generați certificatul, vi se va cere să introduceți adresa dvs. de e-mail și să fiți de acord cu termenii și condițiile Let’s Encrypt. Tastați a de la tastatură pentru a fi de acord și a continua și, de asemenea, veți fi întrebat dacă doriți să împărtășiți adresa dvs. de e-mail partenerilor Let’s Encrypt.

În cazul în care nu doriți să vă împărtășiți adresa de e-mail, trebuie doar să introduceți no cuvânt în solicitare și apăsați tasta [enter] pentru a continua. După ce certificatele pentru domeniul dumneavoastră au fost obținute cu succes, veți primi câteva note importante care vă vor informa unde sunt stocate certificatele în sistemul dumneavoastră și când expiră.

12. În cazul în care doriți să obțineți un certificat Let's Encrypt utilizând pluginul „webroot”, adăugând directorul webroot al serverului Nginx pentru domeniul dvs. , lansați următoarea comandă cu steaguri --webroot și -w. În mod implicit, dacă nu ați schimbat calea webroot-ului Nginx, aceasta ar trebui să fie localizată în calea sistemului /usr/local/www/nginx/.

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

Ca și în procedura --strandalone pentru obținerea unui certificat, procedura --webroot vă va cere să furnizați o adresă de e-mail pentru reînnoirea certificatului și notificări de securitate, pentru a apăsa pe a pentru a fi de acord cu termenii și condițiile Let's Encrypt și nu sau da pentru a partaja sau nu adresa de e-mail partenerilor Let's Encrypt, așa cum este ilustrat în exemplul de mai jos.

Rețineți că clientul certbot poate detecta o adresă de e-mail falsă și nu vă va lăsa să continuați cu generarea unui certificat până când nu furnizați o adresă de e-mail reală.

Eșantion Cerbot:
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

Pasul 4: Actualizați certificatele Nginx TLS

13. Locația certificatelor și cheilor Let’s Encrypt obținute în FreeBSD este calea de sistem /usr/local/etc/letsencrypt/live/www.yourdomain.com/. Emiteți comanda ls pentru a afișa componentele certificatului Let’s Encrypt: fișierul lanț, fișierul fullchain, cheia privată și fișierul certificat, așa cum este ilustrat în exemplul următor.

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

14. Pentru a instala certificatele Let's Encrypt pentru domeniul dvs. pe serverul web Nginx, deschideți fișierul de configurare principal Nginx sau fișierul de configurare pentru serverul Nginx TLS, în cazul în care este un fișier separat și modificați rândurile de mai jos pentru a reflecta calea certificatelor emise de Let's Encrypt, după cum este ilustrat mai jos.

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

Actualizați următoarele rânduri pentru a arăta ca în acest exemplu:

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. De asemenea, dacă linia ssl_dhparam este prezentă în configurația Nginx SSL, ar trebui să generați un nou 2048 biți Tasta Diffie–Hellman cu următoarea comandă:

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

16. În cele din urmă, pentru a activa configurația Nginx TLS, verificați mai întâi configurația globală Nginx pentru posibile erori de sintaxă și apoi reporniți serviciul Nginx pentru a aplica configurația SSL lansând următoarele comenzi.

nginx -t
service nginx restart

17. Confirmați dacă demonul Nginx se leagă pe portul 443 lansând următoarele comenzi care pot enumera toate soclulurile de rețea deschise din sistem în starea de ascultare.

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

18. De asemenea, puteți vizita adresa de domeniu prin protocolul HTTPS, deschizând un browser și tastați următoarea adresă pentru a confirma că certificatele Let’s Encrypt funcționează conform așteptărilor. Deoarece utilizați certificate generate de o autoritate de certificare validă, nu ar trebui să fie afișată nicio eroare în browser.

https://www.yourdomain.com

19. Utilitarul Openssl vă poate ajuta, de asemenea, să găsiți informații despre un certificat obținut de la Let’s Encrypt CA, rulând comanda cu următoarele opțiuni.

openssl s_client -connect www.yourdomain.com:443

În cazul în care doriți să forțați Nginx să direcționeze toate solicitările http to https primite pentru domeniul dvs. pe portul 80 către HTTPS, deschideți fișierul de configurare Nginx, localizați directiva de server pentru portul 80 și adăugați linia de mai jos după declarația server_name, așa cum este ilustrat în exemplul de mai jos.

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

20. Configurarea reînnoirii automate pentru certificatul emis de autoritatea Let’s Encrypt înainte de expirare se poate face prin programarea unei sarcini cron pentru a rula o dată pe zi, lansând următoarea comandă.

crontab -e

Sarcina Cron pentru reînnoirea certificatului.

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

Asta e tot! Nginx poate servi acum aplicații web securizate vizitatorilor dvs. folosind certificate gratuite Let’s Encrypt.