Automatizemos a renovação de certificados Let's Encrypt para acalmar o meu TOC

Vocês já devem ter percebido que eu tenho um TOC e que este TOC é relacionado com a reprodutibilidade das configurações. Sempre que eu configuro algo no sistema, eu penso: "E se eu precisar de fazer isto de novo amanhã, será que eu vou me lembrar de todos os passos?". Pelo visto, não é só TOC não, tem também um pouco de Mal de Alzheimer precoce por aí. Ah, e eu já contei para vocês que eu tenho um TOC?

Bom, vamos ao que interessa. Há alguns meses, o Leandro Leão instalou o certificado da Let's Encrypt na VM www.cefala.org, tudo muito bem explicado em outro artigo deste blog. Como este certificado expira de três em três meses, o Leandro criou um script de renovação automática e adicionou uma linha na crontab do usuário root. Aí, me bateu aquele TOC e eu decidi automatizar o processo usando Git, make e systemd.

Antes de mais nada, deixe-me justificar a mudança do crontab para o systemd. Apesar de não ter ainda aprovação unânime na comunidade de software livre, o systemd já se tornou o substituto por default do sysvinit nas principais distribuições GNU/Linux (Debian, Fedora, Arch, CoreOS, etc.). Mais especificamente com relação ao assunto do presente artigo, o systemd permite um controle mais fino de tarefas periódicas do que o crontab, além de integrar automaticamente o log das tarefas. Tem gente por aí que já explicou direitinho como migrar do crontab ao systemd.

Pois bem, eu criei assim um repositório Git para esta configuração específica do Let's Encrypt na VM www.cefala.org. Basta então fazer:

$ git clone cefala-admin@git.cefala.org:/var/git/cefala-admin/letsencrypt-www 
$ cd letsencrypt-www
$ sudo make

Com estes comandos, o script .sh de renovação automática é instalado em /usr/local/sbin e os arquivos .service e .timer são instalados e inicializados para o systemd. O script de renovação escrito pelo Leandro usa o comando renew do programa letsencrypt. Um novo certificado TLS só é obtido se o certificado corrente for vencer em menos de 30 dias. Graças ao timer do systemd, este script rodará todos os dias de madrugada na VM www.cefala.org.

Uma das coisas legais no systemd é que não é preciso se preocupar com o arquivo de log, pois fica tudo registrado automaticamente no /var/log/syslog, o que pode ser consultado com journalctl ou com o seguinte comando:

$ sudo systemctl status letsencrypt-renew-tls-certs.service

Ufa, consegui acalmar o meu TOC!

Update: No fim das contas, me toquei que o sisteminha que escrevi é genérico o suficiente para ser útil a outras pessoas. Coloquei-o então no GitHub. Você pode cloná-lo desta maneira:

$ git clone https://github.com/rlaboiss/letsencrypt-systemd.git

social