terça-feira, 8 de dezembro de 2015

Servidor HTTPS gratuito e confiável - Let's Encrypt

O projeto Let's Enrypt [1] juntou grandes empresas da rede na criação de uma entidade de certificação gratuita, automática e aberta. Permitindo assim que todos os websites possam ter certificados válidos para encriptação do tráfego que geram.

Para perceber melhor o conceito, pode dizer-se que toda a navegação feita em endereços URL que utilizam apenas http:// é aberta e pode ser facilmente acedida por qualquer "pessoa" na rede.
Quando se utilizam endereços URL que começam por https:// significa que existe uma negociação automática entre o servidor e o nosso browser, que lhes permite comunicar de uma forma que toda a informação que passa na rede está encriptada e ao ser apanhada não é perceptível o que lá está.

Para que se possa confiar no servidor, há muitos anos criou-se um esquema de empresas de certificação que se responsabilizam pela validade da identidade do servidor e pela segurança e fiabilidade das chaves utilizadas. Este processo envolvia quase sempre o pagamento dos certificados.

Sempre foi possível a criação de certificados manuais, que cada administrador criava para os seus servidores, contudo como eram manuais e não havia nenhuma entidade externa a validá-los, quase todos os browsers exibem avisos que o site é potencialmente perigoso e afins. Tornando-se assim uma solução pouco aceitável para uma utilização generalizada pois, apesar de as comunicações serem muito mais seguras, os utilizadores eram alertados para os perigos de segurança do certificado não ser reconhecido...

Com o projeto Let's Encrypt, grandes empresas como a Mozilla, Cisco, Akamai, Facebook, entre muitas outras, decidiram tornar o processo de criação e atribuição de certificados para servidores muito mais rápido, fácil e económico, permitindo assim que a proteção de todas as comunicações feitas online esteja ao alcance de todos.

Instalação do cliente

Para obter e instalar o software cliente do Let's Encrypt, a forma mais rápida é através do git:
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt

Para instalar:
./letsencrypt-auto

Na documentação do projeto há imensas referências que permitem cobrir grande parte das configurações básicas [2], designados de plugins e que estão muito bem documentados.

Criação de um certificado manual

No meu caso particular tenho o tráfego HTTP (porta 80) a ir para um servidor e o HTTPS (porta 443) a ir para outro servidor. Assim, não é possível utilizar os plugins disponibilizados pelo cliente, pois este pressupõe que ambos os serviços são assegurados pela mesma máquina.

Desta forma foi instalado o cliente Let's Encrypt no servidor para HTTPS e executado como root:
./letsencrypt-auto certonly --manual

De seguida é necessário indicar o domínio alvo do certificado, podendo ser incluídos diversos domínios separados por vírgulas ou espaço, por exemplo: dominio.my.to

Depois é indicado que o nosso IP público será registado e associado ao pedido de certificado.

E são depois apresentadas algumas informações que deverão ser seguidas:
Make sure your web server displays the following content at
http://dominio.my.to/.well-known/acme-challenge/coJuntoDeL3trasENumerosMUUIIIITOOOgrande before continuing:

coJuntoDeL3trasENumerosMUUIIIITOOOgrande-876kjjhasd982134

E fica à espera que seja feito o setup necessário, após o qual devemos dar enter.

Como se pode observar pelas indicações dadas, o serviço do Let's Encrypt vai tentar aceder a um ficheiro em HTTP no mesmo domínio, assim é necessário criar as pastas necessários no servidor HTTP e criar o ficheiro indicado com o conteúdo pretendido:
mkdir -p /var/www/html/.well-known/acme-challenge
printf "%s" coJuntoDeL3trasENumerosMUUIIIITOOOgrande-876kjjhasd982134 > /var/www/html/.well-known/acme-challenge/coJuntoDeL3trasENumerosMUUIIIITOOOgrande

Para testar deve abrir-se o browser o endereço http://dominio.my.to/.well-known/acme-challenge/coJuntoDeL3trasENumerosMUUIIIITOOOgrande e verificar se aparece o texto pretendido:
coJuntoDeL3trasENumerosMUUIIIITOOOgrande-876kjjhasd982134

Quando isto estiver pronto, resta voltar ao cliente do Let's Encrypt e finalizar com enter e, caso tudo corra bem, aparecerá a seguinte informação:
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/dominio.my.to/fullchain.pem. Your cert will
   expire on 2016-03-07. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If like Let's Encrypt, please consider supporting our work by:

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

Configuração do apache para o certificado Let's Encrypt

Agora que existe um certificado válido, resta alterar a configuração do apache para que utilize este novo certificado.
Os certificados estão disponíveis em /etc/letsencrypt/live/dominio.my.to/ e explicados na documentação [3].

No ficheiro de configuração do HTTPS no apache, por exemplo, /etc/apache2/sites-available/default-ssl.conf, deverão ser refletidos os novos certificados:
####Configuration for SSL #####
SSLEngine on
# LET'S ENCRYPT
SSLCertificateFile /etc/letsencrypt/live/dominio.my.to/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/dominio.my.to/privkey.pem
#### End of SSL Configuration ####

De seguida resta reiniciar o apache e começar a utilizar o novo certificado válido
service apache2 restart

Ao aceder ao serviço HTTPS no browser já será apresentado como seguro sem as mensagens normais que o certificado não é válido.



[1] - https://letsencrypt.org/
[2] - https://letsencrypt.readthedocs.org/en/latest/using.html#installation
[3] - https://letsencrypt.readthedocs.org/en/latest/using.html#where-are-my-certificates

Sem comentários:

Enviar um comentário