Ricerca nel sito web

Come acquisire un certificato Let's Encrypt utilizzando la convalida DNS con acme-dns-certbot su Ubuntu 18.04


L'autore ha selezionato il Fondo di soccorso COVID-19 per ricevere una donazione nell'ambito del programma Write for DOnations.

Introduzione

La maggior parte dei certificati Let's Encrypt vengono emessi utilizzando la convalida HTTP, che consente una facile installazione dei certificati su un singolo server. Tuttavia, la convalida HTTP non è sempre adatta per emettere certificati da utilizzare su siti Web con carico bilanciato, né può essere utilizzata per emettere certificati con caratteri jolly.

La convalida DNS consente di verificare le richieste di emissione di certificati utilizzando i record DNS, anziché fornendo contenuti su HTTP. Ciò significa che i certificati possono essere emessi simultaneamente per un cluster di server Web in esecuzione dietro un sistema di bilanciamento del carico o per un sistema che non è direttamente accessibile tramite Internet. I certificati con caratteri jolly sono supportati anche tramite la convalida DNS.

Lo strumento acme-dns-certbot viene utilizzato per connettere Certbot a un server DNS di terze parti in cui i record di convalida del certificato possono essere impostati automaticamente tramite un'API quando si richiede un certificato. Il vantaggio è che non è necessario integrare Certbot direttamente con l’account del proprio provider DNS, né è necessario concedergli accesso illimitato alla configurazione DNS completa, il che è vantaggioso per la sicurezza.

Le zone DNS delegate vengono utilizzate per reindirizzare le ricerche per i record di verifica dei certificati al servizio DNS di terze parti, quindi una volta completata la configurazione iniziale, puoi richiedere tutti i certificati che desideri senza dover eseguire alcuna convalida manuale.

Un altro vantaggio chiave di acme-dns-certbot è che può essere utilizzato per emettere certificati per singoli server che potrebbero essere in esecuzione dietro un bilanciatore del carico o che altrimenti non sarebbero direttamente accessibili tramite HTTP. In questi casi non è possibile utilizzare la convalida tradizionale del certificato HTTP, a meno che non si impostino i file di convalida su ciascun server. Lo strumento acme-dns-certbot è utile anche se desideri emettere un certificato per un server che non è accessibile tramite Internet, come un sistema interno o un ambiente di staging.

In questo tutorial utilizzerai l'hook acme-dns-certbot affinché Certbot emetta un certificato Let's Encrypt utilizzando la convalida DNS.

Prerequisiti

Per completare questo tutorial avrai bisogno di:

  • Un server Ubuntu 18.04 configurato seguendo la configurazione iniziale del server con Ubuntu 18.04, incluso un utente sudo non root.

  • Un nome di dominio per il quale è possibile acquisire un certificato TLS, inclusa la possibilità di aggiungere record DNS. In questo esempio particolare, utilizzeremo tuo-dominio e sottodominio.tuo-dominio, nonché *.tuo-dominio per un certificato con caratteri jolly. Tuttavia, se necessario, questo può essere modificato per altri domini, sottodomini o caratteri jolly.

Una volta pronti, accedi al tuo server come utente non root per iniziare.

Passaggio 1: installazione di Certbot

In questo passaggio installerai Certbot, che è un programma utilizzato per emettere e gestire i certificati Let's Encrypt.

Certbot è disponibile nei repository ufficiali di Ubuntu Apt, tuttavia, si consiglia invece di utilizzare il repository gestito dagli sviluppatori Certbot, poiché contiene sempre la versione più aggiornata del software.

Inizia aggiungendo il repository Certbot:

sudo apt-add-repository ppa:certbot/certbot

Dovrai premere INVIO per accettare la richiesta e aggiungere il nuovo repository al tuo sistema.

Successivamente, installa il pacchetto Certbot:

sudo apt install certbot

Una volta completata l'installazione, puoi verificare che Certbot sia stato installato correttamente:

certbot --version

Ciò produrrà qualcosa di simile al seguente:

certbot 0.31.0

In questo passaggio hai installato Certbot. Successivamente, scaricherai e installerai l'hook acme-dns-certbot.

Passaggio 2: installazione di acme-dns-certbot

Ora che il programma Certbot di base è stato installato, puoi scaricare e installare acme-dns-certbot, che consentirà a Certbot di operare in modalità di convalida DNS.

Inizia scaricando una copia dello script:

Nota: come best practice assicurati di rivedere questo repository Github e lo script prima di eseguirlo. Puoi anche prima eseguire il fork di questo repository e poi utilizzare lo script acme-dns-certbot.py. Questo fork fornisce un ulteriore livello di sicurezza, garantendo che lo script rimanga sotto il nostro controllo e sia meno suscettibile a modifiche non verificate.

wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py

Una volta completato il download, contrassegna lo script come eseguibile:

chmod +x acme-dns-auth.py

Quindi, modifica il file utilizzando il tuo editor di testo preferito e regola la prima riga per forzarlo a utilizzare Python 3:

nano acme-dns-auth.py

Aggiungi un 3 alla fine della prima riga:

#!/usr/bin/env python3
. . .

Ciò è necessario per garantire che lo script utilizzi l'ultima versione supportata di Python 3, anziché la versione legacy di Python 2.

Una volta completato, salva e chiudi il file.

Infine, sposta lo script nella directory Certbot Let's Encrypt in modo che Certbot possa caricarlo:

sudo mv acme-dns-auth.py /etc/letsencrypt/

In questo passaggio hai scaricato e installato l'hook acme-dns-certbot. Successivamente, puoi iniziare il processo di configurazione e lavorare per emettere il tuo primo certificato.

Passaggio 3: configurazione di acme-dns-certbot

Per iniziare a utilizzare acme-dns-certbot, dovrai completare un processo di configurazione iniziale ed emettere almeno un certificato.

Inizia eseguendo Certbot per forzarlo a emettere un certificato utilizzando la convalida DNS. Questo eseguirà lo script acme-dns-certbot e attiverà il processo di configurazione iniziale:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain

Utilizza l'argomento --manual per disabilitare tutte le funzionalità di integrazione automatizzata di Certbot. In questo caso stai semplicemente emettendo un certificato grezzo, anziché installarlo automaticamente anche su un servizio.

Configura Certbot per utilizzare l'hook acme-dns-certbot tramite l'argomento --manual-auth-hook. Esegui l'argomento --preferred-challenges in modo che Certbot dia la preferenza alla convalida DNS.

Devi anche dire a Certbot di fare una pausa prima di tentare di convalidare il certificato, cosa che fai con l'argomento --debug-challenges. Questo per consentirti di impostare i record DNS CNAME richiesti da acme-dns-certbot, che verrà trattato più avanti in questo passaggio. Senza l'argomento --debug-challenges, Certbot non verrebbe messo in pausa, quindi non avresti il tempo di apportare la modifica DNS richiesta.

Ricorda di sostituire ciascuno dei nomi di dominio che desideri utilizzare utilizzando gli argomenti -d. Se desideri emettere un certificato con caratteri jolly, assicurati di sostituire l'asterisco (*) con una barra rovesciata (\).

Dopo aver seguito i passaggi standard di Certbot, ti verrà eventualmente visualizzato un messaggio simile al seguente:

...
Output from acme-dns-auth.py:
Please add the following CNAME record to your main DNS zone:
_acme-challenge.your-domain CNAME a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io.

Waiting for verification...
...

Dovrai aggiungere il record DNS CNAME richiesto alla configurazione DNS per il tuo dominio. Ciò delegherà il controllo del sottodominio _acme-challenge al servizio DNS ACME, che consentirà ad acme-dns-certbot di impostare i record DNS richiesti per convalidare la richiesta di certificato.

Se utilizzi DigitalOcean come provider DNS, puoi impostare il record DNS nel tuo pannello di controllo:

Si consiglia di impostare il TTL (time-to-live) su circa 300 secondi per garantire che eventuali modifiche al record vengano propagate rapidamente.

Una volta configurato il record DNS, torna su Certbot e premi INVIO per convalidare la richiesta di certificato e completare il processo di emissione.

L'operazione richiederà alcuni secondi e poi vedrai un messaggio che conferma che il certificato è stato emesso:

...
Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/your-domain/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/your-domain/privkey.pem
...

Hai eseguito acme-dns-certbot per la prima volta, hai configurato i record DNS richiesti e hai emesso con successo un certificato. Successivamente imposterai i rinnovi automatici del tuo certificato.

Passaggio 4: utilizzo di acme-dns-certbot

In questo passaggio finale utilizzerai acme-dns-certbot per emettere più certificati e rinnovare quelli esistenti.

Innanzitutto, ora che hai emesso con successo almeno un certificato utilizzando acme-dns-certbot, puoi continuare a emettere certificati per gli stessi nomi DNS senza dover aggiungere un altro record DNS CNAME. Tuttavia, se desideri acquisire un certificato per un sottodominio diverso o un nome di dominio completamente nuovo, ti verrà richiesto di aggiungere un altro record CNAME.

Ad esempio, potresti emettere un altro certificato con caratteri jolly autonomo senza dover eseguire nuovamente la verifica:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain

Tuttavia, se tentassi di emettere un certificato per un sottodominio, ti verrà richiesto di aggiungere un record CNAME per il sottodominio:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain

Verrà visualizzato un output simile alla configurazione iniziale eseguita nel passaggio 3:

...
Please add the following CNAME record to your main DNS zone:
_acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io.

Waiting for verification...
...

Ora che puoi utilizzare acme-dns-certbot per emettere certificati, vale la pena considerare anche il processo di rinnovo.

Una volta che i tuoi certificati sono prossimi alla scadenza, Certbot può rinnovarli automaticamente per te:

sudo certbot renew

Il processo di rinnovo può essere eseguito dall'inizio alla fine senza l'interazione dell'utente e ricorderà tutte le opzioni di configurazione specificate durante la configurazione iniziale.

Per verificare che funzioni senza dover attendere fino all'avvicinarsi della data di scadenza, è possibile avviare un'esecuzione di prova. Ciò simulerà il processo di rinnovo senza apportare modifiche effettive alla configurazione.

Puoi attivare un'esecuzione di prova utilizzando il comando renew standard, ma con l'argomento --dry-run:

sudo certbot renew --dry-run

Ciò produrrà qualcosa di simile al seguente, che garantirà che il processo di rinnovo funzioni correttamente:

...
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator manual, Installer None
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for your-domain
dns-01 challenge for your-domain
Waiting for verification...
Cleaning up challenges
...

In questo passaggio finale, hai emesso un altro certificato e poi hai testato il processo di rinnovo automatico all'interno di Certbot.

Conclusione

In questo articolo configuri Certbot con acme-dns-certbot per emettere certificati utilizzando la convalida DNS. Ciò sblocca la possibilità di utilizzare certificati con caratteri jolly e di gestire una vasta gamma di server Web distinti che potrebbero trovarsi dietro un bilanciatore del carico.

Assicurati di tenere d'occhio il repository acme-dns-certbot per eventuali aggiornamenti allo script, poiché è sempre consigliabile eseguire l'ultima versione supportata.

Se sei interessato a saperne di più su acme-dns-certbot, potresti consultare la documentazione per il progetto acme-dns, che è l'elemento lato server di acme-dns-certbot:

  • acme-dns su GitHub

Il software acme-dns può anche essere ospitato autonomamente, il che può essere utile se si opera in ambienti complessi o ad alta sicurezza.

In alternativa, puoi approfondire i dettagli tecnici della convalida DNS ACME esaminando la sezione pertinente del documento RFC ufficiale che descrive come funziona il processo:

  • RFC8555 - Sezione 8.4

Articoli correlati: