La procedura "standard" per ottenere gratis un certificato SSL/TLS e attivare HTTPS sul proprio sito prevede di utilizzare Let's Encrypt tramite protocollo HTTP (modalità chiamata HTTP-01 challenge). Ma se ci serve un certificato HTTPS gratuito per un sito Intranet, non raggiungibile pubblicamente, oppure per abilitare i protocolli sicuri SMTPS e IMAPS sul nostro mail server privato, c'è un modo più semplice. Nella presente guida vedremo dunque come ottenere un certificato da Let's Encrypt tramite validazione DNS (DNS-01 challenge), ovvero inserendo un semplice record aggiuntivo sul nome a dominio. Il tutto con una speciale attenzione al rinnovo automatico

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico) - lets encrypt validazione dns

Questa guida è incentrata specificamente su quanto indicato nel titolo: ottenere un certificato SSL/TLS gratis, tramite validazione DNS, configurando tutto per rinnovare automaticamente il certificato in prossimità della scadenza, senza bisogno di intervento umano. Una volta attivato il certificato, quindi, ce ne potremo completamente dimenticare.

Per la guida generale a Let's Encrypt e tutte le informazioni del caso, fai riferimento all'articolo dedicato:

» Leggi: Come ottenere un certificato HTTPS (SSL/TLS) gratis: la Grande Guida a Let's Encrypt

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico) - certificato https gratis guida Lets Encrypt

Io uso quotidianamente entrambi i modi, in contesti diversi:

  • per il certificato TLS che abilita HTTPS qui su TurboLab.it uso la modalità standard, HTTP-01 challenge
  • per il certificato TLS in uso sul mio server email personale, sul quale non è presente il server web, uso DNS-01 challenge, esattamente come spiegato di seguito

Il risultato finale è esattamente lo stesso. Selezionare l'una o l'altra modalità dipende solo dal contesto e dalle preferenze personali.

Avvertenze preliminari

Al momento in cui scrivo, la procedura "ufficiale" DNS-01 challenge di Let's Encrypt funziona veramente bene solo se il gestore del nome a dominio per il quale vogliamo ottenere il certificato supporta esplicitamente questa funzione. Seppur il requisito sia soddisfatto, è comunque necessario salvare le credenziali di accesso al DNS sul sistema che genera il certificato: un rischio, in termini di sicurezza, inaccettabile per molti di noi.

Per disfarci di entrambe le criticità si usa un software gratuito e open source, chiamato acme-dns-client, che si occupa di gestire per noi questa complessità: dobbiamo solo invocare il comando e aggiungere a DNS il record mostrato. Facilissimo!

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico)

[oltre a acme-dns/acme-dns-client, scritto in linguaggio Go (quello che useremo noi), è disponibile una versione precedente del tool, realizzata in Python e chiamata joohoi/acme-dns-certbot-joohoi. L'autore è il medesimo, e lui stesso raccomanda la nuova versione]

La "magia" di acme-dns-client è resa possibile da un'istanza della sua controparte "server", acme-dns, in funzione sul dominio auth.acme-dns.io. Il "client" che installiamo comunica con tale servizio, gestito dallo sviluppatore del pacchetto e messo a disposizione di tutti gratuitamente.

L'unica criticità di questo approccio è che, così facendo, stiamo trasferendo a auth.acme-dns.io l'autorità di generare certificati validi per il nostro dominio (nulla più, nulla meno). È importante tenerlo a mente, soprattutto in caso lo si utilizzi in ambienti estremamente critici. L'alternativa prevede di attivare una nostra istanza della componente server, acme-dns. Ma, se sussiste tale necessità, l'architettura si complica: probabilmente, tanto vale tornare al metodo HTTP-01 challenge classico!

Certificato gratis via DNS, Passo 1: Installare acme-dns-client

acme-dns-client è disponibile un po' per tutti i sistemi operativi (Windows, Linux, macOS) e architetture. La presente guida è però incentrata sulle versioni moderne di Ubuntu a 64 bit.

Per installare certbot, il client ufficiale per Let's Encrypt, e acme-dns-client su Ubuntu in modo completamente automatico basta eseguire:

sudo apt update && sudo apt install curl -y && curl -sL https://turbolab.it/scarica/481 | sudo bash

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico)

Il comando appena impartito esegue uno script (visualizzabile qui) che svolge in sequenza tutte le tediose operazioni che, altrimenti, dovresti svolgere manualmente.

Sebbene certbot sia disponibile anche nei repository ufficiali di Ubuntu e installabile immediatamente tramite apt, lo script utilizza il pacchetto certbot gestito dallo sviluppatore e veicolato sottoforma di snap: è importante procedere in questo modo, perché la versione che si installa tramite apt non è mai aggiornata. Nel momento in cui scrivo, ad esempio, Ubuntu 24.04 offre certbot 2.9.0, mentre via snap si accede alla più moderna 3.2.0.

Certificato gratis via DNS, Passo 2: Creare l'account per il dominio

Ora procediamo creando un account "di servizio" per il nostro dominio su auth.acme-dns.io. Ipotizzando di voler creare un certificato HTTPS per il dominio mio-dominio.com, useremo questo comando:

sudo acme-dns-client register -d mio-dominio.com -s https://auth.acme-dns.io --dangerous

Naturalmente, devi sostituire a mio-dominio.com lo specifico dominio per il quale vuoi generare i certificati. Tutto il resto va scritto esattamente così come mostrato. È importante notare che qui devi registrare esattamente l'hostname per il quale vuoi generare il certificato. Se quindi il tuo sistema sarà raggiungibile, ad esempio, come ftp.mio-dominio.com dovrai creare l'account con l'opzione -d ftp.mio-dominio.com. Se invece stai attivando il tuo server email privato su mailserver.mio-dominio.com userai -d mailserver.mio-dominio.com.

» Leggi anche: Come trasformare un PC o Raspberry Pi in un email server personale o per l'ufficio, gratis e senza cloud: la guida definitiva (alternativa a Google Workspace)

Se invece vuoi generare un certificato wildcard, valido per mio-dominio.com e TUTTI i suoi sottodomini, fai riferimento a questo approfondimento dedicato:

» Leggi: Guida per ottenere un certificato HTTPS "wildcard" gratis con Let's Encrypt (*.miosito.com)

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico)

In risposta, dovremmo visualizzare il messaggio:

[*] New acme-dns account for domain mio-dominio.com successfully registered!

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico)

[la minacciosa opzione --dangerous è indispensable per proseguire. Omettendola, il programma si limita a segnalare quanto già discusso al paragrafo Avvertenze preliminari, poi esce senza fare nulla]

La creazione di questo account è necessaria solo la prima volta in cui si lavora su un dominio. Provando infatti a ripetere il comando, si ottiene un avviso:

[W] Acme-dns account already registered for domain mio-dominio.com

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico)

Non è assolutamente un problema: poiché non è necessaria alcuna verifica per la creazione di questo account, né c'è alcun controllo, ed è sicuramente possibile che abbiamo già registrato il dominio noi stessi in precedenza, oppure che l'abbia fatto qualcun altro al posto nostro, magari per errore.

In tutti i casi, possiamo tranquillamente procedere al passo successivo.

Certificato gratis via DNS, Passo 3: Aggiungere il record "_acme-challenge" al DNS

La procedura chiede ora:

Do you want acme-dns-client to monitor the CNAME record change?

Dobbiamo solo battere Y sulla tastiera e il programma ci mostra il record che dobbiamo inserire a DNS:

  1. deve essere di tipo CNAME
  2. il Nome host deve essere quello mostrato a schermo, e iniziare con _acme-challenge
  3. deve avere il valore mostrato dal programma, che sarà un lungo codice simile a e20...72.auth.acme-dns.io

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico)

Se stiamo registrando un dominio di terzo livello, come ftp.mio-dominio.com, oppure mailserver.mio-dominio.com, il nome del record sarà simile a _acme-challenge.ftp.mio-dominio.com, oppure _acme-challenge.mailserver.mio-dominio.com e via dicendo.

Il valore di questo record non è assolutamente segreto (anzi: verrà esposto pubblicamente tramite DNS) e può quindi essere comunicato senza problemi a chiunque sia incaricato di gestire il DNS affinché lo inserisca: questo inserimento generalmente si svolge tramite il pannello web dell'azienda presso la quale è registrato il dominio stesso.

Qui un esempio con Aruba:

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico)

Qui un esempio con OVH:

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico)

Certificato gratis via DNS, Passo 3: Attesa di conferma

acme-dns-client verificherà ogni 15 secondi che il record sia stato inserito a DNS, mostrando ripetutamente un conto alla rovescia simile a:

Waiting for 14 seconds... Press Ctrl + C to abort and exit.

Dobbiamo solo attendere che l'inserimento del record CNAME a DNS si propaghi. Nella mia prova sono stati necessari 5 minuti circa, ma non è da escludere che si possa arrivare ad un'attesa di alcune ore. Non appena il programma recepisce l'inserimento del record, mostra un'incoraggiante conferma:

[*] CNAME record is now correctly set up!

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico)

Certificato gratis via DNS, Passo 4: REcord CAA (opzionale)

L'ultima riga del passo precedente chiede se desideriamo configurare un record CAA (Certificate Authority Authorization): è un meccanismo di sicurezza aggiuntivo, che permette di indicare quali CA (Certification Authority) sono autorizzate a rilasciare certificati validi per il dominio in questione. Di più: acme-dns-client aggiunge già anche alcuni valori, attualmente non ancora realmente utilizzabili ma in fase di standardizzazione, che limitano ulteriormente le modalità con cui sono erogabili i certificati.

Ad ogni modo: io già utilizzo un record CAA creato manualmente e che autorizza solo Let's Encrypt (IN CAA 0 issue "letsencrypt.org"), motivo per cui non ho battuto N sulla tastiera e non ho approfondito oltre questa funzione

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico)

Certificato gratis via DNS, Passo 5: Generare il certificato

Ora che tutto è pronto possiamo finalmente ottenere il certificato vero e proprio. Il comando è:

sudo certbot certonly --no-eff-email --agree-tos --manual --preferred-challenges dns --manual-auth-hook 'acme-dns-client' -d mio-dominio.com

Naturalmente, devi sostituire a mio-dominio.com lo specifico dominio per la quale vuoi generare il certificato, che deve essere lo stesso che per il quale hai creato l'account e inserito il record CNAME al passo precedente.

Se l'operazione va a buon fine, il certificato e la relativa chiave privata verranno creati nel percorso /etc/letsencrypt/live/mio-dominio.com/

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico)

Da qui in avanti, puoi caricare il certificato nei programmi che ne abbisognano, esattamente come accade quando usi il tradizionale metodo HTTP-01 challenge. Per la procedura passo passo, fai riferimento alla guida dedicata:

» Leggi: Come ottenere un certificato HTTPS (SSL/TLS) gratis: la Grande Guida a Let's Encrypt

Gestire la scadenza e il rinnovo automaticamente

Come sempre, i certificati ottenuti da Let's Encrypt sono validi solamente per 90 giorni, trascorsi i quali è necessario rinnovarli e ricaricare i servizi che li usano, di modo da utilizzare i file aggiornati. La procedura automatica che hai utilizzato per installare i programmi, però, ha già configurato automaticamente il sistema con lo script dedicato, quindi non c'è null'altro da fare. Per maggiori informazioni:

» Leggi: Let's Encrypt e Nginx: come rinnovare automaticamente il certificato HTTPS e riavviare il server web dopo il rinnovo

Guida Let's Encrypt tramite validazione DNS Ubuntu: come ottenere gratis certificato HTTPS (TLS) acme-dns-client, siti Intranet privati server email (rinnovo automatico) - let's encrypt rinnovo restart nginx spotlight

Conclusioni

In questa guida abbiamo visto come ottenere un certificato HTTPS (TLS) tramite validazione DNS con acme-dns-client. La procedura funziona bene e posso confermare che, dopo averla usata per ottenere i certificati TLS per il mio server email oltre un anno fa, non ho più toccato nulla: il rinnovo avviene periodicamente e in modo del tutto automatico, senza che sia mai emerso alcun disservizio.