Certificados Let’s Encrypt Wildcard e CloudFlare – Como simplificar a nossa vida.

Olá a todos,

Como foi apresentado num post passado, existe uma Certification Authority que fornece gratuitamente certificados SSL para que os nossos sites (ou apps) possam ser SSL (https), e reconhecidos como seguros pelos browsers: A Let’s Encrypt.

Todo o procedimento é relativamente simples e relativamente fácil de efetuar, até se chegar a um cenário que envolva certificados wildcard *.dominio.com e um cloud dns provider como a Cloudflare (já falado aqui também).

Porque quererei eu fazer um certificado wildcard?

Vamos imaginar que temos bastantes sites https/ssl publicados, e que vamos ter mais, e não queremos passar sempre pelo processo de registo/aplicação/renovação do certificado.
Podemos estar a usar este certificado para servidores imaps/pop3s/smtps, e quando necessitamos de renovar o certificado, temos de publicar um site via http com esse nome e em seguida copiar o certificado gerado para um local onde o servidor de email lhe chegue.

Para resolver este problema, a let’s encrpyt decidiu permitir a utilização de certificados wildcard, e eis que o problema começa.

Para garantir tal certificado, existem processos de validação. Por exemplo, um self-executing web server dentro do certbot, uma key hexadecimal na root dir do site em questão, ou para os certificados wildcard um TXT record ao domínio em questão, que varia sempre que é feito um pedido de certificado ou renovação.

Em si, isto não tem grande problema, bastando ir a web-gui alterar na Cloudflare o dito TXT record.
Até chegar a altura da renovação que é tipicamente feita automaticamente por um programa num servidor.
Sem esta alteração do TXT record todo o processo falha.

Foi então que os senhores da Let’s Encrypt se decidiram a incluir no certbot uma forma de garantir autenticação por API na Cloudflare e o processo ficou totalmente transparente.
É este processo, e como o montar que irei  demonstrar hoje:

Existe duas formas de o fazer, ou com a versão packaged do produto, ou através da versão do git:

$ git clone https://github.com/certbot/certbot
$ cd certbot
$ sudo python setup.py install

Nota: a versão packaged do produto, que suporta a API de DNS está presente nos repositórios EPEL-Testing:

$ rpm --install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm 
$ subscription-manager repos --enable "epel-testing" --enable "rhel-*-optional-rpms" --enable "rhel-*-extras-rpms"
$ yum -y install certbot

Nota: O exemplo da versão packaged é para RHEL7/CentOS7.

Validando no nosso sistema a existência do plugin para Cloudflare:

$ certbot plugins
Saving debug log to /var/log/letsencrypt/letsencrypt.log

* apache
Description: Apache Web Server plugin - Beta
Interfaces: IAuthenticator, IInstaller, IPlugin
Entry point: apache = certbot_apache.entrypoint:ENTRYPOINT

* dns-cloudflare
Description: Obtain certificates using a DNS TXT record (if you are using
Cloudflare for DNS).
Interfaces: IAuthenticator, IPlugin
Entry point: dns-cloudflare =
certbot_dns_cloudflare.dns_cloudflare:Authenticator

* standalone
Description: Spin up a temporary webserver
Interfaces: IAuthenticator, IPlugin
Entry point: standalone = certbot.plugins.standalone:Authenticator

* webroot
Description: Place files in webroot directory
Interfaces: IAuthenticator, IPlugin
Entry point: webroot = certbot.plugins.webroot:Authenticator

Poderá se dar o caso de o plugin não estar instalado (isto sucede habitualmente na versão GIT) pelo que poderá ser instalado através do comando:

$ git clone https://github.com/certbot/certbot 
$ cd certbot
$ cd certbot-dns-cloudflare
$ sudo python setup.py install

A instalação poderá ainda ser executada através do PIP:

$ sudo pip3 install certbot-dns-cloudflare

Em seguida será necessário obter a API key – na Cloudflare – do domínio que queremos gerir pelo certbot o TXT record. É explicado como obter esta global API key aqui.

Após já termos a key (e tenham MUITO cuidado com quem tem acesso a ela) será necessário configurar o certbot para a utilizar.

Para tal criar o seguinte ficheiro:

/etc/letsencrypt/dnscloudflare.ini

E no interior dele colocar a informação obtida no passo anterior no seguinte formato:

# CloudFlare API key information
dns_cloudflare_api_key = blablablablablablabla
dns_cloudflare_email = [email protected]

Finalmente proteger o ficheiro com as nossas credenciais:

$ chmod 600 /etc/letsencrypt/dnscloudflare.ini

Chegou a altura colocar o certbot a utilizar esta configuração.
Em primeiro lugar criar o seguinte ficheiro:

/etc/letsencrypt/cli.ini

E no seu interior colocar:

# Let's Encrypt site-wide configuration
dns-cloudflare-credentials = /etc/letsencrypt/dnscloudflare.ini
# Use the ACME v2 staging URI for testing things
server = https://acme-staging-v02.api.letsencrypt.org/directory
# Production ACME v2 API endpoint
#server = https://acme-v02.api.letsencrypt.org/directory

E já está.
Podemos agora utilizar o nosso certbot para registos e updates utilizando para tal o dns plugin da Cloudflare:

$ sudo certbot certonly -d nuneshiggs.com --dns-cloudflare
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-cloudflare, Installer None
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for nuneshiggs.com
Starting new HTTPS connection (1): api.cloudflare.com
Waiting 10 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges
Starting new HTTPS connection (1): api.cloudflare.com

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/nuneshiggs.com-0001/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/nuneshiggs.com-0001/privkey.pem
Your cert will expire on 2018-10-31. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

Concluindo, para mim pelo menos, isto irá auxiliar em muito. Passarei de 40 certificados a renovar, para apenas 2 (dois domínios diferentes).
Com este método podem fazer a renovação de certificados referentes a apps não http based, sem ter de andar a fazer ginástica de levantar webservers a mão quando é necessário um renew, ou retirar sites protegidos por detrás do engine da Cloudlfare por causa do erro na validação de TLS.

E melhor que tudo, todo o processo é gratuito e poderá ser facilmente automatizado.

Claro que caso tenham duvidas, sabem onde me podem encontrar. Terei o maior prazer em vos auxiliar.

Abraço e até ao próximo post.
Nuno