TLS, certificados e HTTPS que não expira de surpresa
Objetivos desta aula
- Entender o handshake TLS
- Inspecionar certificados
- Automatizar renovação
No handshake TLS o cliente e o servidor negociam versão e cifra, o servidor apresenta a cadeia de certificados e a validação verifica assinatura, nome (SAN) e validade. Falhar em qualquer um desses pontos produz erro no navegador e, pior, erro em integrações que não têm quem clique em 'prosseguir'.
Dois erros dominam a prática: cadeia incompleta (funciona no navegador, falha em cliente HTTP) e certificado expirado. Ambos são detectáveis por comando e ambos são evitáveis por automação com renovação e alerta trinta dias antes do vencimento.
Do lado do Nginx, use TLS 1.2 e 1.3, redirecione HTTP para HTTPS, ative HSTS depois de validar o domínio inteiro e não use protocolos antigos. Terminar TLS no proxy é o padrão: o backend recebe HTTP interno e o proxy informa o esquema original via cabeçalho.
1. O que o TLS garante
TLS entrega três coisas: confidencialidade (ninguém lê no meio), integridade (ninguém altera) e autenticidade (o servidor é quem diz ser). A autenticidade vem do certificado, assinado por uma autoridade (CA) em que o sistema confia.
2. Cadeia de certificados
O servidor deve enviar o seu certificado e os intermediários (fullchain.pem). Se enviar só o certificado final, navegadores podem funcionar por cache, mas curl, apps mobile e integrações falham com 'unable to get local issuer certificate'.
3. Handshake em alto nível
O cliente envia versões e cifras suportadas e o nome desejado (SNI). O servidor escolhe, envia o certificado, ambos combinam uma chave de sessão e a comunicação passa a ser cifrada. Com TLS 1.3 isso leva uma ida e volta.
4. Let's Encrypt e renovação automática
Certificados gratuitos duram 90 dias de propósito: forçam automação. O certbot (ou o cert-manager no Kubernetes) renova sozinho a partir de 30 dias do vencimento. Seu trabalho é garantir que a renovação roda e alertar se falhar.
5. Monitorar validade
Crie um alerta para certificados com menos de 14 dias. É um dos incidentes mais evitáveis e mais constrangedores da profissão.
6. Checagem final
Você deve saber ver emissor e validade com openssl, explicar SNI e confirmar que a cadeia completa está sendo servida.
Na prática
Inspecionar certificado e renovar
bash
echo | openssl s_client -connect api.cloudshop.dev:443 -servername api.cloudshop.dev 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -ext subjectAltName
# validade em dias
END=$(echo | openssl s_client -connect api.cloudshop.dev:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
echo "expira em: $END"
sudo certbot --nginx -d api.cloudshop.dev --agree-tos -m voce@exemplo.com --non-interactive
sudo certbot renew --dry-runNota de segurança: A chave privada do certificado deve ter permissão 600 e dono root. Nunca versione /etc/letsencrypt.
Inspecionar certificado e dias restantes
bash
echo | openssl s_client -connect api.cloudshop.dev:443 -servername api.cloudshop.dev 2>/dev/null \
| openssl x509 -noout -issuer -subject -dates
# notAfter=Dec 20 12:00:00 2026 GMT <- data de expiracao
sudo certbot renew --dry-run # testa a renovacao sem alterar nada
systemctl list-timers | grep certbot # timer que renova automaticamentePor que isso importa
Certificado expirado é uma das causas mais comuns e mais evitáveis de indisponibilidade total.
Erro comum
Instalar apenas o certificado do domínio sem a cadeia intermediária.
Dica de produção
Monitore validade como métrica e alerte em 30 dias; não confie apenas no cron de renovação.
Alerta de segurança
Desative TLS 1.0/1.1 e cifras fracas; auditorias reprovam e clientes modernos já não precisam delas.
Pergunta de entrevista
Um cliente Java falha no TLS mas o navegador funciona. Qual sua hipótese principal?
Glossário
- SAN
- Subject Alternative Name: lista de domínios cobertos pelo certificado.
- HSTS
- Cabeçalho que obriga o navegador a usar HTTPS no domínio por um período.
- SNI
- Extensão TLS onde o cliente informa o nome do site, permitindo vários certificados no mesmo IP.
- fullchain
- Arquivo com o certificado do site mais os intermediários.
- ACME
- Protocolo usado pelo Let's Encrypt para emitir e renovar certificados automaticamente.
Conexão com o CloudShop
Emitir e renovar automaticamente o certificado de api.cloudshop.dev.
Quiz da aula
1. Erro de TLS só em clientes não-navegador geralmente indica:
2. curl falha com 'unable to get local issuer certificate' mas o navegador abre. Causa provável?
3. Por que certificados Let's Encrypt duram 90 dias?
Minhas anotações
Salvo automaticamente neste navegador.