← Voltar para Documentação

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:

RegistroValorQuando usar
AIPv4 do servidorSempre
AAAAIPv6 do servidorSó se o IPv6 estiver realmente servindo tráfego
CNAMEoutro nome (ex.: exemplo.com.br)Subdomínio que deve seguir o principal, como www
CAAautoridade permitidaOpcional, 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 +short

A 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-nginx

Antes 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 nginx

Faç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.br

Se passou, repita sem --test-cert para valer:

sudo certbot --nginx -d exemplo.com.br -d www.exemplo.com.br

O 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-run

O --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

SintomaCausa provável
Timeout during connect na validaçãoPorta 80 fechada no firewall, ou AAAA apontando para IPv6 inativo
unauthorized / 404 no challengeserver_name não cobre o domínio pedido, ou o root está errado
Navegador acusa certificado inválido só em wwwO certificado foi emitido sem -d www.exemplo.com.br
too many certificates already issuedLimite semanal atingido por tentativas repetidas em produção; use --test-cert
Site funciona pelo IP, não pelo nomeDNS 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.

Não resolveu?

Nosso suporte é humano e em português. Se este guia não cobriu o seu caso, fale com a gente.

Falar com o suporte →