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