Let's Encrypt com Nginx (A+)

Let's Encrypt com Nginx (A+)

Neste artigo vou demonstrar como instalei um certificado TLS/SSL A+ no meu blog. E o melhor de tudo, gratuito.

  • Introdução
  • O que é Let’s Encrypt?
  • Configurando a AWS - Amazon Web Services
  • Instalando o Let’s Encrypt
  • Obtendo o certificado
  • Configurando o certificado
  • Testando e validando o certificado
  • Configurando a renovação automática do certificado

Introdução

Esse artigo é uma continuação de um artigo anterior Como desenvolvi meu blog, onde eu descrevi o passo-a-passo da construção deste blog, desde a aquisição do domínio até a publicação na produção.

Eu utilizei o Jekyll para o desenvolvimento do blog. O blog está hospedado na AWS - Amazon Web Services em uma instância EC2 Ubuntu 16.04 e servindo os arquivos através do Nginx.

O objetivo desse artigo é descrever o processo que utilizei para instalar um certificado TLS/SSL no servidor que hospeda meu blog. Além de permitir uma comunicação segura para o meu blog, usar um certificado TLS/SSL me trouxe outros benefícios, como por exemplo, melhoria no ranking de buscas do Google.


O que é Let’s Encrypt?

Let’s Encrypt é uma Autoridade Certificadora (CA - Certificate Authority) que disponibiliza certificados TLS/SSL de forma fácil e gratuita. No site oficial existe uma explicação bem simples do motivo de fornecer certificados gratuitos.

“We do this because we want to create a more secure and privacy-respecting Web.” ― Let’s Encrypt

Confira as principais características do Let’s Encrypt:

  • Gratuito
  • Software Livre
  • Facilidade na instalação e renovação
  • Utiliza altos padrões de segurança na criptografia
  • É compatível com os principais browsers de mercado

Mais informações sobre o Let’s Encrypt: https://letsencrypt.org/.


Configurando a AWS - Amazon Web Services

Antes de obter o certificado, precisamos configurar as regras de Firewall na AWS.

Acesse o Console da AWS e siga os seguintes passos:

  1. Console > Services > Compute > EC2
  2. Network & Security > Security Groups > launch-wizard-1
  3. Inbound > Edit

Configure as regras conforme a imagem abaixo:

AWS Security Group - Inbound Rules
AWS Security Group - Inbound Rules

As regras acima estão configuradas da seguinte maneira:

  • HTTP permite a conexão de qualquer IPv4/IPv6 na porta 80
  • HTTPS permite a conexão de qualquer IPv4/IPv6 na porta 443
  • SSH permite a conexão apenas do meu IP na porta 22
  • All ICMP - Ipv4 permite a execução do comando ping apenas do meu IP

Reparem que para os protocolos SSH e All ICMP - IPv4 eu configurei para que apenas meu IP tenha acesso. Essa é uma importante medida de segurança que aconselho vocês a utilizarem. No campo source escolham a opção My IP para que o IP de vocês seja preenchido automaticamente. Quando o IP de vocês for alterado, é só editar as configurações novamente.


Instalando o Let’s Encrypt

Para instalar o Let’s Encrypt, precisamos conectar no nosso servidor.

$ ssh -i showmethecode.pem ubuntu@showmethecode.com.br

Antes de iniciar a instalação do Let’s Encrypt, vou atualizar o servidor com as últimas atualizações. Adquiram o hábito de manter seus sistemas operacionais sempre atualizados.

$ sudo apt-get update
$ sudo apt-get upgrade

Com o servidor atualizado, podemos iniciar a instalação do letsencrypt.

$ sudo apt-get install letsencrypt

Para validar a instalação.

$ letsencrypt -h

Pronto. Let’s Encrypt está instalado.


Obtendo o certificado

O Let’s Encrypt oferece uma variedade de maneiras de obter certificados TLS/SSL, através de plugins. Eu utilizei o plugin WebRoot para obter meus certificados. O WebRoot funciona com base em um arquivo no diretório /.well-known.

Preparando o Nginx

Antes de obter o certificado, precisamos alterar uma configuração no arquivo de configurações do Nginx para que o WebRoot possa acessar o diretório /.well-known.

Para realizar a alteração necessária, siga os seguintes passos:

  • Acesse o diretório de configurações do Nginx.
$ cd /etc/nginx/sites-available
  • Por segurança, faça uma cópia do arquivo de configurações.
$ sudo cp default backup-default
  • Edite o arquivo default.
$ sudo vim default

Aperte a tecla I para entrar no modo de inserção.

Iremos adicionar o seguinte conteúdo no arquivo de configuração padrão.

location ~ /.well-known {
        allow all;
}

Esse é o conteúdo final do arquivo default.

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name showmethecode.com.br;

        root /home/ubuntu/showmethecode;

        index index.html;

        location / {
                try_files $uri $uri/ =404;
        }

        # Inserir a configuração nesse local
        location ~ /.well-known {
                allow all;
        }
}

Quando finalizar a edição do arquivo, aperte ESC e digite :wq (W = Write / Q = Quit).

  • Teste a configuração.
$ sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  • Reinicie o Nginx.
$ sudo systemctl restart nginx

Requisitando o certificado

Para requisitar o certificado, execute o comando abaixo.

$ sudo letsencrypt certonly -a webroot --webroot-path=/var/www/html -d showmethecode.com.br --email robertoachar@gmail.com --agree-tos

–webroot-path=/var/www/html é o local onde o certificado será instalado.
-d showmethecode.com.br é o nome do domínio que será certificado.
–email robertoachar@gmail.com é o endereço de email que será associado ao certificado.

Se tudo der certo, o Let’s Encrypt exibirá a seguinte mensagem:

Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/showmethecode.com.br/fullchain.pem. Your
cert will expire on 2017-07-14. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.

Legal, nosso certificado já está adquirido e disponível para ser utilizado.

Notem que o certificado tem validade de 90 dias e será necessário renová-lo periodicamente. No final do artigo eu explicarei como configurar uma rotina para renovar o certificado automaticamente.


Configurando o certificado

Nessa etapa iremos configurar o Nginx para utilizar o certificado que acabamos de obter.

Gerando criptografia Diffie-Hellman

Para aumentar ainda mais a segurança, iremos gerar um arquivo com criptografia Diffie-Hellman. Esse processo pode levar algum tempo para ser finalizado.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Quando o processo finalizar, o arquivo estará disponível em /etc/ssl/certs/dhparam.pem.

Para mais informações sobre Diffie-Hellman: https://pt.wikipedia.org/wiki/Diffie-Hellman.

Criando os snippets para as configurações TLS/SSL

Nessa etapa iremos criar dois arquivos com as configurações TLS/SSL.

  • Acesse o diretório de snippets do Nginx.
$ cd /etc/nginx/snippets
  • Crie um snippet para informar o local dos arquivos do certificado.
$ sudo touch ssl-showmethecode-com-br.conf
  • Edite o snippet ssl-showmethecode-com-br.conf.
$ sudo vim ssl-showmethecode-com-br.conf

Aperte a tecla I para entrar no modo de inserção.

ssl_certificate /etc/letsencrypt/live/showmethecode.com.br/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/showmethecode.com.br/privkey.pem;

Quando finalizar a edição do arquivo, aperte ESC e digite :wq (W = Write / Q = Quit).

  • Crie um snippet com as configurações da criptografia.
$ sudo touch ssl-params.conf
  • Edite o snippet ssl-params.conf.

Aperte a tecla I para entrar no modo de inserção.

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

Quando finalizar a edição do arquivo, aperte ESC e digite :wq (W = Write / Q = Quit).

Alterar o arquivo de configurações do Nginx

A última etapa é informar ao Nginx onde se encontram os snippets do certificado TLS/SSL e quais serão as configurações de criptografia que serão utilizadas.

  • Acesse o diretório de configurações do Nginx.
$cd /etc/ngxin/sites-available
  • Editar o arquivo default.
$ sudo vim default

Aperte a tecla I para entrar no modo de inserção.

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name showmethecode.com.br;

        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;

        server_name showmethecode.com.br;

        include snippets/ssl-showmethecode-com-br.conf;
        include snippets/ssl-params.conf;

        root /home/ubuntu/showmethecode;

        index index.html;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ /.well-known {
                allow all;
        }
}

Quando finalizar a edição do arquivo, aperte ESC e digite :wq (W = Write / Q = Quit).

O primeiro bloco de configuração informa ao Nginx para redirecionar requisições HTTP para HTTPS. O segundo bloco importa os arquivos do certificado TLS/SSL e as configurações de criptografia.

  • Teste as alterações.
$ sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  • Reinicie o Nginx
$ sudo systemctl restart nginx

Pronto. Todas as alterações necessárias foram realizadas.


Testando e validando o certificado

Finalizamos todas as etapas necessárias para instalar o certificado TLS/SSL no nosso servidor. Agora é hora de testar e validar o certificado.

Testando o certificado

Para testar o certificado, basta navegar para o seu site.

Na imagem abaixo, mostro como o Chrome identifica sites que utilizam certificado TLS/SSL. Ele exibe um cadeado e a palavra Seguro com as cores verdes ao lado do endereço da página. Reparem que o site foi redirecionado para https.

Chrome
Chrome

Clicando em Seguro, o Chrome exibe mais algumas informações sobre a segurança da conexão.

Chrome Secure
Chrome Secure

Nessa outra imagem, podemos observar como o Safari identifica o nosso certificado.

Safari Secure
Safari Secure

Validando o certificado

Embora o certificado seja válido e confiável, existem níveis de segurança que precisam ser validados. Vamos utilizar uma ferramenta online para validar o certificado. A ferramenta utilizada será a Qualys SSL LABS.

Acesse https://www.ssllabs.com/ssltest/index.html, informe o seu domínio e clique em Submit para a ferramenta iniciar a análise.

O processo de análise pode levar algum tempo.

SSL Labs - Validando
SSL Labs - Validando

Quando o processo de análise finalizar, sua avaliação será exibida como mostra a imagem abaixo.

SSL Labs - Validado
SSL Labs - Validado

Como vocês podem notar, essas configurações receberam A+, nota máxima que um certificado TLS/SSL pode receber.


Configurando a renovação automática do certificado

O certificado tem validade de 90 dias, mas podemos renová-lo quantas vezes forem necessárias. Para isso vamos configurar uma rotina para renovar o certificado automaticamente.

Para renovar o certificado iremos utilizar o crontab, um programa que edita o arquivo onde estão especificados os comandos a serem executados pelo cron, programa que executa os comandos agendados.

  • Editando o crontab
$ sudo crontab -e

Aperte a tecla I para entrar no modo de inserção.

0 0 1 * * /usr/bin/letsencrypt renew >> /var/log/le-renew.log
5 0 1 * * /bin/systemctl reload nginx

Quando finalizar a edição do arquivo, aperte ESC e digite :wq (W = Write / Q = Quit).

A primeira instrução executa o comando no primeiro dia de todos os meses às 00h00. O comando renova o certificado e envia o resultado do comando para o arquivo /var/log/le-renew.log. A segunda instrução reinicia o Nginx no primeiro dia de todos os meses às 00h05.

Pronto. A renovação do certificado está configurada para ser realizada automaticamente.


Conclusão

É muito importante utilizar certificados TLS/SSL em nossos sites ou aplicações WEB, para elevar o nível de segurança dos mesmos. Certificados normalmente são caros, mas graças a essa iniciativa do Let’s Encrypt, podemos obter certificados de forma fácil, extremamente seguros e o melhor de tudo, grátis.

Vamos em frente!

"Talk is cheap. Show me the code." - Linus Torvalds
Roberto Achar

Sobre Roberto Achar

Roberto Achar é Full Stack Web Developer e fascinado pelo mundo Open Source. Gosta de escrever sobre Node.js, TypeScript, JavaScript e Angular. Nas horas vagas joga video-game, é marido e pai do Dudu.

Autor no iMasters

Follow @robertoachar

São Paulo, Brasil

Comentários