Linux13 luglio 2026 14 visualizzazioni

Certbot: installare un SSL Let's Encrypt su VPS (Nginx/Apache)

Certbot: installare un SSL Let's Encrypt su VPS (Nginx/Apache)

Certbot: installare un certificato SSL Let's Encrypt sul tuo VPS Linux (Nginx & Apache)

Un sito senza HTTPS nel 2026 è un lucchetto barrato nel browser, un malus SEO e visitatori che fuggono. La buona notizia: su un VPS, ottenere un certificato SSL/TLS valido, riconosciuto da tutti i browser e 100% gratuito richiede meno di cinque minuti grazie a Certbot, il client ufficiale di Let's Encrypt. In questa guida, installeremo Certbot su Debian/Ubuntu, genereremo un certificato per Nginx e Apache, configureremo il rinnovo automatico e rivedremo gli errori che incontriamo più spesso in supporto, comprese quelle che non figurano in alcuna documentazione ufficiale.

Let's Encrypt e Certbot: come funziona

Let's Encrypt è un'autorità di certificazione (CA) no-profit che rilascia certificati SSL/TLS gratuiti tramite il protocollo ACME. Certbot, sviluppato dall'EFF, è il client ACME di riferimento: comunica con Let's Encrypt, dimostra che controlli il tuo dominio, recupera il certificato e configura il tuo server web, il tutto con un comando.

La prova di controllo avviene tramite una "sfida" (challenge). La più comune, HTTP-01, consiste nel depositare un file temporaneo accessibile sulla porta 80 del tuo server: se Let's Encrypt riesce a leggerlo dall'esterno, il dominio è convalidato e il certificato emesso. È per questo che un VPS con un IP pubblico dedicato è l'ambiente ideale: controlli il server web, le porte e il DNS dall'inizio alla fine.

Immagine

Particolarità da conoscere: i certificati Let's Encrypt durano solo 90 giorni, contro un anno per i certificati commerciali. Non è una limitazione, è una scelta di sicurezza consapevole: una chiave compromessa ha una durata di sfruttamento breve, e la rotazione costringe all'automazione. Con il rinnovo automatico di Certbot, non ci penserai mai più.

Requisiti

Prima di lanciare qualsiasi comando, verifica questi quattro punti: il 90% dei fallimenti di emissione deriva da qui:

  1. Un VPS Linux sotto Debian 12/13 o Ubuntu 22.04/24.04 con accesso root (o sudo).
  2. Un nome di dominio il cui record DNS A (e AAAA se utilizzi l'IPv6) punta all'IP pubblico del VPS e la cui propagazione è completata.
  3. Un server web installato e che risponde già in HTTP. Se non è fatto, segui prima la nostra guida installare Nginx e PHP-FPM su un VPS.
  4. Le porte 80 e 443 aperte nel tuo firewall. Sotto UFW: sudo ufw allow 'Nginx Full' (o 'WWW Full' per Apache).

Sei su un hosting web condiviso? Questa guida riguarda i server VPS. Su un hosting cPanel, il SSL si gestisce in pochi clic: vedi come creare un certificato SSL su cPanel.

Passo 1: installare Certbot

Il metodo raccomandato dall'EFF è l'installazione tramite snap, che garantisce una versione sempre aggiornata (il pacchetto apt di Debian/Ubuntu a volte ha diverse versioni di ritardo, il che crea problemi durante le evoluzioni del protocollo ACME):

sudo apt update && sudo apt install snapd -y
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Verifica l'installazione: certbot --version deve rispondere certbot 5.x. Se preferisci rimanere sui repository ufficiali, sudo apt install certbot python3-certbot-nginx (o python3-certbot-apache) funziona anche, assumendo semplicemente una versione più vecchia.

Passo 2: ottenere e installare il certificato

Con Nginx

sudo certbot --nginx -d your-domain.com -d www.your-domain.com

Il plugin --nginx fa tutto: convalida del dominio, emissione del certificato, modifica del blocco server della tua configurazione e impostazione della redirezione HTTP → HTTPS (rispondi "2" quando Certbot te lo propone o aggiungi --redirect al comando per non avere la domanda).

Immagine

Con Apache

sudo certbot --apache -d your-domain.com -d www.your-domain.com

Senze server web (modalità standalone)

Per un server mail, un pannello o qualsiasi applicazione che gestisce autonomamente il TLS, Certbot può avviare il proprio server web temporaneo sulla porta 80:

sudo systemctl stop nginx   # liberare la porta 80 se necessario
sudo certbot certonly --standalone -d your-domain.com
sudo systemctl start nginx

In tutti i casi, i tuoi file si trovano in /etc/letsencrypt/live/your-domain.com/: fullchain.pem (certificato + catena intermedia, è quasi sempre quello che si aspettano le tue applicazioni) e privkey.pem (chiave privata, da non esporre mai).

Passo 3: verificare il rinnovo automatico

Questo è il passo che tutti saltano ed è la causa n°1 dei siti che mostrano "certificato scaduto" tre mesi dopo. L'installazione snap crea un timer systemd che esegue certbot renew due volte al giorno; ogni certificato viene rinnovato non appena entra nella sua finestra di 30 giorni di validità.


Immagine

Verifica che il timer sia attivo, quindi simula un rinnovo completo senza consumare il tuo quota:

systemctl list-timers | grep certbot
sudo certbot renew --dry-run

Se il dry-run termina con Congratulations, all simulated renewals succeeded, puoi dimenticare il tuo certificato per sempre. Suggerimento per l'amministratore: se un servizio deve essere ricaricato dopo il rinnovo (Nginx si ricarica da solo tramite il plugin, ma non un server mail, ad esempio), utilizza un deploy hook:

sudo certbot renew --deploy-hook "systemctl reload postfix"

Andare oltre: certificato wildcard (*.your-domain.com)

Un certificato wildcard copre tutti i sottodomini in un colpo solo, utile quando ospiti app., api. e blog. sullo stesso VPS. Let's Encrypt lo consente, ma solo tramite la sfida DNS-01: invece di un file sulla porta 80, dimostri il controllo del dominio creando un record TXT _acme-challenge:

sudo certbot certonly --manual --preferred-challenges dns \
  -d "your-domain.com" -d "*.your-domain.com"

La modalità --manual richiede di ricreare il TXT ad ogni rinnovo: in produzione, utilizza piuttosto un plugin DNS (certbot-dns-cloudflare, certbot-dns-ovh…) che automatizza la creazione del record tramite l'API della tua zona DNS.

Le 5 errori più frequenti (e le loro soluzioni)

1. "Connection refused" o "Timeout during connect" la porta 80 è chiusa o filtrata. Verifica sudo ufw status e non dimenticare che HTTP-01 richiede la porta 80 aperta anche se il tuo sito servirà solo HTTPS.

2. "DNS problem: NXDOMAIN" il record A non esiste ancora o non ha finito di propagarsi. Testa con dig +short your-domain.com: finché l'IP del VPS non appare, non è necessario rilanciare Certbot.

3. Il tranello del record AAAA un classico che vediamo spesso in supporto: Let's Encrypt privilegia l'IPv6 quando esiste un record AAAA. Se questo punta a un IP dove il tuo server web non ascolta, la convalida fallisce mentre il sito funziona in IPv4. Correggi il AAAA o configura Nginx per ascoltare in [::]:80.

4. "too many certificates already issued" hai raggiunto il limite di emissione di Let's Encrypt (50 certificati per dominio e per settimana, e soprattutto 5 duplicati esatti per settimana). È comune quando rilanci il comando in loop per "testare". Usa sempre --dry-run per i tuoi esperimenti: il server di staging non ha questi limiti.

5. Il rinnovo fallisce mentre l'emissione ha funzionato tipicamente, hai cambiato la configurazione di Nginx nel frattempo (rimozione del blocco server, porta 80 reindirizzata altrove, firewall ristretto). Il --dry-run dopo ogni grande modifica di configurazione ti eviterà la brutta sorpresa 60 giorni dopo.

Buone pratiche per un HTTPS solido

Il certificato è solo metà del lavoro. Per una configurazione TLS degna di questo nome: forza la redirezione 301 da HTTP a HTTPS (Certbot lo propone), attiva HSTS (add_header Strict-Transport-Security "max-age=31536000" always; in Nginx) affinché i browser non provino mai più l'HTTP, e controlla il tuo punteggio su SSL Labs, punta a A o A+. I parametri TLS generati da Certbot (options-ssl-nginx.conf) seguono le raccomandazioni di Mozilla e danno già un A nella maggior parte dei casi.

Infine, HTTPS protegge solo il trasporto: pensa anche a proteggere l'accesso SSH, il firewall e le tue applicazioni. Le nostre guide proteggere phpMyAdmin con Nginx e distribuire Laravel su un VPS mostrano come integrare correttamente il SSL in uno stack completo, e l'intero nostro tutorial è disponibile nella documentazione Linux.

FAQ – Certbot e Let's Encrypt

Certbot è davvero gratuito? Sì, totalmente. Let's Encrypt è finanziato da donazioni e sponsor (EFF, Mozilla…). Nessun limite sul numero di domini, nessun costo nascosto.

Un certificato Let's Encrypt è anche "sicuro" come un certificato a pagamento? La crittografia è rigorosamente identica (stesso TLS, stessi algoritmi). I certificati a pagamento si distinguono solo per la validazione dell'organizzazione (OV/EV) e l'assicurazione contrattuale, non per la sicurezza tecnica.

Perché solo 90 giorni di validità? Scelta di sicurezza deliberata: limitare la durata di sfruttamento di una chiave compromessa e forzare l'automazione del rinnovo. Con il timer di Certbot, è trasparente.

Posso usare Certbot su un VPS Windows? Certbot è progettato per Linux. Sotto Windows Server (IIS), utilizza un client ACME come win-acme, o posiziona il TLS su un reverse proxy Linux in front-end.

Quanto tempo richiede l'installazione completa? Su un VPS pulito con il DNS già propagato: meno di 5 minuti, installazione di Certbot inclusa.

Conclusione

Con Certbot, l'HTTPS non è più una voce di spesa né un compito trimestrale: un comando per emettere, un timer per rinnovare e un --dry-run per dormire tranquillo. L'unica vera condizione è partire da una base sana: un server con IP dedicato, accesso root e porte che controlli.

Se non hai ancora il tuo server, i nostri VPS Linux NVMe vengono consegnati in meno di 60 secondi con Debian o Ubuntu preinstallato, un IP dedicato e la protezione anti-DDoS inclusa: tutto ciò che serve per seguire questa guida da A a Z.