Como obter um certificado Let’s Encrypt usando validação 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 por Doações.

Introdução

A maioria dos certificados de Let’s Encrypt é emitida 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 e também não pode ser usada para emitir certificados wildcard.

A validação DNS permite que pedidos de emissão de certificados sejam verificados usando registros DNS, em vez de servir conteúdo por meio de 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. Os certificados wildcard também são suportados usando validação DNS.

O Ferramenta acme-dns-certbot é usada 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. O benefício 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 ter que realizar validação manual.

Outro benefício chave da acme-dns-certbot é que ela pode ser usada para emitir certificados para servidores individuais que estão rodando atrás de um balanceador de carga ou que não são acessíveis diretamente via HTTP. A 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 um ambiente de apresentação.

Neste tutorial, você vai 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 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, utilizaremos 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.

Depois de tudo estar pronto, conecte-se ao seu servidor como usuário não-root para iniciar.

Passo 1 — Instalando Certbot

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

Certbot está disponível nos repositórios oficiais do 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.

A seguir, instale o pacote Certbot:

sudo apt install certbot

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

certbot --version

Isso irá exibir algo semelhante à seguinte:

Output
certbot 0.31.0

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

Passo 2 — Instalando acme-dns-certbot

Com o programa base do Certbot instalado, você pode agora 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 melhor prática, certifique-se de revisar este repositório no Github e o script antes de executá-lo. Você pode também primeiro fork este repositório e depois usar o script acme-dns-certbot.py. Esse fork fornece uma camada extra de segurança, garantindo que o script permaneça sob nosso controle e é menos suscetível a mudanças não verificadas.

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

Após o download completar, marque o script como executável:

chmod +x acme-dns-auth.py

Em seguida, edite o arquivo usando seu editor de texto preferido e ajuste a primeira linha para forçar o uso do Python 3:

nano acme-dns-auth.py

Adicione um 3 no final da primeira linha:

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

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

Uma vez concluído, salve e feche o arquivo.

Finalmente, move o script para o diretório Certbot Let’s Encrypt para que o Certbot o carregue:

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

Neste passo, você baixou e instalou o hook acme-dns-certbot. A seguir, você pode começar o processo de configuração e trabalhar para emitir seu primeiro certificado.

Passo 3 — Configurando 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 validação 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 automatizada do Certbot. Neste caso, você está emitindo um certificado bruto, em vez de instalá-lo automaticamente em um serviço.

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

Você também deve 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, o que é coberto posteriormente neste passo. Sem o argumento --debug-challenges, o Certbot não pararia, 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 você deseja usar usando os argumentos -d. Se você quiser emitir um certificado com comodo (*), certifique-se de que o asterisco (*) esteja com um backslash (\).

Após seguir os passos 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 defina os registros DNS necessários para validar a solicitação de certificado.

Se você estiver usando o DigitalOcean como seu fornecedor 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 qualquer mudança no registro seja propagada rapidamente.

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

Isto 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 um certificado com sucesso. 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 certificados adicionais 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 ter que adicionar outro registro CNAME de DNS. 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.

Por exemplo, você pode 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 à que você realizou na configuração inicial 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ê pode usar o acme-dns-certbot para emitir certificados, é bom considerar o processo de renovação também.

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

sudo certbot renew

O processo de renovação pode executar de começo ao fim 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 isso está funcionando sem ter que esperar até a data de expiração, você pode disparar uma simulação. Isso irá simular o processo de renovação sem fazer qualquer mudança real na sua configuração.

Você pode disparar uma simulação usando o comando padrão renew, mas com o argumento --dry-run:

sudo certbot renew --dry-run

Isso retornará 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 depois 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 DNS. Isso abre a possibilidade de usar certificados wildcard além de gerenciar uma grande quantidade de servidores web distintos que estão situados 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 mais recente suportada.

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 pode também ser hospedado localmente, o que pode ser vantajoso se você estiver operando em ambientes de alta segurança ou complexos.

Caso contrário, você pode explorar as detalhes técnicos do processo 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