Come configurare un certificato wildcard con Let’s Encrypt su AWS Route 53

certificato wildcard letsencrypt route53

Se hai necessità di un certificato SSL per il tuo sito, sicuramente Let’s Encrypt è un modo piuttosto rapido e gratuito per ottenerlo.

Per un lavoro che ho svolto ultimamente, il cliente voleva che il suo sito fosse accessibile tramite due indirizzi, ovvero www.nomesito.com e nomesito.com

Se l’indirizzo del sito fosse stato uno solo la configurazione sarebbe stata semplice ed intuitiva. La puoi vedere nell’articolo che avevo già fatto qui.

Nel caso specifico dato che non sono un amministratore di rete volevo agire rapidamente e in modo chiaro e semplice.
Il sito è costituito dal backend sviluppato con Laravel e da un frontend sviluppato con VueJs, il tutto servito da Nginx su un’istanza Ubuntu su AWS.

Per fare questo ho utilizzato certbot quello che è il tool ufficiale di Let’s Encrypt. Ti ricordo che i passaggi che ti mostrerò di seguito non servono se non hai bisogno di un certificato wildcard.

Installazione di certbot

Per installare certbot devi eseguire i comandi di seguito, parte di questi si possono vedere anche dalla guida di certbot.
Nota che le istruzioni che ti ho messo nel link fanno riferimento al caso specifico di Ubuntu 18.04 con Nginx.

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx

Installazione di pip

Pip è un package manager per pyton, ci servirà per installare l’estensione di certbot che ci permetterà di configurare Route 53 su AWS.

sudo apt-get update && sudo apt-get -y upgrade
sudo apt-get install python-pip

Il primo comando, ovvero quello di upgrade non è necessario se sapete quello che state facendo.

Installazione del plugin Route 53 per certbot

Adesso che installeremo il plugin di Route 53 per certbot l’unica attenzione che dobbiamo avere per evitare problemi e quella di assicurarci che il plugin abbia la stessa versione di certbot. Per farlo ti basterà lanciare il comando certbot --version.
Nel mio caso era la 1.2.0 ma se installi entrambi nello stesso momento sarà molto probabile avere la stessa versione.

pip install certbot_dns_route53==1.2.0

Configurare un utente per AWS

Adesso, per fare in modo che il nostro plugin certbot_dns_route53 funzioni, è necessario che abbia l’accesso al servizio Ruote 53 di AWS.
Per farlo nel modo migliore e con maggior sicurezza possibile, andremo a creare un utente su AWS e gli assegneremo dei permessi specifici.

schermata di esempio della gestione utenti e gruppi su aws
Schermata di gestione utenti e gruppi su AWS

Penso che non sia complicato creare un utente su AWS, quello che però bisogna fare attenzione è creare un utente con Programmatic access (not console). In poche parole che non abbia possibilità di accedere alla console. Una volta creato, per comodità lo aggiungeremo ad un gruppo, il quale ci aiuterà a gestire al meglio i DNS nel caso in cui, in futuro, i nostri siti o domini cresceranno.

Questo utente che andremo a creare avrà bisogno di permessi specifici per far in modo che il plugin per certbot modifichi i records CNAME necessari. I permessi si posso aggiungere o da una lista enorme di elementi oppure tramite un json nella schermata apposita. Noi useremo quest’ultimo passaggio, ti basterà copiare e incollare il json di seguito.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:ListHostedZones",
                "route53:GetChange"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect" : "Allow",
            "Action" : [
                "route53:ChangeResourceRecordSets"
            ],
            "Resource" : [
                "arn:aws:route53:::hostedzone/YOURHOSTEDZONEID"
            ]
        }
    ]
}

L’unico cambiamento da fare è quello di andare a recupera il vostro l’ID della zona dei DNS su Route 53 e sostituirlo dove ho riportato YOURHOSTEDZONEID.

schermata di esempio dell' ID di zona in Route 53
Esempio di dove reperire lo zoneID in Route53

Ricordati che una volta creato l’utente devi scaricare e salvare in un luogo sicuro (meglio se con un password manager) le credenziali d’accesso. Ovvero l’access key e la secret key.

Configurazione delle credenziali AWS

Adesso abbiamo bisogno di mettere le credenziali da qualche parte sul server in modo che il plugin possa usarle, possibilmente nella cartella home, ma è una tua scelta.

Creiamo una cartella .aws e dentro creiamo il file credentials che sarà un semplice file di testo, con al suo interno le credenziali dell’utente AWS creato.

[default]
aws_access_key_id=XXXXXX
aws_secret_access_key=XXXX/XXXXX

Ricordati di sostituire le X con i dati corretti.

Lanciamo Certbot

A questo punto, ho creato una cartella letsencrypt sempre nella home e al suo interno le cartelle log, config, work che mi aiuteranno nella gestione del tool certbot.
Spostiamoci dentro e creiamo il nostro primo certificato in questo modo:

certbot certonly -d nomesito.com -d *.nomesito.com --dns-route53 --logs-dir /home/username/letsencrypt/log/ --config-dir /home/username/letsencrypt/config/ --work-dir /home/username/letsencrypt/work/ -m email@nomesito.com --agree-tos --non-interactive --server https://acme-v02.api.letsencrypt.org/directory

Piccola spiegazione sui comandi usati

  • certonly: Questo serve a dire a certbot di generare solo il certificato e di salvarcelo da qualche parte, senza intervenire successivamente sull’installazione dello stesso nel nostro webserver. Nel caso non stiate generando certificati wildcard potreste anche non usarlo.
  • -d: Questo serve per specificare per quali domini si sta generando il certificato, puoi inserirne più di uno ma ricordati di inserire sempre prima tutti i domini e solo per ultimo il dominio per cui stai generando il certificato wildcard.
  • --dns-route-53: Questo indicherà al plugin che vogliamo che il certificato venga validato. La convalida del certificato passa tramite i DNS, è l’unico modo per validare un certificato wildcard.
  • --logs-dir, --work-dir, --config-dir: servono ad indicare le cartelle specifiche che ci aiuteranno anche nell’eseguire certbot senza il comando sud.
  • -m: indica l’email.
  • --agree-tos: accettiamo i termini e le condizioni di certbot automaticamente.
  • --non-interactive: esegue tutti i passaggi non critici automaticamente, senza interrompersi per chiederci informazioni.
  • --server: punta manualmente al server che abiliterà i nostri certificati wildcard. Il server al quale punta di default certbot non supporta la generazione di certificati wildcard, quindi ci servirà inserirlo manualmente.

Una volta che avremo lanciato il comando e tutto sarà andato per il meglio, i files del certificato saranno salvati nella cartella che abbiamo usato durante la configurazione, nel nostro caso era:
/home/username/letsencrypt/config/live/nomesito.com/
Qui troveremo due files, uno dal nome fullchain.pem e un altro dal nome privkey.pem.

Aggiungiamo i certificati alla configurazione di Nginx

Adesso che abbiamo creato i files, sarà necessario aggiungerli alla configurazione del nostro webserver. Nel caso dell’esempio sarà Nginx.

Apriamo il file di configurazione di Nginx che farà riferimento al nostro sito. In questo file troveremo del testo racchiuso in un blocco server { }, con diversi settaggi tipo listen and location.

Dentro al blocco server inseriamo queste linee di codice:

ssl_certificate /home/username/letsencrypt/config/live/nomesito.com/fullchain.pem;
ssl_certificate_key /home/username/letsencrypt/config/live/nomesito.com/privkey.pem;

Non dimenticarti di sostituire il blocco username con la username dell’utente che hai sul server e il nome della cartella nomesito.com nel quale sono stati salvati i certificati da certbot.

Una volta aggiunto tutto al file di configurazione di nginx, salvalo e esci.
Adesso ci tocca riavviare il server, ma prima di farlo ti consiglio di lanciare il comando per fare il test del file di configurazione, per evitare che qualcosa scritta male tenga giù il server finchè non risolvi il problema.

nginx -c /etc/nginx/nginx.conf -t

Questo comando dovrebbe essere sufficiente.
Se in risposta ricevete un OK! Allora possiamo riavviare il server.

sudo service nginx reload

Una volta riavviato il server ci basterà andare sul sito per verificare che sia tutto ok. Naturalmente nella sua versione https.

Rinnovare automaticamente i certificati

Adesso che tutto è configurato e funzionante quello che ci serve è fare in modo che, alla loro scadenza, i certificati si rinnovino automaticamente, anche perché i certificarti di Let’s Encrypt durano soltanto 90 giorni.

Per fare questo, ci arriva in aiuto certbot con una sua utility.
Tramite questo comando:

certbot renew --dns-route53 --logs-dir /home/username/letsencrypt/log/ --config-dir /home/username/letsencrypt/config/ --work-dir /home/username/letsencrypt/work/ --non-interactive --server https://acme-v02.api.letsencrypt.org/directory --post-hook "sudo service nginx reload"

Questo comando è molto simile al primo che abbiamo lanciato e proverà ad aggiornare tutti i certificati che abbiamo generato. Inoltre con il comando
--post-hook facciamo in modo che successivamente alla corretta generazione del certificato venga lanciato un comando.
Comando che nel nostro caso sarà il riavvio del server nginx.

Adesso non ci resta che configurare un cronjob che ogni giorno andrà a lanciare questo comando per vedere se i certificati sono ancora validi ed eventualmente aggiornarli. Per fare questo potete vedere l’articolo su come configurare un cron job.

Alla fine

Alla fine non mi rimane che dire grazie, se sei arrivato fin qui vuol dire che hai trovato interessante quello che ho scritto.
Se hai consigli o se qualcosa non ha funzionato non aspetto altro che saperlo.