Come Proteggere Nginx con Let’s Encrypt su Rocky Linux 9

Introduzione

Let’s Encrypt è un’autorità di certificazione (CA) che fornisce un modo accessibile per ottenere e installare gratuitamente i certificati TLS/SSL, consentendo così l’HTTPS criptato sui server web. Semplifica il processo fornendo un client software, Certbot, che cerca di automatizzare la maggior parte (se non tutte) le fasi richieste. Attualmente, l’intero processo di ottenere e installare un certificato è completamente automatizzato su entrambi Apache e Nginx.

In questo tutorial, utilizzerai Certbot per ottenere un certificato SSL gratuito per Nginx su Rocky Linux 9 e configurare il tuo certificato per il rinnovo automatico.

Questo tutorial utilizzerà un file di configurazione separato per il server Nginx invece del file predefinito. Dovresti creare nuovi file di blocco del server Nginx per ogni dominio poiché ciò aiuta a evitare errori comuni e mantiene i file predefiniti come configurazione di fallback.

Prerequisiti

Per seguire questo tutorial, avrai bisogno di:

  • Un server Rocky Linux 9 configurato seguendo questo setup iniziale del server per Rocky Linux 9 tutorial, inclusi un utente non root abilitato a sudo e un firewall.

  • Un nome di dominio registrato. Questo tutorial utilizzerà example.com in tutto. Puoi acquistare un nome di dominio da Namecheap, ottenerne uno gratuitamente con Freenom, o utilizzare il registrar di dominio di tua scelta.

  • Entrambi i seguenti record DNS configurati per il tuo server. Se stai utilizzando DigitalOcean, consulta la nostra documentazione DNS per i dettagli su come aggiungerli.

    • Un record A con example.com che punta all’indirizzo IP pubblico del tuo server.
    • Un record A con www.example.com che punta all’indirizzo IP pubblico del tuo server.
  • Nginx installato seguendo Come Installare Nginx su Rocky Linux 9. Assicurati di avere un blocco del server per il tuo dominio. Questo tutorial utilizzerà /etc/nginx/sites-available/example.com come esempio.

Passo 1 — Installare Certbot

Innanzitutto, è necessario installare il pacchetto software certbot. Accedi alla tua macchina Rocky Linux 8 come utente non root:

  1. ssh sammy@your_server_ip

Il pacchetto certbot non è disponibile tramite il gestore di pacchetti di default. Dovrai abilitare il repository EPEL per installare Certbot.

Per aggiungere il repository EPEL di Rocky Linux 9, esegui il seguente comando:

  1. sudo dnf install epel-release

Quando ti viene chiesto di confermare l’installazione, digita e premi y.

Ora che hai accesso al repository extra, installa tutti i pacchetti richiesti:

  1. sudo dnf install certbot python3-certbot-nginx

Questo installerà Certbot stesso e il plugin Nginx per Certbot, che è necessario per eseguire il programma.

Il processo di installazione ti chiederà di importare una chiave GPG. Conferma così l’installazione può completarsi.

Ora che hai Certbot installato, eseguiamolo per ottenere un certificato.

Passaggio 2 — Conferma della configurazione di Nginx

Certbot ha bisogno di poter trovare il blocco server corretto nella tua configurazione Nginx per poter configurare automaticamente SSL. Nello specifico, lo fa cercando una direttiva server_name che corrisponda al dominio per il quale richiedi un certificato.

Se hai seguito il passaggio di configurazione del blocco server nel tutorial di installazione di Nginx, dovresti avere un blocco server per il tuo dominio in /etc/nginx/conf.d/esempio.com con la direttiva server_name già impostata correttamente.

Per verificare, apri il file di configurazione per il tuo dominio utilizzando nano o il tuo editor di testo preferito:

  1. sudo nano /etc/nginx/conf.d/example.com

Trova la linea server_name esistente. Dovrebbe apparire così:

/etc/nginx/conf.d/example.com
...
server_name example.com www.example.com;
...

Se lo fa, esci dal tuo editor e passa al passaggio successivo.

Se non lo fa, aggiornalo in modo che corrisponda. Quindi salva il file, esci dal tuo editor e verifica la sintassi delle tue modifiche alla configurazione:

  1. sudo nginx -t

Se si verifica un errore, riaprire il file del blocco del server e verificare la presenza di eventuali errori di battitura o caratteri mancanti. Una volta che la sintassi del file di configurazione è corretta, ricaricare Nginx per caricare la nuova configurazione:

  1. sudo systemctl reload nginx

Certbot può ora individuare il blocco server corretto e aggiornarlo automaticamente.

Successivamente, aggiorniamo il firewall per consentire il traffico HTTPS.

Fase 3 — Aggiornamento delle Regole del Firewall

Dato che la tua configurazione predefinita abilita firewalld, sarà necessario regolare le impostazioni del firewall per consentire connessioni esterne al tuo server web Nginx.

Per verificare quali servizi sono già abilitati, eseguire il comando:

  1. sudo firewall-cmd --permanent --list-all

Si riceverà un output simile a questo:

Output
public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

Se non si vede http nell’elenco dei servizi, abilitarlo con il comando:

  1. sudo firewall-cmd --permanent --add-service=http

Per consentire il traffico https, eseguire il seguente comando:

  1. sudo firewall-cmd --permanent --add-service=https

Per applicare le modifiche, sarà necessario ricaricare il servizio firewall:

  1. sudo firewall-cmd --reload

Ora che hai aperto il tuo server al traffico https, sei pronto per eseguire Certbot e ottenere i tuoi certificati.

Fase 4 — Ottenere un Certificato SSL

Certbot fornisce una varietà di modi per ottenere certificati SSL attraverso i plugin. Il plugin Nginx si occuperà di riconfigurare Nginx e ricaricare la configurazione quando necessario. Per utilizzare questo plugin, digita quanto segue:

  1. sudo certbot --nginx -d example.com -d www.example.com

Questo eseguirà il comando certbot con il plugin --nginx, utilizzando -d per specificare i nomi di dominio per i quali è necessario che il certificato sia valido.

Durante l’esecuzione del comando, ti verrà chiesto di inserire un indirizzo email e accettare i termini di servizio. Dopo averlo fatto, dovresti vedere un messaggio che ti informa che il processo è stato completato con successo e dove sono archiviati i tuoi certificati:

Output
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-12-15. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain

I tuoi certificati sono scaricati, installati e caricati, e la configurazione di Nginx ora reindirizzerà automaticamente tutte le richieste web a https://. Prova a ricaricare il tuo sito e osserva l’indicatore di sicurezza del tuo browser. Dovrebbe indicare che il sito è correttamente protetto, di solito con un’icona a lucchetto. Se testi il tuo server usando il SSL Labs Server Test, otterrai un voto A.

Concludiamo testando il processo di rinnovo.

Passo 5 — Verifica del Rinnovo Automatico di Certbot

I certificati Let’s Encrypt sono validi per 90 giorni, ma è consigliabile rinnovarli ogni 60 giorni per consentire un margine di errore. Il client Let’s Encrypt di Certbot ha un comando rinnova che controlla automaticamente i certificati attualmente installati e cerca di rinnovarli se mancano meno di 30 giorni dalla data di scadenza.

Puoi testare il rinnovo automatico per i tuoi certificati eseguendo questo comando:

  1. sudo certbot renew --dry-run

Il risultato sarà simile a questo:

Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/your_domain.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator nginx, Installer nginx Renewing an existing certificate Performing the following challenges: http-01 challenge for monitoring.pp.ua Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of nginx server; fullchain is /etc/letsencrypt/live/your_domain/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/your_domain/fullchain.pem (success) ...

Nota che se hai creato un certificato raggruppato con più domini, nell’output verrà mostrato solo il nome di dominio di base, ma il rinnovo funzionerà per tutti i domini inclusi in questo certificato.

A practical way to ensure your certificates will not get outdated is to create a cron job that will periodically execute the automatic renewal command for you. Since the renewal first checks for the expiration date and only executes the renewal if the certificate is less than 30 days away from expiration, it is safe to create a cron job that runs every week, or even every day.

Modifica il crontab per creare un nuovo lavoro che eseguirà il rinnovo due volte al giorno. Per modificare il crontab per l’utente root, esegui:

  1. sudo crontab -e

Il tuo editor di testo aprirà il crontab predefinito, che è un file di testo vuoto in questo momento. Entra in modalità di inserimento premendo i e aggiungi la seguente riga:

crontab
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet

Quando hai finito, premi ESC per uscire dalla modalità di inserimento, poi :wq e INVIO per salvare ed uscire dal file. Per saperne di più sull’editor di testo Vi e sul suo successore Vim, dai un’occhiata al nostro tutorial Installazione e Uso dell’Editor di Testo Vim su un Server Cloud.

Questo creerà un nuovo lavoro cron che verrà eseguito a mezzogiorno e a mezzanotte ogni giorno. python -c 'import random; import time; time.sleep(random.random() * 3600)' selezionerà un minuto casuale nell’ora per i tuoi compiti di rinnovo.

Il comando renew per Certbot controllerà tutti i certificati installati nel sistema e aggiornerà quelli che devono scadere tra meno di trenta giorni. --quiet indica a Certbot di non mostrare informazioni o aspettare input dall’utente.

Puoi trovare informazioni più dettagliate sul rinnovo nella documentazione di Certbot.

Conclusione

In questa guida, hai installato il client Let’s Encrypt Certbot, scaricato certificati SSL per il tuo dominio e configurato il rinnovo automatico dei certificati. Se hai domande sull’uso di Certbot, puoi consultare la documentazione ufficiale di Certbot.

Puoi anche controllare il blog ufficiale di Let’s Encrypt per eventuali aggiornamenti importanti.

Source:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-rocky-linux-9