Certificado SSL gratuito com Let’s Encrypt no Nginx em 4 passos

Certificado SSL gratuito com Let’s Encrypt no Nginx em 4 passos

A Let’s Encrypt é uma autoridade de certificação que oferece uma forma simples de obter e instalar certificados TLS/SSL gratuitos, o que permite cifrar os pedidos HTTPS nos teus servidores web. Simplifica o processo com um programa chamado Certbot, que tenta automatizar a maior parte das etapas necessárias. Convém saber que a Google, com o seu browser Chrome, quer avisar todos os utilizadores sobre os sites não seguros, o que pode ter impacto no teu posicionamento.

Neste tutorial vou mostrar-te como usar o Let’s Encrypt para obter um certificado SSL gratuito para o Nginx em Ubuntu 14.04. Mostro também como renovar automaticamente o certificado (um certificado Let’s Encrypt só é válido durante 90 dias!).

Passo 1, Instalar o Certbot

O que é o Certbot? O Certbot ativa automaticamente o HTTPS no teu site, instalando os certificados Let’s Encrypt. Se não usas Nginx ou Ubuntu 14.04, dá uma vista de olhos no site deles, onde é explicado o procedimento a seguir em cada sistema para gerar certificados SSL com o Let’s Encrypt.

Vamos começar por descarregar o Certbot para a pasta /usr/local/sbin:

code
cd /usr/local/sbin
wget https://dl.eff.org/certbot-auto

Não te esqueças de tornar o ficheiro executável:

code
chmod a+x /usr/local/sbin/certbot-auto

Passo 2, Obter um certificado

Para garantir que o diretório fica acessível ao Certbot, vamos alterar rapidamente a configuração do Nginx. Por omissão, está em /etc/nginx/sites-available/default. Aqui uso o nano para a editar, mas podes usar o editor que quiseres:

code
nano /etc/nginx/sites-available/default

Dentro do bloco server, acrescenta:

code
server {

#votre configuration ...

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

}

Vais precisar da pasta pública do teu site. Se usares o ficheiro de configuração predefinido, a pasta pública é /usr/share/nginx/html, se usares Laravel, /path/to/public/.
Confirma que não há erros.

code
nginx -t

Se estiver tudo bem, reinicia o Nginx:

code
service nginx restart

Passo 3, Configurar TLS/SSL no servidor nginx

Agora que sabemos qual é o caminho público, podemos usar o plugin Webroot para pedir um certificado SSL. Aqui indicamos também os nomes de domínio com a opção -d. Se quiseres que um certificado funcione com vários domínios (por exemplo, exemplo.com e www.exemplo.com), não te esqueças de os incluir todos, a começar pelo domínio de nível mais alto (neste caso, exemplo.com). Garante ainda que substituis as partes destacadas pelo caminho webroot correto e pelos teus nomes de domínio:

code
certbot-auto certonly -a webroot --webroot-path=/votre/chemin/public -d exemple.com -d www.exemple.com

O Certbot vai fazer-te várias perguntas, entre elas o teu endereço de email, que serve para te avisar quando o certificado estiver quase a expirar, mais à frente vemos como renová-lo automaticamente.

Os certificados

Depois de obteres o certificado, ficas com os seguintes ficheiros:

  • cert.pem: o certificado do teu domínio
  • chain.pem: o certificado da Let’s Encrypt
  • fullchain.pem: o cert.pem e o chain.pem juntos
  • privkey.pem: a chave privada do certificado.

Estes ficheiros ficam num subdiretório de /etc/letsencrypt/archive. No entanto, o cliente Let’s Encrypt cria ligações simbólicas para os certificados mais recentes no diretório /etc/letsencrypt/live/votre_nom_de_domaine. Como as ligações apontam sempre para os certificados mais recentes, é este o caminho que deves usar para referenciar o certificado em vigor.

Gerar uma chave Diffie-Hellman

Para reforçar ainda mais a segurança, deves também gerar uma chave Diffie-Hellman de 2048 bits:

code
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Demora alguns minutos, mas no fim ficas com o teu ficheiro DH em /etc/ssl/certs/dhparam.pem.

Agora que já tens o certificado SSL, falta configurar o servidor Nginx para o usar.
Vamos começar por voltar a editar o bloco server:

code
nano /etc/nginx/sites-available/default

Apagamos (ou comentamos) as linhas seguintes, que servem para escutar o porto 80 dos pedidos HTTP:

code
#listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;

Para passar a escutar o porto 443, do HTTPS:

code
listen 443 ssl;

Acrescentamos também ao bloco server a ligação simbólica que criámos e que aponta para os certificados gerados com o comando certbot-auto:

code
ssl_certificate /etc/letsencrypt/live/exemple.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/exemple.com/privkey.pem;

Juntamos a configuração SSL predefinida do servidor:

code
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

Por fim, fora do bloco server principal, acrescenta este novo bloco para redirecionar o HTTP (porto 80) para HTTPS (porto 443).

code
server {
    listen 80;
    listen [::]:80;
    server_name exemple.com www.exemple.com;
    return 301 https://$host$request_uri;
}

Verifica se há erros na configuração:

code
nginx -t

Depois reinicia o servidor nginx:

code
service nginx restart

Passo 4, Renovação automática do certificado

Como disse no início do artigo, os certificados SSL expiram ao fim de 90 dias, por isso é preciso renová-los, e, se nos esquecermos, chega um email antes de o certificado Let’s Encrypt expirar.

Para o renovar automaticamente, acrescentamos o comando certbot-auto renew às tarefas CRON do servidor.

code
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log
35 2 * * 1 /etc/init.d/nginx reload

Todas as segundas-feiras, às 2h30, o certificado é renovado e, às 2h35, o servidor nginx é recarregado.

Conclusão

Já tens o teu servidor web com um certificado SSL reconhecido, emitido pela Let’s Encrypt! É uma boa alternativa aos certificados pagos. Muitos alojamentos, como a OVH, oferecem SSL gratuito graças ao Let’s Encrypt. E é interessante saber que a Google vai empurrando, aos poucos, todos os sites para HTTPS.

fonte: digitalocean.com & wikipedia.org

···

Damien Flandrin Programador web desde 2010, criador da Gekkode e do Email Impact. Cada artigo é testado num projeto real antes de ser publicado. Contacto
Newsletter

Os novos testes, tutoriais e projetos, por e-mail.

Testes reproduzíveis, código versionado, resultados datados. Nunca spam.