Certbot dns plugin rfc2136

Condividi:

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
# 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

# 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

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

# 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)”

key "miodominio_key." {
  algorithm hmac-sha512;
  secret "5u+wj7zwlhX14X/OV/3wYIOyarDf3eRGuIzpq435hs+nmLb5dDpJuCZl kOOc8qyP2lhhCNYW0oYfSkDo6JmdLg==";
};

Nella definizione della zona del dominio inseriamo le direttive di accesso

zone "miodominio.me." {

  allow-update {
    key "miodominio_key.";
  };
};

Testiamo eventuali errori di sintassi

# named-checkconf -z /etc/bind/named.conf

E ricarichiamo il servizio bind

# 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

# cp /var/cache/bind/db.miodominio_me /var/cache/bind/db.miodominio_me.bkp

Se non abbiamo nsupdate, dobbiamo installare dnsutils

# apt install dnsutils

Inseriamo nella nostra zona un record TXT “foo” contenente il valore “bar”

# 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

# 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

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

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

certbot certonly --dns-rfc2136 --dns-rfc2136-credentials ~/.secrets/certbot/rfc2136.ini -d miodominio.me

Certificato per miodominio.me e www.miodominio.me

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

certbot certonly --dns-rfc2136 --dns-rfc2136-credentials ~/.secrets/certbot/rfc2136.ini --dns-rfc2136-propagation-seconds 30 -d miodominio.me