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
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
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!
[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
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
.
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)
In risposta, dovremmo visualizzare il messaggio:
[*] New acme-dns account for domain mio-dominio.com successfully registered!
[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
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:
- deve essere di tipo
CNAME
- il
Nome host
deve essere quello mostrato a schermo, e iniziare con_acme-challenge
- deve avere il valore mostrato dal programma, che sarà un lungo codice simile a
e20...72.auth.acme-dns.io
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:
Qui un esempio con OVH:
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!
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
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/
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:
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.