Cloudflare DNS e WAF + Let's Encrypt
O objetivo desse post é para descrever uma "deploy-hook" para o certbot (Certbot é uma ferramenta para obter certificados do Let`s Encrypt) que desenvolvi.
O certbot possui um plugin para integrar com a Cloudflare, porém esse atua apenas na etapa de autenticação do processo de geração do certificado. Isso é, ele apenas atua no processo de resposta do desafio para entre os servidores do Let`s Encrypt e o DNS da Cloudflare deixando para traz o processo de efetuar o deploy da chave privada e do certificado assinado na Cloudflare.
Por esse motivo criei um projeto denomidado certbot-hooks para armazenar as hooks que serão utilizadas no processo de geração de certificados. Nesse momento o projeto contém apenas uma hook denominada cloudflare-deploy.py. Abaixo vou descrever como ele funciona e a forma de utiliza-lo.
cloudflare-deploy.py
Geral
Essa hook foi criado devido à situação onde é utilizado a Cloudflare como servidor DNS e também como WAF e existe o desejo de utilizar o Let`s Encrypt para gerar um certificado para a conexão.
Então você deve utilizar a Cloudflare para autenticar o certbot usando um registro DNS (consulte o plug-in certbot-dns-cloudflare do certbot que ele é responsável por essa etapa) e também precisa configurar sua chave privada e certificado no Cloudflare. Sendo que sem essa hook essa última etapa é manual.
Essa hook foi criado com o objetivo de realizar essa ação. Publicar a chave privada e o certificado na Cloudflare.
Instalando
Clonar o repositório em algum diretório. Para esse exemplo iremos utilizar o diretório /opt fazendo com que o repositório esteja em /opt/certbot-hooks conforme exemplo abaixo.
A linha de comando a seguir vai gerar um par de chaves localmente e responder o processo de desafio dos servidores do Let`s Encrypt e posteriormente chamar a hook para realizar o deploy do arquivo na Cloudflare.
Caso tenha alguma dúvida, sugestão de melhoria no código ou até queira publicar alguma hook que desenvolveu para o projeto certbot fique a vontade para entrar em contato, criar uma Issue ou até fazer um pull request.