Nell articolo “Certificati https gratuiti con Let’s Encrypt” è stato mostrato come generare certificati https per i propri domini web utilizzando certbot e la CA di Let’s encrypt.
Il core di certbot permette di generare certificati per i domini serviti dal server in cui viene eseguito, ma con alcuni plugin è possibile generare certificati per ogni dominio di cui si amministra il dns, il certificato però dovrà poi essere istallato manualmente.
Ci sono vari plugin da utilizzare, a seconda del proprio provider dns, in questo articolo ci interfacciamo con il nostro server bind tramite certbot-dns-rfc2136
Per verificare l’identità di chi gestisce il dominio, il plugin cerca il record TXT nella zona dns con chiave _acme-challenge ed un certo valore fornito dal bot in fase di generazione. Questo record può essere inserito manualmente al momento della richiesta, ma quello che viene mostrato in questo articolo è la modalità di automatizzazione di questo processo.
Genereremo una chiave TSIG che installeremo in BIND e forniremo al plugin di certbot l’autorizzazione di inserire record nella zona dns del nostro dominio
Installiamo il plugin
1 2 3 |
# apt update # apt upgrade # apt install python3-certbot-dns-rfc2136 |
Chiave TSIG
Per prima cosa dobbiamo creare una chiave TSIG con cui autorizzare l’inserimento di record in bind
1 2 3 |
# mkdir -p mkdir -p ~/.secrets/certbot/ # cd ~/.secrets/certbot/ # dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST miodominio_key |
Vengono generati due file, che contengono la chiave pubblica e la chiave privata
1 2 |
Kmiodominio_key.+165+53517.key Kmiodominio_key.+165+53517.private |
I permessi di questi file non sono messi a caso. Una volta installata la chiave in bind, chiunque disponga di questi file può inserire nel nostro dns quello che vuole. Vanno pertanto tenuti al sicuro e con i permessi corretti
Configurazione di BIND
Leggiamo il contenuto del file Kmiodominio_key.+165+53517.key
1 2 3 |
# cat Kmiodominio_key.+165+53517.key miodominio_key. IN KEY 512 3 165 5u+wj7zwlhX14X/OV/3wYIOyarDf3eRGuIzpq435hs+nmLb5dDpJuCZl kOOc8qyP2lhhCNYW0oYfSkDo6JmdLg== |
Questa stringa ci serve per determinare i due valori di cui abbiamo bisogno. Il primo campo “miodominio_key.” sarà il nome della nostra chiave, mentre le due ultime stringhe alfanumeriche rappresentano il secret
Definiamo quindi nel config file di bind la chiave di accesso, inserendo name e secret come mostrato di seguito. Se anche solo uno dei due valori non corrisponde a quelli contenuti nel file generato con dnssec-keygen, nsupdate non riuscirà ad autenticarsi e quando invieremo il comando send ci restituirà l’errore “update failed: NOTAUTH(BADKEY)”
1 2 3 4 |
key "miodominio_key." { algorithm hmac-sha512; secret "5u+wj7zwlhX14X/OV/3wYIOyarDf3eRGuIzpq435hs+nmLb5dDpJuCZl kOOc8qyP2lhhCNYW0oYfSkDo6JmdLg=="; }; |
Nella definizione della zona del dominio inseriamo le direttive di accesso
1 2 3 4 5 6 |
zone "miodominio.me." { allow-update { key "miodominio_key."; }; }; |
Testiamo eventuali errori di sintassi
1 |
# named-checkconf -z /etc/bind/named.conf |
E ricarichiamo il servizio bind
1 |
# systemctl reload bind9 |
Testiamo la chiave
Per sicurezza, facciamo una copia di backup del nostro file di zona che si trova in /var/cache/bind, non si sa mai
1 |
# cp /var/cache/bind/db.miodominio_me /var/cache/bind/db.miodominio_me.bkp |
Se non abbiamo nsupdate, dobbiamo installare dnsutils
1 |
# apt install dnsutils |
Inseriamo nella nostra zona un record TXT “foo” contenente il valore “bar”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# nsupdate -k ~/.secrets/certbot/Kmiodominio_key.+165+53517.key -v > server 127.0.0.1 > debug yes > zone miodominio.me. > update add foo.miodominio.me. 86400 TXT bar > show Outgoing update query: ;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: 0 ;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0 ;; ZONE SECTION: ;miodominio.me. IN SOA ;; UPDATE SECTION: foo.miodominio.me. 86400 IN TXT "bar" > send Sending update to 127.0.0.1#53 Outgoing update query: ;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: 978 ;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 1 ;; ZONE SECTION: ;miodominio.me. IN SOA ;; UPDATE SECTION: foo.miodominio.me. 86400 IN TXT "bar" ;; TSIG PSEUDOSECTION: miodominio_key. 0 ANY TSIG hmac-sha512. 1549897717 300 64 ... ... 978 NOERROR 0 Reply from update query: ;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: 978 ;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1 ;; ZONE SECTION: ;miodominio.me. IN SOA ;; TSIG PSEUDOSECTION: miodominio_key. 0 ANY TSIG hmac-sha512. 1549897717 300 64 ... ... 978 NOERROR 0 > quit |
Interroghiamo il name server
1 2 3 |
# dig +short -t txt foo.miodominio.me. "bar" |
Creiamo il file ini per certbot
Creiamo il file di autenticazione per il plungin di certbot ed impostiamo i diritti di accesso. Solo root deve avere accesso a questo file, in caso contrario certbot mostrerà un messaggio di errore
1 2 |
touch ~/.secrets/certbot/rfc2136.ini chmod 600 ~/.secrets/certbot/rfc2136.ini |
In questo file dobbiamo inserire l’indirizzo ip del server dns, il nome della chiave e la stringa della chiave pubblica che abbiamo inserito in /etc/bind/named/named.conf.local
1 2 3 4 5 |
dns_rfc2136_server = 127.0.0.1 dns_rfc2136_port = 53 dns_rfc2136_name = miodominio_key. dns_rfc2136_secret = 5u+wj7zwlhX14X/OV/3wYIOyarDf3eRGuIzpq435hs+nmLb5dDpJuCZl kOOc8qyP2lhhCNYW0oYfSkDo6JmdLg== dns_rfc2136_algorithm = HMAC-SHA512 |
Generazione dei certificati
Certificato per miodominio.me
1 |
certbot certonly --dns-rfc2136 --dns-rfc2136-credentials ~/.secrets/certbot/rfc2136.ini -d miodominio.me |
Certificato per miodominio.me e www.miodominio.me
1 |
certbot certonly --dns-rfc2136 --dns-rfc2136-credentials ~/.secrets/certbot/rfc2136.ini -d miodominio.me -d www.miodominio.me |
Certificato per miodominio.me con attesa di 30 secondi per la propagazione dns
1 |
certbot certonly --dns-rfc2136 --dns-rfc2136-credentials ~/.secrets/certbot/rfc2136.ini --dns-rfc2136-propagation-seconds 30 -d miodominio.me |