Apontar um domínio e emitir certificado SSL
Do registro DNS ao HTTPS válido com Let's Encrypt, incluindo a renovação automática e os erros mais comuns.
Atualizado em
Colocar um domínio no ar são duas coisas separadas, e confundi-las é a origem de quase todo problema. Primeiro o DNS: fazer o nome apontar para o IP do seu servidor. Depois o certificado: provar para uma autoridade certificadora que aquele nome é seu, e receber um certificado que o navegador aceita. O certificado só pode ser emitido depois que o DNS já resolve, porque a validação passa pelo próprio domínio.
Antes de tocar no DNS
Tenha o servidor pronto para responder. Isso significa uma VPS ativa com IP público (veja criar sua primeira VPS), acesso por SSH funcionando, e um servidor web instalado e escutando.
Confirme quem está nas portas 80 e 443:
sudo ss -tlnp | grep -E ':80|:443'As duas portas precisam estar abertas na entrada, tanto no firewall do sistema quanto nas regras de firewall da rede. A porta 80 não é opcional mesmo que você só queira HTTPS: a validação padrão do Let's Encrypt acontece em HTTP na porta 80, e a renovação vai precisar dela de novo a cada 60 dias.
Os registros que importam
O painel do seu registrador (Registro.br, ou onde o domínio foi comprado) é onde você edita a zona. Os registros relevantes:
| Registro | Valor | Quando usar |
|---|---|---|
A | IPv4 do servidor | Sempre |
AAAA | IPv6 do servidor | Só se o IPv6 estiver realmente servindo tráfego |
CNAME | outro nome (ex.: exemplo.com.br) | Subdomínio que deve seguir o principal, como www |
CAA | autoridade permitida | Opcional, restringe quem pode emitir certificado |
Um par típico para um site: A em exemplo.com.br apontando para o IP, e CNAME em www apontando para exemplo.com.br. Não crie CNAME na raiz do domínio — isso viola o padrão e a maioria dos provedores recusa.
Baixe o TTL para 300 segundos antes de mudanças e suba depois que estabilizar. Com TTL de 86400 você espera um dia para corrigir um erro de digitação.
Se você usa Floating IP
Aponte o DNS para o Floating IP, não para o IP fixo da máquina. Assim, quando precisar trocar de servidor, você move o IP entre as VMs e o domínio acompanha na hora, sem depender de propagação de DNS. É a diferença entre uma migração de minutos e uma de horas.
Verificar a resolução
Não confie no navegador, que tem cache próprio. Consulte direto:
dig +short A exemplo.com.br
dig +short AAAA exemplo.com.br
dig +short A www.exemplo.com.br @8.8.8.8
dig NS exemplo.com.br +shortA consulta com @8.8.8.8 mostra o que um resolver de fora está vendo. A consulta NS confirma que você editou a zona nos servidores autoritativos certos — se o domínio usa os nameservers de outro provedor, editar a zona no registrador não tem efeito nenhum.
Um cuidado sério com AAAA: se existe registro IPv6, o Let's Encrypt tenta o IPv6 primeiro e não faz fallback para IPv4 quando a conexão é recusada. Um AAAA apontando para um endereço que o servidor não está escutando derruba a validação inteira, mesmo com o IPv4 perfeito. Ou o IPv6 funciona de verdade, ou o registro não existe.
Emitir o certificado
Com o DNS resolvendo, instale o certbot. No Debian ou Ubuntu:
sudo apt update
sudo apt install certbot python3-certbot-nginxAntes de emitir, o servidor web precisa reconhecer o domínio. No nginx, o server_name tem que conter exatamente os nomes que você vai pedir:
server {
listen 80;
listen [::]:80;
server_name exemplo.com.br www.exemplo.com.br;
root /var/www/exemplo;
}Recarregue e teste a configuração:
sudo nginx -t && sudo systemctl reload nginxFaça uma emissão de teste primeiro. O ambiente de staging do Let's Encrypt tem limites folgados e não gasta sua cota:
sudo certbot --nginx --test-cert -d exemplo.com.br -d www.exemplo.com.brSe passou, repita sem --test-cert para valer:
sudo certbot --nginx -d exemplo.com.br -d www.exemplo.com.brO plugin --nginx edita seu arquivo de configuração para adicionar o bloco 443 e o redirecionamento. Se você prefere manter o controle da configuração, use certbot certonly --webroot -w /var/www/exemplo -d exemplo.com.br e escreva o bloco TLS à mão. Os arquivos ficam em /etc/letsencrypt/live/exemplo.com.br/ — aponte para fullchain.pem e privkey.pem, sempre por esse caminho, que é um link simbólico atualizado a cada renovação. Copiar os arquivos para outro lugar significa servir um certificado expirado dois meses depois.
Renovação automática
O certificado dura 90 dias. O pacote do certbot já instala um timer que tenta renovar duas vezes por dia e só age quando falta menos de 30 dias. Confirme que ele existe:
systemctl list-timers | grep certbot
sudo certbot renew --dry-runO --dry-run executa o fluxo real contra o staging. Se ele passa hoje, a renovação de daqui a dois meses tende a passar também — desde que a porta 80 continue aberta e o DNS continue apontando para a mesma máquina. Quando você troca de servidor, refaça esse teste no novo host.
Erros comuns
| Sintoma | Causa provável |
|---|---|
Timeout during connect na validação | Porta 80 fechada no firewall, ou AAAA apontando para IPv6 inativo |
unauthorized / 404 no challenge | server_name não cobre o domínio pedido, ou o root está errado |
Navegador acusa certificado inválido só em www | O certificado foi emitido sem -d www.exemplo.com.br |
too many certificates already issued | Limite semanal atingido por tentativas repetidas em produção; use --test-cert |
| Site funciona pelo IP, não pelo nome | DNS ainda não propagou, ou a zona foi editada fora dos nameservers autoritativos |
Se o servidor já está em produção e você vai reescrever a configuração do nginx para adicionar TLS, tire um snapshot antes da mudança. Uma configuração inválida derruba o site inteiro no reload, e voltar ao estado anterior é mais rápido do que depurar às pressas.