Kako zavarovati Nginx s SSL in šifrirajmo v FreeBSD


V tem priročniku bomo razpravljali o tem, kako zaščititi spletni strežnik Nginx v FreeBSD s potrdili TLS/SSL, ki jih ponuja Let’s Encrypt Certificate Authority. Pokazali vam bomo tudi, kako samodejno obnoviti potrdila Lets ’Encrypt pred datumom izteka.

TLS, kratica za Transport Layer Security, je protokol, ki deluje pod protokolom HTTP in uporablja potrdila in ključe, da vključi pakete in šifrira podatke, ki jih izmenjujejo strežnik in odjemalec, ali v tem primeru med spletnim strežnikom Nginx in odjemalčevim brskalnik, da zaščiti povezavo, tako da tretja oseba, ki bi lahko prestregla promet, ne more dešifrirati prenosa.

Postopek pridobitve brezplačnega potrdila Let’s Encrypt v FreeBSD lahko močno poenostavite z namestitvijo odjemalca certboot, ki je uradni odjemalec Let’s Encrypt, ki se uporablja za ustvarjanje in nalaganje potrdil.

  1. Namestite sklad FBEMP (Nginx, MariaDB in PHP) v FreeBSD

1. korak: Konfigurirajte Nginx TLS/SSL

1. Konfiguracija strežnika TLS/SSL privzeto ni omogočena v FreeBSD, ker so stavki bloka strežnika TLS komentirani v privzeti konfiguracijski datoteki Nginx.

Če želite aktivirati strežnik TLS v Nginxu, odprite konfiguracijsko datoteko nginx.conf, poiščite vrstico, ki definira začetek strežnika SSL, in posodobite celoten blok tako, kot je videti v spodnjem vzorcu.

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

Izvleček bloka 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;
        }	
    }

Zgornji blok poleg bloka SSL vsebuje tudi nekaj izjav za omogočanje stiskanja gzip in FastCGI Process Manager, ki se uporablja za posredovanje kode PHP prehodu PHP-FPM za zagon dinamičnih spletnih aplikacij.

Ko v zgornjo konfiguracijsko datoteko Nginxa dodate zgornjo kodo, pred namestitvijo in pridobivanjem potrdila Let’s Encrypt za svojo domeno ne zaženite znova demona ali uporabite nastavitev.

2. korak: Namestite odjemalca Certbot v FreeBSD

2. Postopek namestitve odjemalskega pripomočka Let’s Encrypt certbot v FreeBSD vključuje prenos izvorne kode za py-certbot in njeno lokalno prevajanje z izdajo spodnjih ukazov.

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

3. Sestavljanje pripomočka py-certbot traja veliko časa v primerjavi z namestitvijo običajnega binarnega paketa. V tem času je treba prenesti vrsto odvisnosti v lokalno prevedeno v FreeBSD.

Na zaslonu se bo pojavila tudi vrsta pozivov, ki od vas zahtevajo, da za vsako odvisnost izberete, kateri paketi bodo uporabljeni med prevajanjem. Na prvem zaslonu izberite naslednja orodja s pritiskom na tipko [presledek] za sestavljanje odvisnosti python27, kot je prikazano na spodnji sliki.

  • IPV6
  • LIBFFI
  • NLS
  • PYMALLOC
  • NITI
  • UCS4 za podporo Unicode

4. Nato izberite DOCS in THREADS za odvisnost orodja gettext in pritisnite OK, da nadaljujete, kot je prikazano na spodnji sliki.

5. Na naslednjem zaslonu pustite možnost TESTS onemogočena za libffi-3.2.1 in pritisnite OK, da se premaknete naprej.

6. Nato pritisnite presledek, da izberete DOCS za odvisnost py27-enum34, ki bo namestil dokumentacijo za to orodje, in pritisnite OK za nadaljevanje, kot je prikazano na spodnjem posnetku zaslona.

7. Na koncu izberite namestitev vzorčnih vzorcev odvisnosti py27-openssl s pritiskom na tipko [presledek] in pritisnite OK, da končate postopek prevajanja in namestitve za odjemalca py-certbot.

8. Ko se postopek zbiranja in namestitve pripomočka py-certbot konča, zaženite spodnji ukaz, da nadgradite orodje na najnovejšo različico paketa, kot je prikazano na spodnjih posnetkih zaslona.

# pkg install py27-certbot

9. Da bi se izognili nekaterim težavam, ki bi se lahko pojavile med pridobivanjem brezplačnega potrdila Let's Encrypt, najpogostejša napaka je\"pkg_resources.DistributionNotFound", poskrbite, da sta v sistemu prisotni tudi naslednji dve odvisnosti: py27-salt in py27- acme.

# pkg install py27-salt
# pkg install py27-acme

3. korak: Namestite šifrirajmo potrdilo za Nginx na FreeBSD

10. Če želite pridobiti samostojno potrdilo Let’s Encrypt za svojo domeno, zaženite naslednji ukaz in navedite ime domene in vse poddomene, za katere želite pridobiti potrdila, tako da navedete zastavico -d .

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

11. Med generiranjem potrdila boste morali vnesti svoj e-poštni naslov in se strinjati s pogoji storitve Let’s Encrypt. Vnesite a s tipkovnice, da se strinjate in nadaljujete. Vprašali vas bomo tudi, ali želite svoj e -poštni naslov deliti s partnerji Let's Encrypt.

Če ne želite deliti svojega e-poštnega naslova, v poziv preprosto vnesite no besedo in za nadaljevanje pritisnite tipko [enter]. Ko bodo certifikati za vašo domeno uspešno pridobljeni, boste prejeli nekaj pomembnih opomb, ki vas bodo obvestile, kje so potrdila shranjena v vašem sistemu in kdaj potečejo.

12. Če želite pridobiti potrdilo Let's Encrypt z uporabo vtičnika “webroot”, tako da dodate imenik webroot strežnika Nginx za svojo domeno, izdajte naslednji ukaz z --webroot in -w zastavice. Če poti spletnega korena Nginx niste spremenili, mora biti privzeto locirana v/usr/local/www/nginx/system path.

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

Tako kot v postopku --strandalone za pridobitev certifikata bo tudi postopek --webroot zahteval, da vnesete e-poštni naslov za podaljšanje potrdila in varnostna obvestila, da pritisnete a , da se strinjate s pogoji in določili Let's Encrypt in ne ali yes , da delite ali ne e-poštni naslov Let's Encrypt partners, kot je prikazano v spodnjem vzorcu

Zavedajte se, da lahko odjemalec certbot zazna ponarejen e-poštni naslov in vam ne bo dovolil, da nadaljujete z ustvarjanjem potrdila, dokler ne navedete pravega e-poštnega naslova.

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

4. korak: Posodobite potrdila Nginx TLS

13. Lokacija pridobljenih potrdil in ključev Let's Encrypt v FreeBSD je /usr/local/etc/letsencrypt/live/www.yourdomain.com/ sistemska pot. Izdajte ukaz ls, da prikažete komponente potrdila Let’s Encrypt: datoteko verige, datoteko celotne verige, zasebni ključ in datoteko potrdila, kot je prikazano v naslednjem primeru.

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

14. Če želite namestiti certifikate Let's Encrypt za vašo domeno v spletni strežnik Nginx, odprite glavno konfiguracijsko datoteko Nginx ali konfiguracijsko datoteko za strežnik Nginx TLS, če gre za ločeno datoteko, in spremenite spodnje vrstice, da odražajo pot Let's Encrypt izdala potrdila, kot je prikazano spodaj.

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

Posodobite naslednje vrstice, da bodo videti v tem vzorcu:

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. Če je vrstica ssl_dhparam prisotna v konfiguraciji Nginx SSL, ustvarite nov 2048-bitni Diffie – Hellmanov ključ z naslednjim ukazom:

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

16. Na koncu, da aktivirate konfiguracijo Nginx TLS, najprej preverite globalno konfiguracijo Nginx za morebitne sintaksne napake in nato znova zaženite storitev Nginx, da uporabi konfiguracijo SSL, tako da izdate naslednje ukaze.

# nginx -t
# service nginx restart

17. Potrdite, ali je demon Nginx zavezujoč za vrata 443, tako da izdate naslednje ukaze, ki lahko navedejo vse odprte omrežne vtičnice v sistemu v stanju poslušanja.

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

18. Naslov svoje domene lahko obiščete tudi prek protokola HTTPS, tako da odprete brskalnik in vnesete naslednji naslov, da potrdite, da potrdila Let’s Encrypt delujejo po pričakovanjih. Ker uporabljate potrdila, ki jih je ustvaril veljaven overitelj, v brskalniku ne sme biti prikazana nobena napaka.

https://www.yourdomain.com

19. Pripomoček Openssl vam lahko pomaga tudi pri iskanju informacij o certifikatu, pridobljenem iz Let’s Encrypt CA, tako da zaženete ukaz z naslednjimi možnostmi.

# openssl s_client -connect www.yourdomain.com:443

Če želite prisiliti Nginx, da vse zahteve http do https, prejete za vašo domeno, preusmeri na vrata 80 na HTTPS, odprite konfiguracijsko datoteko Nginx, poiščite strežniško direktivo za vrata 80 in dodajte spodnjo vrstico po stavku ime -strežnika, kot je prikazano v spodnjem primeru .

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

20. Nastavitev samodejnega podaljšanja za potrdilo, ki ga izda organ Let’s Encrypt, preden poteče, je mogoče izvesti tako, da se opravilo cron zažene enkrat na dan z izdajo naslednjega ukaza.

# crontab -e

Naloga Cron za podaljšanje potrdila.

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

To je vse! Nginx lahko obiskovalcem zdaj servira zaščitene spletne aplikacije z brezplačnimi certifikati Let's Encrypt