Como Adquirir um Certificado Let’s Encrypt Usando Validação por DNS com acme-dns-certbot no Ubuntu 18.04

O autor selecionou o Fundo de Ajuda para COVID-19 para receber uma doação como parte do programa Escreva para Doações.

Introdução

A maioria das certificadas Let’s Encrypt são emitidas usando validação HTTP, o que permite a instalação fácil de certificados em um único servidor. No entanto, a validação HTTP nem sempre é adequada para emitir certificados para uso em sites balanceados de carga, nem pode ser usada para emitir certificados wildcard.

A validação DNS permite que solicitações de emissão de certificados sejam verificadas usando registros DNS, em vez de exibir conteúdo via HTTP. Isso significa que certificados podem ser emitidos simultaneamente para um cluster de servidores web executando atrás de um balanceador de carga, ou para um sistema que não é acessível diretamente pela Internet. As certificadas wildcard também são suportadas usando validação DNS.

O acme-dns-certbot é usado para conectar Certbot the um servidor DNS de terceiros onde os registros de validação de certificado podem ser definidos automaticamente via API quando você solicita um certificado. A vantagem disso é que você não precisa integrar Certbot diretamente com sua conta de fornecedor de DNS, nem precisa conceder-lhe acesso ilimitado à sua configuração DNS completa, o que é benéfico para a segurança.

As áreas de DNS delegadas são usadas para redirecionar as buscas para os registros de validação de certificado para o serviço de DNS de terceiros, por isso, assim que a configuração inicial for concluída, você pode solicitar quantos certificados quiser sem precisar realizar nenhuma validação manual.

Outro benefício chave do acme-dns-certbot é que ele pode ser usado para emitir certificados para servidores individuais que possam estar rodando atrás de um balanceador de carga ou que não sejam acessíveis diretamente via HTTP. Validação de certificados HTTP tradicional não pode ser usada nestes casos, a menos que você defina os arquivos de validação em cada servidor. A ferramenta acme-dns-certbot também é útil se você quiser emitir um certificado para um servidor que não é acessível via internet, como um sistema interno ou ambiente de apresentação.

Neste tutorial, você usará o gancho acme-dns-certbot para Certbot para emitir um certificado de Let’s Encrypt usando validação de DNS.

Pré-requisitos

Para concluir este tutorial, você precisará:

  • Um servidor Ubuntu 18.04 configurado segundo o A Configuração Inicial do Servidor com Ubuntu 18.04, incluindo um usuário não-root com permissão sudo.

  • Um domínio para o qual você pode obter um certificado TLS, incluindo a capacidade de adicionar registros DNS. Neste exemplo particular, usaremos seu-dominio e subdominio.seu-dominio, bem como *.seu-dominio para um certificado wildcard. No entanto, isso pode ser ajustado para outro domínio, subdomínios ou wildcards se necessário.

Uma vez que estes estão prontos, conecte-se ao seu servidor como seu usuário não-root para iniciar.

Passo 1 — Instalando Certbot

Neste passo, você vai instalar Certbot, que é um programa usado para emitir e gerenciar certificados Let’s Encrypt.

Certbot está disponível nos repositórios oficiais Ubuntu Apt, no entanto, é recomendado usar o repositório mantido pelos desenvolvedores do Certbot, já que este sempre tem a versão mais atual do software.

Comece adicionando o repositório Certbot:

sudo apt-add-repository ppa:certbot/certbot

Você precisará pressionar ENTER para aceitar o prompt e adicionar o novo repositório ao seu sistema.

Agora, instale o pacote Certbot:

sudo apt install certbot

Uma vez que a instalação estiver concluída, você pode verificar que o Certbot foi instalado com sucesso:

certbot --version

Isso vai mostrar algo similar ao seguinte:

Output
certbot 0.31.0

Neste passo, você instalou o Certbot. A próxima coisa que você fará é baixar e instalar o hook acme-dns-certbot.

Passo 2 — Instalando acme-dns-certbot

Agora que o programa base Certbot foi instalado, você pode baixar e instalar o acme-dns-certbot, que permitirá que o Certbot funcione no modo de validação DNS.

Comece baixando uma cópia do script:

Nota: Como boa prática, certifique-se de revisar este repositório do Github e o script antes de executá-lo. Você também pode primeiro fazer um fork deste repositório e, em seguida, utilizar o script acme-dns-certbot.py. Este fork fornece uma camada extra de segurança, garantindo que o script permaneça sob nosso controle e seja menos suscetível a alterações não verificadas.

wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py

Após o download ser concluído, marque o script como executável:

chmod +x acme-dns-auth.py

Em seguida, edite o arquivo usando seu editor de texto favorito e ajuste a primeira linha para forçá-lo a usar o Python 3:

nano acme-dns-auth.py

Adicione um 3 ao final da primeira linha:

acme-dns-certbot.py
#!/usr/bin/env python3
. . .

Isso é necessário para garantir que o script utilize a versão mais recente suportada do Python 3, em vez da versão legada do Python 2.

Depois de terminar, salve e feche o arquivo.

Por fim, mova o script para o diretório Certbot Let’s Encrypt para que o Certbot possa carregá-lo:

sudo mv acme-dns-auth.py /etc/letsencrypt/

Nesta etapa, você baixou e instalou o hook acme-dns-certbot. Em seguida, você pode iniciar o processo de configuração e trabalhar para emitir seu primeiro certificado.

Passo 3 — Configuração de acme-dns-certbot

Para começar a usar o acme-dns-certbot, você precisará concluir um processo de configuração inicial e emitir pelo menos um certificado.

Comece executando o Certbot para forçar a emissão de um certificado usando a validação de DNS. Isto irá executar o script acme-dns-certbot e disparar o processo de configuração inicial:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain

Você usa o argumento --manual para desabilitar todas as funcionalidades de integração automatizadas do Certbot. Neste caso, você está emitindo um certificado cru, em vez de instalá-lo automaticamente em um serviço.

Você configura o Certbot para usar o gancho acme-dns-certbot através do argumento --manual-auth-hook. Você executa o argumento --preferred-challenges para que o Certbot dê preferência à validação de DNS.

Você deve também informar ao Certbot para pausar antes de tentar validar o certificado, o que você faz com o argumento --debug-challenges. Isso permite que você configure o registro DNS CNAME necessário pelo acme-dns-certbot, coberto posteriormente neste passo. Sem o argumento --debug-challenges, o Certbot não pausaria, portanto você não teria tempo para fazer a mudança de DNS necessária.

Lembre-se de substituir cada um dos nomes de domínio que deseja usar usando argumentos -d. Se você quiser emitir um certificado com comodín, certifique-se de que o asterisco (*) esteja escapado com um backslash (\).

Após seguir as etapas padrão do Certbot, você eventualmente será promptado com uma mensagem semelhante à seguinte:

Output
... Output from acme-dns-auth.py: Please add the following CNAME record to your main DNS zone: _acme-challenge.your-domain CNAME a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io. Waiting for verification... ...

Você precisará adicionar o registro DNS CNAME necessário à configuração DNS do seu domínio. Isso delegará o controle do subdomínio _acme-challenge ao serviço de DNS ACME, o que permitirá que o acme-dns-certbot configure os registros DNS necessários para validar a solicitação de certificado.

Se você estiver usando o DigitalOcean como seu provedor de DNS, você pode definir o registro DNS no painel de controle:

É recomendado definir o TTL (tempo de vida) em cerca de 300 segundos para ajudar a garantir que quaisquer mudanças no registro sejam propagadas rápido.

Uma vez que você tenha configurado o registro DNS, volte para o Certbot e pressione ENTER para validar a solicitação de certificado e concluir o processo de emissão.

Isso levará alguns segundos, e você então verá uma mensagem confirmando que o certificado foi emitido:

Output
... Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your-domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your-domain/privkey.pem ...

Você executou o acme-dns-certbot pela primeira vez, configurou os registros DNS necessários e emitiu com sucesso um certificado. A próxima etapa é configurar as renovações automáticas de seu certificado.

Passo 4 — Usando acme-dns-certbot

Neste passo final, você usará o acme-dns-certbot para emitir mais certificados e renovar os existentes.

A primeira coisa, agora que você emitiu com sucesso pelo menos um certificado usando o acme-dns-certbot, você pode continuar a emitir certificados para os mesmos nomes de DNS sem precisar adicionar outro registro DNS CNAME. No entanto, se você desejar adquirir um certificado para um subdomínio diferente ou um nome de domínio inteiramente novo, você será solicitado a adicionar outro registro CNAME para o subdomínio.

Por exemplo, você poderia emitir outro certificado wildcard independente sem precisar realizar a verificação novamente:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain

No entanto, se você tentar emitir um certificado para um subdomínio, você será solicitado a adicionar um registro CNAME para o subdomínio:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain

Isso mostrará uma saída semelhante à configuração inicial que você realizou no Passo 3:

Output
... Please add the following CNAME record to your main DNS zone: _acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io. Waiting for verification... ...

Agora que você consegue usar o acme-dns-certbot para emitir certificados, é bom considerar também o processo de renovação.

Uma vez que seus certificados estão próximos da expiração, o Certbot pode renová-los automaticamente por você:

sudo certbot renew

O processo de renovação pode executar de start-to-finish sem interação do usuário e vai lembrar todas as opções de configuração que você especificou durante a configuração inicial.

Para testar que isto está funcionando sem ter que esperar até o prazo de expiração, você pode disparar uma execução em cima de papel. Isto simulará o processo de renovação sem fazer qualquer mudança real na sua configuração.

Você pode disparar uma execução em cima de papel usando o comando padrão renew, mas com o argumento --dry-run:

sudo certbot renew --dry-run

Isto emitirá algo semelhante ao seguinte, que fornecerá a certeza de que o processo de renovação está funcionando corretamente:

Output
... Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator manual, Installer None Renewing an existing certificate Performing the following challenges: dns-01 challenge for your-domain dns-01 challenge for your-domain Waiting for verification... Cleaning up challenges ...

Neste passo final, você emitiu outro certificado e então testou o processo de renovação automática no Certbot.

Conclusão

Neste artigo, você configurou o Certbot com o acme-dns-certbot para emitir certificados usando validação de DNS. Isto abre a possibilidade de usar certificados wildcard, bem como gerenciar um grande conjunto de servidores web distintos que pode estar situado atrás de um balanceador de carga.

Certifique-se de manter os olhos no repositório acme-dns-certbot para quaisquer atualizações no script, já que é sempre recomendado executar a versão suportada mais recente.

Se você estiver interessado em saber mais sobre o acme-dns-certbot, você pode querer revisar a documentação do projeto acme-dns, que é o elemento de servidor do acme-dns-certbot:

O software acme-dns também pode ser hospedado localmente, o que pode ser vantajoso se você estiver operando em ambientes com alta segurança ou complexos.

Caso contrário, você pode explorar as detalhes técnicos de validação de DNS ACME revendo a seção relevante do documento oficial RFC que descreve como o processo funciona:

Source:
https://www.digitalocean.com/community/tutorials/how-to-acquire-a-let-s-encrypt-certificate-using-dns-validation-with-acme-dns-certbot-on-ubuntu-18-04