Ricerca nel sito web

Come proteggere Nginx con SSL e crittografare in FreeBSD


In questa guida discuteremo come proteggere il server web Nginx in FreeBSD con i certificati TLS/SSL offerti da Let's Encrypt Certificate Autorità. Ti mostreremo anche come rinnovare automaticamente i certificati Lets' Encrypt prima della data di scadenza.

TLS, acronimo di Transport Layer Security, è un protocollo che funziona sotto il protocollo HTTP e utilizza certificati e chiavi per incapsulare i pacchetti e crittografare i dati scambiati tra un server e un client, o in questo caso tra il server web Nginx e il browser del client, al fine di proteggere la connessione, in modo che una terza parte, che potrebbe intercettare il traffico, non possa decrittografare la trasmissione.

Leggi anche: Installa Let's Encrypt per Apache su FreeBSD

Il processo per ottenere un certificato Let's Encrypt gratuito in FreeBSD può essere notevolmente semplificato installando l'utilità client certboot, che è il client ufficiale Let's Encrypt utilizzato per generare e scaricare certificati.

Requisiti

  1. Installa lo stack FBEMP (Nginx, MariaDB e PHP) in FreeBSD

Passaggio 1: configura Nginx TLS/SSL

1. Per impostazione predefinita, la configurazione del server TLS/SSL non è abilitata in FreeBSD perché il server TLS blocca le istruzioni sono commentati nel file di configurazione predefinito di Nginx.

Per attivare il server TLS in Nginx, aprire il file di configurazione nginx.conf, cercare la riga che definisce l'inizio di SSL server e aggiorna l'intero blocco in modo che assomigli all'esempio seguente.

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

Estratto del blocco 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;
        }	
    }

Il blocco precedente, oltre al blocco SSL, contiene anche alcune istruzioni per abilitare la compressione gzip e FastCGI Process Manager, utilizzato per passare il codice PHP a PHP-FPM< gateway per eseguire applicazioni web dinamiche.

Dopo aver aggiunto il codice precedente al file di configurazione principale di Nginx, non riavviare il demone né applicare le impostazioni prima di installare e ottenere un certificato Let's Encrypt per il tuo dominio.

Passaggio 2: installa il client Certbot in FreeBSD

2. Il processo di installazione dell'utilità client certbot di Let's Encrypt in FreeBSD prevede il download del codice sorgente per py-certbot e la compilazione locale, emettendo i comandi seguenti.

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

3. La compilazione dell'utilità py-certbot richiede molto tempo rispetto all'installazione di un normale pacchetto binario. Durante questo periodo, è necessario scaricare una serie di dipendenze compilate localmente in FreeBSD.

Inoltre, sullo schermo verranno visualizzate una serie di richieste che richiedono di selezionare quali pacchetti verranno utilizzati in fase di compilazione per ciascuna dipendenza. Nella prima schermata, seleziona i seguenti strumenti, premendo il tasto [spazio], per compilare la dipendenza python27, come illustrato nell'immagine seguente.

  • IPV6
  • LIBFFI
  • NLS
  • PIMALLOC
  • FILETTI
  • UCS4 per il supporto Unicode

4. Successivamente, seleziona DOCS e THREADS per la dipendenza gettext-tools e premi OK per continuare come mostrato nell'immagine qui sotto.

5. Nella schermata successiva lascia l'opzione TEST disabilitata per libffi-3.2.1 e premi OK per spostarti ulteriore.

6. Successivamente, premi lo spazio per selezionare DOCS per la dipendenza py27-enum34, che installerà la documentazione per questo strumento e premi OK per continuare, come illustrato nello screenshot seguente.

7. Infine, scegli di installare esempi di esempio per la dipendenza py27-openssl premendo il tasto [spazio] e premi OK per completare il processo di compilazione e installazione per il client py-certbot.

8. Al termine del processo di compilazione e installazione dell'utilità py-certbot, eseguire il comando seguente per aggiornare lo strumento all'ultima versione del pacchetto come illustrato nella sotto gli screenshot.

pkg install py27-certbot

9. Per evitare alcuni problemi che potrebbero verificarsi durante l'ottenimento di un certificato Let's Encrypt gratuito, l'errore più comune è "pkg_resources.DistributionNotFound" , assicurati che nel tuo sistema siano presenti anche le seguenti due dipendenze: py27-salt e py27-acme.

pkg install py27-salt
pkg install py27-acme

Passaggio 3: installa Let's Encrypt Certificate per Nginx su FreeBSD

10. Per ottenere un certificato autonomo Let's Encrypt per il tuo dominio, esegui il seguente comando e fornisci il nome di dominio e tutti i sottodomini per i quali desideri ottenere i certificati implicando -d bandiera.

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

11. Durante la generazione del certificato ti verrà chiesto di inserire il tuo indirizzo email e di accettare i termini di servizio di Let's Encrypt. Digita a dalla tastiera per accettare e continuare e ti verrà anche chiesto se desideri condividere il tuo indirizzo email con i partner Let's Encrypt.

Nel caso in cui non desideri condividere il tuo indirizzo email, digita semplicemente no parola nel prompt e premi il tasto [invio] per continuare. Dopo che i certificati per il tuo dominio saranno stati ottenuti con successo, riceverai alcune note importanti che ti informeranno dove sono archiviati i certificati nel tuo sistema e quando scadono.

12. Nel caso in cui desideri ottenere un certificato Let's Encrypt utilizzando il plugin “webroot” aggiungendo la directory webroot del server Nginx per il tuo dominio , immetti il seguente comando con i flag --webroot e -w. Per impostazione predefinita, se non hai modificato il percorso webroot di Nginx, dovrebbe trovarsi nel percorso di sistema /usr/local/www/nginx/.

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

Come nella procedura --strandalone per l'ottenimento di un certificato, anche la procedura --webroot ti chiederà di fornire un indirizzo email per il rinnovo del certificato e le notifiche di sicurezza, di premere a per accettare i termini e le condizioni di Let's Encrypt e no o per condividere o meno l'indirizzo email dei partner Let's Encrypt come illustrato nell'esempio seguente.

Tieni presente che il client certbot può rilevare un indirizzo email falso e non ti consentirà di continuare con la generazione di un certificato finché non fornirai un indirizzo email reale.

Campione 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

Passaggio 4: aggiorna i certificati Nginx TLS

13. La posizione dei certificati e delle chiavi Let's Encrypt ottenuti in FreeBSD è /usr/local/etc/letsencrypt/live/www.yourdomain.com/ percorso di sistema. Emetti il comando ls per visualizzare i componenti del tuo certificato Let's Encrypt: il file chain, il file fullchain, la chiave privata e il file del certificato, come illustrato nell'esempio seguente.

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

14. Per installare i certificati Let's Encrypt per il tuo dominio nel server web Nginx, apri il file di configurazione principale di Nginx o il file di configurazione per il server TLS Nginx, nel caso sia un file separato, e modifica le righe seguenti per riflettere il percorso dei certificati emessi da Let's Encrypt come illustrato di seguito.

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

Aggiorna le seguenti righe in modo che appaiano in questo esempio:

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. Inoltre, se la riga ssl_dhparam è presente nella configurazione Nginx SSL, dovresti generare un nuovo 2048 bit Tasto Diffie–Hellman con il seguente comando:

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

16. Infine, per attivare la configurazione Nginx TLS, controlla prima la configurazione globale di Nginx per possibili errori di sintassi e, quindi, riavvia il servizio Nginx per applicare la configurazione SSL emettendo i seguenti comandi.

nginx -t
service nginx restart

17. Conferma se il demone Nginx è vincolante sulla porta 443 emettendo i seguenti comandi che possono elencare tutti i socket di rete aperti nel sistema in stato di ascolto.

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

18. Puoi anche visitare il tuo indirizzo di dominio tramite il protocollo HTTPS aprendo un browser e digitando il seguente indirizzo per confermare che i certificati Let's Encrypt funzionano come previsto. Poiché stai utilizzando certificati generati da un'autorità di certificazione valida, nel browser non dovrebbe essere visualizzato alcun errore.

https://www.yourdomain.com

19. L'utilità Openssl può anche aiutarti a trovare informazioni su un certificato ottenuto da Let's Encrypt CA, eseguendo il comando con le seguenti opzioni.

openssl s_client -connect www.yourdomain.com:443

Nel caso in cui desideri forzare Nginx a indirizzare tutte le richieste da http a https ricevute per il tuo dominio sulla porta 80 a HTTPS, apri il file di configurazione di Nginx, individua la direttiva del server per la porta 80 e aggiungi la riga seguente dopo l'istruzione server_name come illustrato nell'esempio seguente.

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

20. È possibile impostare il rinnovo automatico per i certificati emessi dall'autorità Let's Encrypt prima della loro scadenza pianificando l'esecuzione di un processo cron una volta al giorno emettendo il seguente comando.

crontab -e

Attività Cron per rinnovare il certificato.

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

È tutto! Nginx ora può fornire applicazioni web protette ai tuoi visitatori utilizzando i certificati gratuiti Let's Encrypt.