O objetivo desse artigo é mostrar e explicar como emitir certificado Let's Encrypt usando o desafio via DNS.
A vantagem desse método é que podemos automatizar o processo e não se preocupar em realizar liberação de acesso no firewall a Let's Encrypt, essas liberações são necessárias para que possa validar a emissão do certificado, como no popular método utilizando desafio via HTTP.
Assim, iremos simplificar a conexão utilizando o desafio via DNS, visto já ser aberto na internet.
Nota: O sistema operacional que utilizamos em nossa instalação é o Ubuntu 22.04 e o BIND 9.18.19.
No servidor de DNS master do seu domínio fazer:
1 - Habilitando Update dinâmico no Bind(RFC 2136)
Gerar a chave de acesso com o comando abaixo:
tsig-keygen -a hmac-sha512 key_dominio_teste.com.br
Saída:
key "key_dominio_teste.com.br" {
algorithm hmac-sha512;
secret "WMzJ8kSfBZsPEgZ8HtRlSgVaNqkyzbCHANL0+s9uV8HdsMDyJeXE8tos0XLL1U9hWZie6ZvR1YeRWqspSMDijA==";
};
Pegar a saída do comando acima e adicionar no arquivo de seus arquivos de zonas que por padrão é "/etc/bind/named.conf.local".
Sugiro criar uma chave por domínio e deixar essa chave acima das configurações do seu domínio.
2 - Ativando o DNS dinâmico no domínio teste.com.br
zone "teste.com.br" {
type master;
file "master/teste.com.br.zone";
check-names warn;
update-policy {
grant key_dominio_teste.com.br name _acme-challenge.teste.com.br. txt;
};
};
Garantir que o usuário "bind" tenha permissão de leitura e escrita no arquivo de zona "teste.com.br.zone"
Após configurar, reiniciar o serviço "service named restart"
Na máquina que será usada para gerar o certificado Let's Encrypt
1 - Garantir que essa máquina tenha acesso tcp na porta 53 de seu servidor de DNS master
2 - Instalar os pacotes do Let's Encrypt com os comandos abaixo:
apt install certbot
apt install python3-certbot-apache
apt install python3-certbot-dns-rfc2136
3 - Criar um arquivo contendo as informações necessárias para que o cliente possa solicitar o certificado. Como sugestão criar o arquivo em /root/key_dominio_teste.com.br.ini
dns_rfc2136_server = 10.0.0.1
dns_rfc2136_port = 53
dns_rfc2136_name = key_dominio_teste.com.br
dns_rfc2136_secret = WMzJ8kSfBZsPEgZ8HtRlSgVaNqkyzbCHANL0+s9uV8HdsMDyJeXE8tos0XLL1U9hWZie6ZvR1YeRWqspSMDijA==
dns_rfc2136_algorithm = HMAC-SHA512
dns_rfc2136_sign_query = false
Ajuste as variáveis dns_rfc2136_server com o ip do seu DNS master, dns_rfc2136_name com o nome da sua chave gerada e o dns_rfc2136_secret com a chave gerada
Garantir a permissão no arquivo ini "chmod 600 /root/key_dominio_teste.com.br.ini"
4 - Gerando o certificado
Com o comando abaixo, iremos criar um certificado do tipo WildCard.
certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /root/key_dominio_teste.com.br.ini --dns-rfc2136-propagation-seconds 300 -d '*.teste.com.br' -d teste.com.br
Após a execução do comando acima a saída esperada:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-rfc2136, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for teste.com.br
dns-01 challenge for teste.com.br
Waiting 300 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/teste.com.br/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/teste.com.br/privkey.pem
Your cert will expire on 2024-01-07. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Notas e curiosidades
Quando habilitamos o Update dinâmico no Bind(RFC 2136) esse recurso ativa um journaling do seu arquivo de zona, criando arquivos com extensão ".jnl", esses arquivos crescem sem limites por padrão, você pode limitar o seu crescimento através do "max-journal-size", no entanto eu optei para rodar o comando "rndc -V sync -clean" uma vez ao dia no meu servidor, esse comando realiza a sincronização no seu arquivo de zona de seu domínio e limpa os arquivos de journaling do seu sistema.
Caso deseje vê o conteudo no arquivo de journaling você pode usar o comando abaixo:
named-journalprint /var/cache/bind/master/teste.com.br.zone.jnl