Distribuire un'app HTTPS ASP.NET Core con Let’s Encrypt e Docker

In questo articolo ci concentreremo esclusivamente sul processo di protezione di un'applicazione ASP.NET Core utilizzando un certificato SSL generato automaticamente da Let's Encrypt. Vedremo come installare Certbot, generare un certificato SSL, configurare Kestrel per HTTPS e distribuire l'applicazione in un contenitore Docker.

immagine illustrativa dell'articolo “Distribuire un'app HTTPS ASP.NET Core con Let’s Encrypt e Docker”

La distribuzione di un'applicazione HTTPS ASP.NET Core con un certificato SSL può sembrare a prima vista banale, soprattutto con servizi come Let's Encrypt che rendono i certificati gratuiti e accessibili. In pratica, però, può diventare rapidamente complicato, soprattutto quando si combina questo processo con la distribuzione di applicazioni moderne in ambienti containerizzati.

L'impostazione dei certificati SSL richiede una serie di operazioni: bisogna sapere come montare correttamente i file dei certificati in un contenitore DOCKER in modo che siano accessibili all'applicazione, gestire i formati dei file come PEM o RSA per assicurarsi che siano compatibili con Kestrel (il server web integrato di ASP .NET Core) e configurare adeguatamente le variabili d'ambiente in modo che l'applicazione possa utilizzarli correttamente. Ognuno di questi passaggi, se non eseguito con attenzione, può introdurre errori o complicazioni.

In questo articolo ci concentreremo esclusivamente sul processo di configurazione di un'applicazione ASP.NET Core per HTTPS con un certificato SSL generato automaticamente da Let's Encrypt. Vedremo come installare Certbot, generare il certificato SSL, configurare Kestrel per HTTPS e distribuire l'applicazione in un contenitore Docker. Per seguire questa guida, è necessario disporre di un server Linux con Docker già installato e configurato e padroneggiare i comandi di base per la creazione e la gestione delle immagini. Seguendo questi passaggi, potrete facilmente configurare le vostre applicazioni utilizzando il protocollo HTTPS.

Passo 1- Installare Certbot su un server Linux.

Il primo passo per ottenere un certificato SSL gratuito da Let's Encrypt è installare Certbot sul vostro server Linux. CertBot è uno strumento a riga di comando che facilita la richiesta di certificati SSL/TLS.

  • Aggiornate il vostro server e installate Certbot.
# Per Ubuntu/Debian

sudo apt update
sudo apt install certbot-y 

Passo 2 - Generare il certificato SSL con Let's Encrypt (CertBot).

Per ottenere un certificato SSL con Let's Encrypt utilizzando la sfida DNS-01, dovete dimostrare la proprietà del vostro dominio creando un record DNS TXT specifico. Ecco come fare:

  1. Generare un certificato SSL con la sfida DNS-01:
sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d dominio.com --key-type rsa

Questo comando usa certonly per ottenere il certificato senza configurare automaticamente un server web, dandoci il pieno controllo sul suo utilizzo, specialmente per distribuzioni personalizzate come Docker.

L'opzione --Manual è scelta per convalidare il certificato tramite una sfida DNS gestita manualmente, utile quando il provider DNS non supporta l'automazione, e --Manual-auth-hook specifica lo script che aiuta ad automatizzare la creazione del record DNS necessario.

Infine, utilizzando --preferred-challenges dns si indica che la sfida DNS-01 è preferita, in quanto più flessibile in molti ambienti.

Una volta eseguito questo comando, Certbot chiederà di creare un record DNS specifico per convalidare la proprietà del dominio. Seguire le istruzioni fornite.

  1. Seguire le istruzioni di Certbot per la sfida DNS:.

Dopo aver eseguito il comando Certbot, Certbot chiederà di creare un record DNS TXT per convalidare la proprietà del dominio. Si dovrebbe ottenere un risultato simile a questo:

Please deploy a DNS TXT record under the name
_acme-challenge.dominio.com with the following value: 

ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789
  1. Aggiungi il record DNS TXT.

Accedere alla sezione di gestione DNS del proprio provider di dominio e creare un nuovo record TXT con i dati forniti da Certbot.

Type : TXT
Nome  : _acme-challenge.dev
Valore  : ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789
  1. Validare la sfida DNS con Certbot.

Tornate al terminale dove avete lanciato Certbot e premete Invio per continuare. Let's Encrypt controllerà il record DNS e, se correttamente configurato, rilascerà il certificato SSL.

💡 Per impostazione predefinita, i certificati si trovano qui: /etc/letssencrypt/live/.

Passo 3- Verifica e conversione della chiave privata.

Una volta generati il certificato e la chiave privata, è importante verificare che i file in formato PEM siano formattati correttamente e pronti per essere utilizzati con Kestrel.

  • Verifica della chiave privata generata da Certbot:
sudo openssl rsa -in /etc/letsencrypt/live/dominio.com/privkey.pem -check
  • Convertire la chiave privata in un altro formato, se necessario:

Per impostazione predefinita, le chiavi generate da Let's Encrypt con Certbot sono in formato RSA, come indicato al punto 1. Tuttavia, se avete specificato un altro formato o avete usato un altro strumento per generare la chiave, potete convertirla nel formato RSA previsto da Kestrel con il seguente comando:

sudo openssl rsa -in /etc/letsencrypt/live/dominio.com/privkey.pem -out /etc/letsencrypt/live/dominio.com/privkey-rsa.pem

Questa conversione assicura che la chiave sia nel formato previsto da Kestrel nell'applicazione ASP.NET CORE.

Passo 4- Eseguire il contenitore Docker con i file PEM.

Quando si distribuisce l'applicazione in un contenitore Docker, è necessario montare i file PEM del certificato e della chiave privata in modo che Kestrel possa accedervi.

Utilizzare il seguente comando per eseguire il contenitore Docker sul server:

sudo docker run -it -p 443:81 -p 80:80 \
  -e ASPNETCORE_URLS="https://*:81;http://*:80" \
  -v /etc/letsencrypt:/cert \
  -e ASPNETCORE_Kestrel__Certificates__Default__Path=/cert/live/dominio.com/fullchain.pem \
  -e ASPNETCORE_Kestrel__Certificates__Default__KeyPath=/cert/live/dominio.com/privkey.pem \
  -e repo-docker/image-docker:latest

Questo comando monta la cartella contenente i file PEM (chiave privata e certificato) nel contenitore Docker ( -v /etc/letsencrypt:/cert), consentendo all'applicazione di accedervi.

Le variabili d'ambiente specificano i percorsi dei file PEM nel contenitore che Kestrel deve utilizzare all'avvio, garantendo connessioni HTTPS sicure.

Passo 5 - Eseguire il contenitore Docker con i file PEM.

Una volta seguiti tutti i passaggi, è il momento di testare l'applicazione per assicurarsi che tutto funzioni correttamente. Andare su https://dominio.com nel browser web. Se il certificato SSL è stato installato e configurato correttamente, si dovrebbe vedere una connessione sicura con l'icona del lucchetto nella barra degli indirizzi. Ciò indica che il traffico tra il server e il client è ora crittografato e sicuro.

Se tutto è stato configurato correttamente, la vostra applicazione ASP.NET è ora distribuita con successo in un ambiente sicuro utilizzando Docker e un certificato SSL Let's Encrypt.

Con questo approccio, potete facilmente proteggere la distribuzione in produzione delle vostre applicazioni .NET, sfruttando al contempo la flessibilità e l'efficienza di Docker, che consente la distribuzione portatile in qualsiasi ambiente.


Quentin Destrade