Vai al contenuto

Impostazioni cookie

Scelga per ogni tipo quali cookie consente. Può modificare la sua scelta in qualsiasi momento tramite Impostazioni cookie in fondo a ogni pagina. Informativa sulla privacy

Necessari

Sempre attivi

Servono per accedere, conservare il carrello e ricordare le sue scelte. Sono sempre attivi.

Quali cookie?
  • weboke_sessie, weboke_klant, weboke_remember: la sua sessione e la permanenza dell'accesso
  • weboke_basket: il suo carrello
  • wkBtwIncl: visualizzazione dei prezzi con o senza IVA
  • wok_cookies: la sua scelta sui cookie, 12 mesi

Misurano quale annuncio porta a una visita o a un ordine, così non paghiamo annunci che non funzionano.

Quali cookie?
  • Google Ads tramite Google Tag Manager (_gcl_au, _gcl_aw), fino a 90 giorni
  • OpenAI Ads, annunci in ChatGPT
  • wok_aff: tramite quale partner è arrivato da noi (programma di affiliazione), 60 giorni

4,6

Paese e lingua

Ogni paese ha il suo sito, con i prezzi e l'IVA di quel paese.

Vedi

https con Let's Encrypt

Modulo 7: Dominio, server web e https · Tempo di lettura: 12 minuti

Obiettivo della lezione: Dopo questa lezione Lei sarà in grado di richiedere con certbot un certificato gratuito di Let's Encrypt per nginx, reindirizzare http su https, verificare il rinnovo automatico e risolvere gli errori più frequenti durante una richiesta.

Concetti chiave: certificato, autorità di certificazione (CA), ACME, Let's Encrypt, validazione del dominio, HTTP-01, DNS-01, TLS-ALPN-01, certbot, rinnovo, certbot renew --dry-run, durata di validità, ARI, rate limit, staging, CAA, reindirizzamento su https

Perché https, e che cosa dimostra un certificato

Senza https tutto ciò che passa tra browser e server viaggia in rete non cifrato: password, moduli, cookie. Chiunque si trovi lungo il percorso (una rete wifi pubblica, un router compromesso) può leggere o modificare i dati. Per questo i browser contrassegnano i siti http come "non sicuri", e alcune funzioni sono disponibili solo tramite https. Per una cassaforte di password come Vaultwarden (lezione 9.4) https è addirittura obbligatorio.

https utilizza TLS, e per questo il Suo server ha bisogno di un certificato: una prova, firmata da un'autorità di certificazione (CA) di cui i browser si fidano, che questa chiave appartiene a questo nome. Un normale certificato dimostra soltanto che il richiedente gestisce il nome di dominio (validazione del dominio). Non dice nulla su chi Lei sia o sulla Sua affidabilità.

Let's Encrypt è una CA gratuita che rilascia solo certificati a validazione di dominio, in modo completamente automatico tramite il protocollo ACME. Un programma sul Suo server (il client ACME) richiede il certificato, dimostra di gestire il nome, lo installa e lo rinnova in tempo. Questa lezione utilizza certbot, il client della EFF. Caddy (lezione 7.4) ha un client ACME integrato.

Come si dimostra di gestire il nome?

Let's Encrypt prevede tre tipi di verifica (challenge):

ChallengeComePortaWildcard (*.example.com)
HTTP-01pubblicare un file sotto http://<naam>/.well-known/acme-challenge/80no
DNS-01creare un record TXT _acme-challenge.<naam>nessunasì
TLS-ALPN-01presentare un certificato speciale durante l'handshake TLS443no

Per un normale VPS con un sito web il metodo più semplice è HTTP-01. Per usarlo occorre che:

  • il nome punti al Suo server con un record A (e AAAA) (lezione 7.1);
  • la porta 80 sia aperta a tutto il mondo, anche se per il resto il Suo sito usa solo https. Let's Encrypt valida solo tramite la porta 80 e da più punti di Internet; non è possibile inserire quegli indirizzi nel firewall;
  • il Suo server risponda allo stesso modo via IPv4 e via IPv6. Se il nome ha un record AAAA, Let's Encrypt prova prima IPv6. Solo se IPv6 non stabilisce alcuna connessione, ripiega su IPv4.

DNS-01 serve per un certificato wildcard, oppure se il server non è raggiungibile dall'esterno. In quel caso il client ACME deve poter modificare il Suo DNS, di solito tramite una chiave API del Suo fornitore DNS. Quella chiave può modificare tutto il Suo DNS: la conservi con la stessa cura di una password.

Installare certbot

Gli sviluppatori di certbot consigliano lo snap, perché contiene sempre la versione più recente. Su Debian e Ubuntu è possibile installarlo anche direttamente dal repository dei pacchetti:

anna@web1:~$ sudo apt install certbot python3-certbot-nginx

La versione della distribuzione è meno recente ma riceve gli aggiornamenti di sicurezza tramite apt (lezioni 4.1 e 4.2), e questo si adatta al resto del corso. Scelga una delle due soluzioni, non entrambe: due installazioni si ostacolano a vicenda durante il rinnovo.

Richiedere un certificato

Con il sito della lezione 7.2 già funzionante sulla porta 80:

anna@web1:~$ sudo certbot --nginx -d example.com -d www.example.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address or hit Enter to skip.
 (Enter 'c' to cancel):
...
Requesting a certificate for example.com and www.example.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2027-02-07.
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 example.com to /etc/nginx/sites-enabled/example.com
Successfully deployed certificate for www.example.com to /etc/nginx/sites-enabled/example.com
Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.com

(Data e dettagli sono un esempio.) Il plug-in --nginx fa tre cose: prepara temporaneamente la challenge, scarica il certificato e modifica il Suo server block aggiungendo un blocco listen 443 ssl e un reindirizzamento da http a https. Se preferisce farlo da sé, usi certbot certonly --nginx e inserisca personalmente le righe nella Sua configurazione.

Alcuni punti a cui prestare attenzione:

  • Richieda in una sola volta tutti i nomi che appartengono al sito (-d per ogni nome). Ogni nome deve puntare al server, altrimenti l'intera richiesta fallisce.
  • La chiave privata (privkey.pem) si trova in /etc/letsencrypt/live/ ed è leggibile solo da root. Non la copi in altri posti e non la inserisca mai in un backup leggibile da altri.
  • L'indirizzo email è facoltativo. Da giugno 2025 Let's Encrypt non invia più email quando un certificato sta per scadere. Deve quindi essere Lei a verificare che il rinnovo vada a buon fine (lezione 8.3).

Reindirizzare http su https

Dopo certbot la Sua configurazione avrà più o meno questo aspetto (ripulita; certbot aggiunge commenti # managed by Certbot e talvolta righe if):

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name example.com www.example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    root /var/www/example.com;
    ...
}

Il primo blocco reindirizza tutto ciò che arriva via http allo stesso nome e allo stesso percorso via https, con un reindirizzamento permanente (301). Il file della challenge per il rinnovo continua a funzionare: Let's Encrypt segue quel reindirizzamento. Il secondo blocco è il sito vero e proprio. Se desidera anche reindirizzare www al nome senza prefisso (o viceversa), lo faccia in un blocco a parte, così che i visitatori vedano un unico nome fisso.

Rinnovo: automatico, e da verificare

Un certificato di Let's Encrypt è attualmente valido 90 giorni. La durata si accorcerà: Let's Encrypt ha annunciato che il profilo predefinito rilascerà certificati di 64 giorni a partire dal 10 febbraio 2027 e di 45 giorni a partire dal 16 febbraio 2028. Rinnovare a mano non è quindi un'opzione; deve avvenire automaticamente.

Durante l'installazione certbot crea un timer systemd (o una riga cron) che due volte al giorno controlla se un certificato deve essere rinnovato. Verifichi che esista e provi il rinnovo con una richiesta di prova:

anna@web1:~$ systemctl list-timers 'certbot*'
NEXT                        LEFT    LAST PASSED UNIT          ACTIVATES
Mon 2026-11-09 22:41:00 CET 9h left -    -      certbot.timer certbot.service
anna@web1:~$ sudo certbot renew --dry-run
...
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/example.com/fullchain.pem (success)

Dopo il rinnovo nginx deve anche caricare il nuovo certificato. Con il plug-in nginx certbot se ne occupa da solo; se usa certonly, configuri un deploy hook che ricarichi nginx, per esempio uno script eseguibile in /etc/letsencrypt/renewal-hooks/deploy/ con systemctl reload nginx.

I buoni client ACME usano ARI (ACME Renewal Information): è Let's Encrypt stesso a indicare quando un certificato deve essere rinnovato, per esempio in anticipo se c'è un problema con una serie di certificati. Per questo mantenga il Suo client aggiornato.

Se una richiesta non va a buon fine

Messaggio (abbreviato)CausaSoluzione
Timeout during connect (likely firewall problem)porta 80 chiusa, oppure il nome punta a un altro indirizzofirewall (lezione 5.2), A/AAAA (lezione 7.1)
Invalid response from http://.../.well-known/acme-challenge/...: 404risponde un altro server o un altro server block, spesso via IPv6listen [::]:80, controllare il record AAAA
CAA record for example.com prevents issuanceun record CAA autorizza solo un'altra autoritàmodificare il CAA (lezione 7.1)
too many certificates already issuedun rate limitattendere; fare prove con staging

Let's Encrypt applica dei rate limit per prevenire gli abusi. I più importanti: al massimo 50 nuovi certificati per dominio registrato ogni 7 giorni, al massimo 5 certificati per esattamente lo stesso insieme di nomi ogni 7 giorni e al massimo 5 validazioni fallite per nome ogni ora. Chi sta facendo prove e ripete continuamente la richiesta li raggiunge in fretta. Per questo faccia le prove con l'ambiente di staging, che ha limiti molto più ampi ma rilascia certificati di cui i browser non si fidano:

anna@web1:~$ sudo certbot certonly --nginx --staging -d test.example.com

Se lì funziona, richieda il certificato vero.

Su AlmaLinux e Rocky Linux

Lì certbot proviene da EPEL (dnf install certbot python3-certbot-nginx) oppure è disponibile come snap. Il plug-in e i comandi sono gli stessi. Tenga presente firewalld (--add-service=http --add-service=https) e SELinux se i certificati si trovano in una posizione insolita.

Nella pratica

Con un pacchetto di hosting è il pannello a occuparsi del certificato per Lei (presso WebOké e presso altri provider di hosting con DirectAdmin, cPanel o Plesk). Su un VPS se ne occupa Lei, con certbot, Caddy o il client ACME fornito con il Suo software. Questo vale con qualsiasi fornitore.

Riepilogo

  • Un certificato di Let's Encrypt dimostra che Lei gestisce il nome; certbot lo richiede, lo installa e lo rinnova tramite ACME.
  • HTTP-01 richiede la porta 80 aperta, per tutti, e la stessa risposta via IPv4 e IPv6; DNS-01 serve per i wildcard.
  • certbot --nginx -d ... -d ... gestisce certificato e reindirizzamento su https; richieda tutti i nomi di un sito in una sola volta.
  • I certificati sono ora validi 90 giorni e la durata si accorcerà; controlli il timer e certbot renew --dry-run, e sorvegli Lei stesso la data di scadenza.
  • Faccia le prove con --staging per evitare i rate limit; presti attenzione al CAA.

Quiz

1. Il Suo sito deve essere raggiungibile solo via https. Può chiudere la porta 80 nel firewall se usa HTTP-01?



2. Desidera un certificato per *.example.com. Quale challenge Le serve?



3. La richiesta fallisce con un 404 sul file della challenge, mentre curl http://example.com/ via IPv4 mostra il Suo sito. Qual è la causa più probabile?



4. Perché il rinnovo automatico è più importante che mai?



5. Sta facendo esperimenti e oggi ha già richiesto quattro volte lo stesso certificato. Che cosa fa per la prova successiva?



Esercizio

Esercizio Z7.3: https con un certificato valido. Richieda un certificato per il Suo sito (con certbot o Caddy), reindirizzi http su https e provi il rinnovo con certbot renew --dry-run (con Caddy: controlli nei log che il certificato sia stato ottenuto). Inserisca il nome del Suo sito. Il programma stabilisce una connessione TLS verso la porta 443 e verifica che il certificato sia valido, firmato da un'autorità attendibile e che copra il Suo nome, poi richiede http://<naam>/ per vedere se Lei reindirizza su https. Inoltre indichi quando scade il Suo certificato e come è organizzato il rinnovo nel Suo caso.

Esercizio Z7.3: https con un certificato valido

Solo per i corsisti iscritti. Apriamo https://<naam>/ e http://<naam>/ come farebbe un browser, dal nostro server web.




Quello che inserisce e quello che rileviamo non vengono salvati. Il Suo browser ricorda le Sue risposte e se ha superato l'esercizio. Se ha effettuato l'accesso, conserviamo in I miei corsi solo il fatto che l'esercizio era (quasi) corretto; anche lì può eliminarlo.

Per approfondire

Un momento…

Configuri i suoi domini

Per ogni dominio imposti i nameserver, il collegamento al suo hosting e chi ne diventa l'intestatario.

Caricamento dei suoi domini…