Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

02 - SSL-TLS (Certificados, ACM)

#acm#certificados#https#tls
video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

SSL-TLS (Certificados, ACM)

TLS, sucessor direto do antigo SSL, é o protocolo criptográfico que protege a comunicação entre clientes e serviços, garantindo confidencialidade, integridade e autenticação de servidor em toda requisição de produção. Em arquiteturas web, HTTPS sobre TLS é requisito inegociável, não apenas por proteção de dados sensíveis, mas porque navegadores, balanceadores modernos e protocolos como HTTP/2 e HTTP/3 dependem dele para funcionar. O lado operacional do TLS gira em torno de certificados, sua cadeia de confiança, sua expiração e sua renovação, e é exatamente nesse ponto que a maioria dos incidentes de certificado acontece. Ferramentas como AWS Certificate Manager, Let's Encrypt e certbot automatizaram o ciclo de vida e transformaram a renovação manual em anti-padrão. Um time que domina TLS em produção garante cifras modernas, expiração sem sustos e terminação no ponto certo da arquitetura.

O problema que o TLS resolve

Sem criptografia de transporte, todo tráfego é legível e modificável por qualquer ponto da rede intermediária, do Wi-Fi público ao roteador comprometido, expondo credenciais, tokens de sessão e dados pessoais. O TLS resolve três problemas de uma vez: confidencialidade, com cifra do conteúdo; integridade, com detecção de qualquer alteração no caminho; e autenticidade, com o certificado provando que o servidor é quem afirma ser. Em produção há um problema adicional de disciplina: certificados expiram, e um certificado vencido derruba o serviço para todos os clientes com a mesma eficiência de uma falha de rede. Por isso o tema envolve tanto a criptografia em si quanto o ciclo de vida automatizado dos certificados, que é o que impede o incidente previsível de expiração.

Há também a dimensão de confiança de terceiros: APIs, navegadores e gateways de pagamento exigem HTTPS em endpoints de integração, e cadeias ou cifras inaceitáveis bloqueiam integrações comerciais antes de qualquer análise técnica. O TLS, nesse sentido, funciona como requisito de interoperação do ecossistema web, e não apenas como proteção.

Handshake TLS 1.3

O handshake é a negociação inicial em que cliente e servidor estabelecem as chaves de sessão e se autenticam. O TLS 1.3 reduziu o processo para um único round trip, eliminando algoritmos antigos e tornando a negociação mais rápida e mais segura por construção. O fluxo resumido funciona assim: o cliente envia um ClientHello com o conjunto de cifras suportadas e seu compartilhamento de chaves; o servidor responde com a escolha de parâmetros, o certificado e o compartilhamento próprio; ambos derivam a mesma chave de sessão e trocam mensagens de confirmação autenticadas. Duas consequências práticas merecem destaque: a ordem de preferência de cifras passa a ser respeitada pelo servidor por padrão, e o modo de retomada com zero round trip, o 0-RTT, permite reuso de sessão com ressalva de replay, o que exige cuidado em operações não idempotentes. Por esses motivos, exigir TLS 1.3 com fallback para TLS 1.2 é o padrão de configuração atual.

Na comparação com o TLS 1.2, o ganho do 1.3 vai além da latência: a negociação passou a não permitir cifra sem sigilo à frente, os dados de handshake após o ServerHello passaram a ser cifrados, e a lista de extensões aceitáveis encolheu, reduzindo a superfície de downgrade conhecida da versão anterior.

Certificados e cadeia de confiança

Um certificado é um documento assinado por uma autoridade certificadora, a CA, que liga uma identidade, o domínio, a uma chave pública, com validade definida. A confiança funciona em cadeia: o certificado do servidor é assinado por um certificado intermediário, que por sua vez é assinado pela raiz, pré-instalada nos navegadores e sistemas operacionais. O servidor deve apresentar a cadeia completa, incluindo os intermediários, e a ausência desse encadeamento é a causa mais comum do erro "certificado inválido" em dispositivos móveis, que resolvem menos cadeias incompletas que desktops.

Elemento Papel Onde vive Risco associado
Certificado raiz Âncora de confiança da CA Navegadores e sistemas operacionais Comprometimento afeta tudo que a CA emite
Intermediário Assina certificados finais em nome da raiz Servidor e cadeia de entrega Deve ser incluído na entrega da cadeia
Certificado de servidor Autentica o domínio específico Servidor ou balanceador Expiração derruba o serviço
OCSP stapling Status de revogação embutido na resposta Servidor Falha afeta verificação de revogação

O diagnóstico de cadeia é rotina de operação e o OpenSSL resolve em uma linha, mostrando profundidade, emissor e validade de cada elo, como no comando openssl s_client -connect dominio.com:443 -servername dominio.com. Erros de cadeia incompleta aparecem com frequência após migração de provedor de certificado, quando o intermediário novo não foi incluído na configuração.

A extensão SNI, Server Name Indication, também pertence a essa discussão, porque é o campo que permite a um mesmo endereço servir múltiplos certificados de domínios diferentes, base da hospedagem moderna e de terminações em balanceadores com centenas de domínios. Em configurações de alta densidade, a correspondência entre domínio solicitado e certificado servido deve ser testada explicitamente, pois associação incorreta de certificado é erro silencioso que só aparece como warning no cliente.

Let's Encrypt e renovação automática

Let's Encrypt popularizou a emissão gratuita e automatizada de certificados com o protocolo ACME, em que o cliente prova o controle do domínio por desafio HTTP ou DNS e recebe certificado de vida curta, hoje de trinta dias para certificados comuns. A vida curta é proposital: com renovação automática a cada dois terços do prazo, a janela de exposição de um comprometimento encolhe e a operação manual deixa de existir. A implantação típica usa certbot ou o gerenciador cert-manager no Kubernetes, com verificação periódica e renovação quando o prazo restante cai abaixo do limiar.

# Renovação automática com certbot via desafio HTTP
certbot certonly --webroot -w /var/www/certbot \
    -d aplicacao.com.br -d www.aplicacao.com.br \
    --email ops@aplicacao.com.br --agree-tos --non-interactive

# Verificação de expiração com renovação somente quando necessário
certbot renew --dry-run          # Valida a configuração sem emitir
systemctl status certbot.timer   # Timer de renovação ativo no sistema

O requisito operacional central é que o processo de renovação também faça o recarregamento do serviço que consome o certificado, com hook pós-renovação executando reload do Nginx ou reinício controlado do contêiner, caso contrário o arquivo novo fica no disco e o serviço continua servindo o antigo até o próximo restart.

A validação do controle do domínio merece atenção especial em infraestrutura grande. O desafio DNS-01, baseado em registro TXT provisório, escala melhor que o desafio HTTP em cenários com milhares de domínios e com origens não expostas à internet, e é o caminho usado pelo cert-manager em Kubernetes. A credencial usada pelo cliente ACME deve ser limitada apenas à zona de DNS necessária, porque um segredo com permissão ampla de DNS converte o próprio sistema de renovação em risco.

ACM com ALB e CloudFront

Na AWS, o ACM elimina a operação de emissão e renovação para certificados usados em serviços gerenciados. O fluxo é criar ou importar o certificado, validar o domínio por DNS, adicionando os registros CNAME indicados, e anexar o certificado ao ALB, ao CloudFront ou ao API Gateway; a partir daí a renovação é automática e transparente. Dois detalhes de arquitetura são decisivos. Certificados ACM para CloudFront precisam residir na região us-east-1, independentemente da região da aplicação, o que é fonte clássica de confusão. E o certificado só é gratuito quando usado por serviço integrado; certificados de EC2, contêineres e serviços não gerenciados exigem caminho alternativo, como ACM Private CA ou Let's Encrypt no próprio host.

A terminação de TLS também é uma decisão de arquitetura. O padrão comum termina o TLS no CloudFront e no ALB, com a conexão interna para os targets reagrupada em HTTP simples dentro de rede privada, ou reencriptada de ponta a ponta quando requisitos de compliance exigem. Reencriptação completa custa latência e complexidade de gestão de certificados internos, e a decisão deve seguir o requisito regulatório real, não preferência estética de segurança.

A combinação CloudFront com ACM entrega ainda um benefício de observabilidade: a distribuição expõe métricas de erros de handshake e de versões de TLS negociadas, permitindo medir a base de clientes antigos antes de endurecer a política. Essa medição transforma decisões de segurança em escolhas informadas, com dado real de quem ainda depende de cada protocolo.

# Listener HTTPS de um ALB apontando para o certificado do ACM
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
  LoadBalancerArn: !Ref CheckoutALB
  Port: 443
  Protocol: HTTPS
  SslPolicy: ELBSecurityPolicy-TLS13-1-2-2021-06   # TLS 1.3 com fallback 1.2
  Certificates:
    - CertificateArn: !Ref CheckoutCertificate    # Emitido e renovado pelo ACM
  DefaultActions:
    - Type: forward
      TargetGroupArn: !Ref CheckoutTargets

HSTS e políticas de transporte

O HSTS, Strict Transport Security, é o header que instrui o navegador a recusar HTTP para o domínio, mesmo que o usuário digite a URL em texto puro, eliminando a janela de redirecionamento explorável por ataques de downgrade. A política carrega tempo de vida em segundos, escopo de subdomínios e a opção de inclusão em preload, que registra o domínio na lista compilada nos navegadores; entrar na preload é compromisso de longo prazo, pois a saída é lenta e falhas de TLS passam a bloquear completamente o acesso.

# Nginx: HSTS com um ano, incluindo subdomínios, sem preload inicial
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

# Redirecionamento de HTTP para HTTPS deve ser canônico e simples
server {
    listen 80;
    server_name aplicacao.com.br;
    return 301 https://$host$request_uri;
}

A recomendação é adotar HSTS com prazo crescente, começar sem includeSubDomains até confirmar que todos os subdomínios servem HTTPS, e considerar preload apenas em domínios maduros, porque erros de configuração com preload se tornam indisponibilidade prolongada.

Cipher suites modernos

A política de cifras define quais algoritmos o servidor aceita, e a configuração moderna segue princípio de restrição: TLS 1.3 com AES-256-GCM, AES-128-GCM e ChaCha20-Poly1305, com key exchange exclusivamente ECDHE, e TLS 1.2 restrito a ECDHE com cifras AEAD, eliminando CBC e todo modo estático de chave RSA. Cipher suites legados existem apenas como fallback de compatibilidade para clientes antigos, e cada exceção abre superfície de ataque; a prática de segurança moderna é medir quem ainda precisa do fallback, por meio de logs de handshake rejeitado, e reduzir essa base até poder desativá-la. Ferramentas de avaliação externa pontuam a configuração e servem como verificação contínua da política.

TLS interno e mTLS

A discussão de TLS não termina na borda. Entre serviços, o mTLS, mutual TLS, adiciona autenticação de cliente ao handshake, de forma que ambos os lados apresentem certificado, criando identidade verificável de workload e criptografia de ponta a ponta dentro da malha. Service meshes como Istio e Linkerd implementam mTLS automaticamente, emitindo certificados de vida curta para cada pod e renovando sem intervenção, o que viabiliza a prática em escala. O ganho combina defesa em profundidade contra movimento lateral de atacantes com um mecanismo de autorização baseado em identidade: uma política pode permitir que apenas o serviço de checkout chame o serviço de pagamento, independentemente do IP. Em ambientes sem malha de serviços, o mesmo efeito exige gestão manual de certificados de cliente, e é por isso que a adoção de mTLS costuma acompanhar a adoção da malha.

A adoção progressiva costuma operar em modo permissivo primeiro, onde o mTLS é negociado quando ambos os lados suportam, e só depois em modo estrito, que rejeita tráfego sem certificado. Essa migração em duas fases evita quebra de integrações legadas e dá tempo para instrumentar exceções documentadas.

Erros comuns

Os incidentes abaixo se repetem em ambientes de todos os tamanhos.

  • Expiração de certificado sem alerta, com o serviço fora do ar por descuido previsível, geralmente em domínio secundário esquecido.
  • Cadeia incompleta entregue pelo servidor, funcionando em desktops e falhando em dispositivos móveis e integrações.
  • Certificado ACM criado na região errada para o CloudFront, bloqueando a associação na distribuição.
  • Renovação automática que emite o certificado mas não recarrega o serviço, mantendo o arquivo antigo em memória.
  • Configuração de TLS com cifras fracas herdadas de template antigo, detectada apenas em avaliação externa ou pentest.
  • Domínios adicionados a certificado wildcard sem análise, ampliando o raio de comprometimento de uma única chave privada.
  • Ambiente interno com TLS desativado por conveniência, permitindo movimento lateral não cifrado dentro da rede privada.

Boas práticas

As práticas abaixo consolidam a operação madura de TLS em produção.

  • Automatize todo o ciclo de vida de certificados, com ACM para serviços gerenciados e cert-manager ou certbot para o resto, sem renovação manual em nenhum ponto.
  • Configure alertas de expiração com folga maior que o ciclo de renovação, monitorando certificados por telemetria externa, e não apenas pelo confinamento do servidor.
  • Adote TLS 1.3 como política primária com fallback controlado para 1.2, revisando a base de clientes antes de eliminar o fallback.
  • Imprima o HSTS com prazo progressivo e trate preload como decisão formal de arquitetura, com análise de impacto em todos os subdomínios.
  • Valide a configuração com avaliações externas periódicas e com testes de cadeia após qualquer troca de provedor de certificado.
  • Habilite OCSP stapling e registre handshakes rejeitados, transformando a política de cifras em um número observável de clientes afetados.
  • Proteja a chave privada com restrição de acesso rigorosa, e considere certificados com ECDSA, que oferecem o mesmo nível de segurança com chaves menores e handshakes mais rápidos.