HTTPS Gratuito com Certbot no Nginx

Seu site roda bem no Nginx, o DNS aponta para onde deve, a porta 80 está aberta, e mesmo assim o navegador ainda coloca um “Não seguro” do lado do seu domínio. Os visitantes veem, você vê, e parece um julgamento. Antigamente, resolver isso significava comprar um certificado de alguma autoridade e instalar na mão. Este post coloca HTTPS rodando em app1.domain.com de graça, em uns dois minutos, usando o Certbot.

TL;DR: Instale o Certbot, emita um certificado SSL gratuito para um domínio e deixe o Nginx servir HTTPS com renovação automática.
Stack: Ubuntu, Nginx, Certbot, Let’s Encrypt, ACME
Nível: Iniciante
Tempo de leitura: ~4 min

Eu costumava tratar o HTTPS como aquela tarefa chata que adiava para o dia do lançamento, e aí passava a manhã do lançamento brigando com flags do OpenSSL em vez de colocar a coisa no ar. Na primeira vez que rodei o Certbot e vi ele editar meu config do Nginx e adicionar o redirect sozinho, me senti levemente roubado de uma luta da qual eu tinha ficado dependente. Mas que bom que foi.

Entendendo os dois papéis

Antes de qualquer comando, entenda isso, porque as pessoas confundem o tempo todo. O Let’s Encrypt é a autoridade certificadora: ela realmente emite e assina o certificado. O Certbot é o cliente rodando no seu servidor: ele pede o certificado, prova que você controla o domínio, instala e configura o Nginx. Um é o cartório, o outro é o assistente que fica na fila por você.

Os dois se comunicam por um protocolo chamado ACME. O Certbot coloca um arquivo específico no seu domínio, o Let’s Encrypt tenta buscá-lo pela internet, e se conseguir, confirma que você é o dono e emite o certificado. É por isso que o DNS precisa resolver corretamente e a porta 80 precisa estar aberta antes de começar. A sigla significa Automatic Certificate Management Environment e é um padrão real de internet (RFC 8555), o trocadilho com Looney Tunes foi proposital mesmo.

Instalando no Ubuntu

Instale o Certbot junto com o plugin do Nginx. O plugin é o que lê e reescreve o seu config do Nginx, para você não precisar editar blocos de servidor às cegas.

sudo apt update
sudo apt install certbot python3-certbot-nginx -y

Confirmando que o Nginx responde pelo domínio

O Certbot valida o domínio ao vivo, então o app1.domain.com já precisa resolver para este servidor e ter um bloco de servidor escutando na porta 80. Verificação rápida:

sudo nginx -t
curl -I http://app1.domain.com

Se o nginx -t estiver feliz e o curl retornar uma resposta deste servidor, você está pronto.

Emitindo o certificado

Um único comando faz todo o processo: validação, emissão e reescrita do config.

sudo certbot --nginx -d app1.domain.com

Ele vai pedir um e-mail (para avisos de expiração), os termos, e se você quer redirecionar HTTP para HTTPS. Diga sim ao redirect. Nos bastidores, o Certbot roda o desafio ACME, pega o certificado assinado, edita o bloco do servidor para escutar na porta 443 e cria o redirect 301 do HTTP. Os arquivos de certificado ficam em /etc/letsencrypt.

A questão dos 90 dias, e por que isso não é problema

Certificados do Let’s Encrypt expiram em 90 dias, bem menos que os pagos que duram um ano ou mais. Isso é intencional: prazos curtos limitam o estrago caso uma chave vaze, e obrigam todo mundo a automatizar em vez de renovar na mão uma vez por ano e esquecer. O Certbot instala um timer do systemd que renova silenciosamente antes do vencimento. Confirme que funciona sem tocar em nada de verdade:

sudo certbot renew --dry-run

Se passar, está feito. A renovação roda sozinha daqui pra frente.

O que você fez

Você instalou o Certbot e o plugin do Nginx, confirmou que o Nginx servia o app1.domain.com na porta 80, emitiu um certificado gratuito do Let’s Encrypt pelo desafio ACME e deixou o Certbot reescrever o config para servir HTTPS com redirect automático. O cadeado está no ar, e o timer de renovação garante que o você do futuro nunca mais precise pensar nisso. O navegador parou de te julgar.

Próximos passos

  • Adicione mais domínios: Passe flags -d extras (-d app1.domain.com -d www.app1.domain.com) para cobrir vários nomes em um único certificado.
  • Inspecione o que você obteve: Rode sudo certbot certificates para listar os certificados emitidos, seus domínios e datas de expiração.
  • Fortaleça a config do TLS: Ajuste os ciphers e habilite o HSTS no Nginx quando o básico estiver funcionando, depois teste o resultado no SSL Labs.

Dúvidas ou feedback? Me encontre no LinkedIn ou GitHub.

Deixe um comentário