Certificado TLS com ACME-DNS e DNS-01

De ISPUP!
Revisão de 11h16min de 12 de maio de 2025 por Gondim (discussão | contribs)
Ir para navegação Ir para pesquisar

Diagrama exemplo

Descrição

Diversos sistemas e serviços que utilizamos na Internet fazem uso de certificados digitais para validar se uma fonte é legítima, também para criptografar a comunicação e assim garantir segurança e privacidade entre o visitante e o sistema ou a comunicação entre sistemas. Diversos serviços conhecidos utilizam os certificados digitais como: milhares de sites web via HTTPS, servidores de envio e recebimento de e-mails (MTAs), clientes de e-mail (MUAs) quando se comunicam com os MTAs, DNS quando utilizamos DNSSEC e qualquer outro sistema que necessite de certificado digital para operar com criptografia dos dados. Em um passado não tão distante, sites eram acessados de maneira insegura usando HTTP (80/tcp) e era muito comum enganar um visitante com um site falso para roubar-lhe os dados ou induzi-lo a executar algum malware hospedado. Um certificado serve para garantir que aquele domínio acessado é de fato legítimo e não fraudulento. Não garante que seus dados estarão seguros armazenados naquele sistema, mas isso é uma outra história. O sistema funciona com criptografia assimétrica onde temos um par de chaves, a chave pública e uma chave privada. Nós assinamos as coisas com nossa chave privada e os sistemas conseguem confirmar que é nosso através da nossa chave pública. Tá mas quem garante que eu, sou eu mesmo e não um impostor? Para resolver esse problema entra em ação as Autoridades Certificadoras (CAs), elas assinam seu certificado atestando que você é quem diz ser. Existem diversas CAs no mundo mas a que vamos falar e utilizar aqui é a Let's Encrypt. Ela é uma opção gratuita e extremamente utilizada na Internet.

Como funciona a Let's Encrypt

Aqui vamos falar de assinatura de certificados para nossos domínios de Internet. Vamos dizer que você tenha registrado o domínio seudominio.com.br lá no Registro.br. O Registro.br sabe quem você é e possui seus dados, que foram passados durante o registro do domínio. Lá constam os servidores de DNS Autoritativos que são responsáveis pelos registros do seu domínio. Até aqui não temos nenhum certificado digital que garanta para os visitantes que o site visitado é realmente o seu site. Imagina que por um problema de DNS comprometido em algum ISP, seu cliente foi parar em um servidor que não é o seu e abrindo um site que não é o seu mas que é muito idêntico ao seu. Aqui vai entrar o seu certificado digital assinado pela CA, para salvar o seu cliente de ter seus dados comprometidos.

A Let's Encrypt para assinar seu certificado também precisa confirmar que você é quem diz ser, não é mesmo? Ela faz isso confirmando que você é o controlador do domínio, que no nosso exemplo é o seudominio.com.br. Ela pode fazer isso de duas formas:

  • HTTP-01.
  • DNS-01.

No modelo de confirmação HTTP-01 é necessário que a Let's Encrypt acesse seu servidor através do FQDN para o qual você está solicitando o seu certificado digital. Estamos falando de uma conexão entrante (80/tcp) e que é possível quando existe uma rede pública de acesso. Mas e se você quisesse um certificado digital para um servidor privado seu? Um com IP 192.168.0.10 ou FC00::192:168:0:10. Aí nesse caso podemos tomar para uso a autenticação via DNS-01.

Usando DNS-01, a Let's Encrypt conseguirá confirmar a sua identidade através de um registro TXT de DNS contendo um desafio gerado pela Let's Encrypt e que provará que você é o detentor do domínio. Assim você poderá gerar certificados para qualquer IP da sua rede, sendo ele privado ou público. O único problema desse tipo de autenticação, é que precisaríamos de um DNS compatível com um cliente ACME e que permitisse inclusões e atualizações dos registros TXT com os desafios mas são pouquíssimos os DNS(s) Autoritativos que possuem essa capacidade. Felizmente temos uma outra solução bem fácil de implementar, acme-dns.

Meu artigo será exatamente sobre o uso do DNS-01 e o serviço acme-dns.

ACME-DNS

O acme-dns é um micro servidor de DNS programado em Go por Joona Hoikkala e que também desenvolveu o acme-dns-client que também iremos utilizar. O acme-dns terá a função de armazenar e atualizar os registros TXT de DNS, com os desafios gerados pela Let's Encrypt e este possui uma API HTTPS para se comunicar com o acme-dns-client. Assim, toda vez que necessitar de atualizar os certificados antes dos 3 meses de expiração, poderá ser feito automaticamente e veremos isso aqui.

Vamos utilizar os seguintes programas neste artigo:

  • Certbot, o cliente ACME mais utilizado para solicitar os certificados digitais Let's Encrypt.
  • ACME-DNS-CLIENT, o software utilizado com o certbot, para atualizar os registros TXT de DNS com os desafios corretos do seu servidor.
  • ACME-DNS, o serviço de DNS que armazenará os desafios para o seu servidor.

O funcionamento do conjunto acme-dns/acme-dns-client é bem simples, é necessário criarmos um subdomínio para a nossa gerência de desafios apontando para onde nosso servidor acme-dns ficará rodando. Vamos usar para isso um sistema GNU/Linux Debian mas você pode adaptar para outras distribuições que desejar. Abaixo nosso exemplo de configuração inicial no nosso DNS Autoritativo:

auth.seudominio.net.br. IN NS auth.seudominio.net.br.
auth.seudominio.net.br. IN A 198.18.0.1
auth.seudominio.net.br. IN A 2001:db8::198:18:0:1

Acima estamos criando nosso subdomínio auth e apontando para os IPs fictícios 198.18.0.1 e 2001:db8:198:0:1 que é onde estará rodando nosso servidor acme-dns. Esse serviço uma vez rodando, você poderá usá-lo para criar certificados TLS usando Let's Encrypt DNS-01 para qualquer domínio e servidor seu, seja ele público ou privado.

Como estaremos usando o Debian 12 (Bookworm) certifique-se de estar com o repositório backports abaixo, no seu /etc/apt/sources.list:

deb http://deb.debian.org/debian bookworm-backports main non-free-firmware contrib non-free

O Go precisaremos apenas para compilar o acme-dns e o acme-dns-client e depois, se quiser, poderá desinstalá-lo.

# apt update
# apt install golang-1.23 golang-github-mattn-go-sqlite3-dev git sqlite3 sqlite3-tools
# export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/go-1.23/bin"
# cd /usr/local/src
# git clone https://github.com/joohoi/acme-dns
# cd acme-dns
# export GOPATH=/tmp/acme-dns
# go build
# mv acme-dns /usr/local/bin
# adduser --system --gecos "acme-dns Service" --disabled-password --group --home /var/lib/acme-dns acme-dns
# mv acme-dns.service /etc/systemd/system/acme-dns.service
# systemctl daemon-reload
# systemctl enable acme-dns.service

Se quiser manter o Go funcionando, adicione na PATH em /etc/profile o caminho /usr/lib/go-1.23/bin.

Os comandos acima irão instalar o Go e um módulo pro SQLite3 para o Go, irá baixar o projeto oficial do acme-dns, irá compilá-lo e jogar o binário acme-dns em /usr/local/bin, irá criar um usuário não privilegiado para ele e por fim colocará para rodar como um serviço no systemd.