Certificado TLS com ACME-DNS e DNS-01
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.
- 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.