Dicas para gerenciar certificados SSL em produção
Gerenciar certificados SSL em produção é uma das tarefas mais críticas para qualquer equipe de infraestrutura. Um certificado expirado pode derrubar um site inteiro, causar prejuízos financeiros e danos à reputação. Este artigo apresenta dicas práticas e estratégias comprovadas para manter seus certificados seguros, atualizados e sempre funcionando.
1. Automação da Renovação de Certificados
A automação é o pilar central do gerenciamento moderno de SSL. O Certbot, cliente oficial da Let's Encrypt, permite renovar certificados sem intervenção manual.
Exemplo de configuração de renovação automática com Certbot:
# Instalação do Certbot no Ubuntu
sudo apt update
sudo apt install certbot python3-certbot-nginx
# Renovação manual de teste
sudo certbot renew --dry-run
# Agendamento no cron (executa duas vezes ao dia)
0 */12 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
Para ambientes que exigem zero downtime, utilize hooks de renovação que recarregam o serviço sem interromper conexões ativas.
Exemplo de systemd timer para renovação:
# /etc/systemd/system/certbot-renew.service
[Unit]
Description=Certbot Renewal
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
# /etc/systemd/system/certbot-renew.timer
[Unit]
Description=Timer for Certbot Renewal
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Monitore a expiração com health checks externos, como o UptimeRobot ou scripts personalizados que disparam alertas quando faltam menos de 30 dias para o vencimento.
2. Validação e Testes de Configuração
Antes de colocar um certificado em produção, valide toda a cadeia de confiança.
Verificação da cadeia de certificados com OpenSSL:
# Conectar e exibir a cadeia completa
openssl s_client -connect exemplo.com:443 -showcerts
# Verificar se o OCSP stapling está funcionando
openssl s_client -connect exemplo.com:443 -status -tlsextdebug
# Testar revogação via CRL
openssl crl -in crl.pem -text -noout
Ferramentas recomendadas para análise profunda:
- SSL Labs (ssllabs.com/ssltest) — análise completa de configuração
- sslyze — scanner de linha de comando para verificação de vulnerabilidades
- testssl.sh — script portátil para testes de segurança
Exemplo de teste com sslyze:
# Instalação via pip
pip install sslyze
# Testar um servidor específico
sslyze --regular exemplo.com:443
3. Gerenciamento de Múltiplos Domínios e SANs
Para ambientes com vários domínios, escolha entre certificados wildcard e certificados com Subject Alternative Names (SANs).
Comparação prática:
# Certificado wildcard (*.exemplo.com)
# Vantagens: cobre todos os subdomínios de primeiro nível
# Desvantagens: não cobre domínios diferentes (exemplo.net)
# Certificado SAN (multi-domínio)
# Vantagens: cobre domínios específicos e diferentes TLDs
# Desvantagens: precisa listar cada domínio explicitamente
Exemplo de geração de CSR com múltiplos SANs:
# Arquivo de configuração OpenSSL (san.cnf)
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
CN = exemplo.com
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = exemplo.com
DNS.2 = www.exemplo.com
DNS.3 = api.exemplo.com
DNS.4 = blog.exemplo.com
Para atualizar SANs sem interromper serviços, gere o novo certificado em paralelo e troque a configuração do servidor web com um reload suave.
4. Segurança na Distribuição e Armazenamento
A chave privada é o ativo mais valioso. Proteja-a com rigor.
Boas práticas de permissões:
# Permissões recomendadas para chave privada
sudo chmod 600 /etc/ssl/private/exemplo.key
sudo chown root:root /etc/ssl/private/exemplo.key
# Certificado público pode ter permissões mais flexíveis
sudo chmod 644 /etc/ssl/certs/exemplo.crt
Para ambientes em nuvem, utilize cofres de segredos:
Exemplo com AWS Secrets Manager:
# Armazenar certificado no Secrets Manager
aws secretsmanager create-secret \
--name "ssl/exemplo.com" \
--secret-string file://certificado.json
# Recuperar e aplicar em deploy automatizado
aws secretsmanager get-secret-value \
--secret-id "ssl/exemplo.com" \
--query SecretString \
--output text | jq -r '.certificate' > /etc/ssl/certs/exemplo.crt
Nunca armazene chaves privadas em repositórios Git, logs de build ou variáveis de ambiente não criptografadas.
5. Monitoramento Contínuo e Alertas
Implemente métricas e alertas para evitar surpresas.
Exemplo de métrica Prometheus para expiração:
# Métrica personalizada via node_exporter textfile
#!/bin/bash
# /usr/local/bin/ssl_expiry.sh
CERT_FILE="/etc/ssl/certs/exemplo.crt"
EXPIRY=$(openssl x509 -enddate -noout -in "$CERT_FILE" | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $NOW_EPOCH) / 86400 ))
echo "ssl_certificate_expiry_days{cert=\"exemplo.com\"} $DAYS_LEFT" > /var/lib/node_exporter/textfile/ssl.prom
Configuração de alerta no Prometheus:
groups:
- name: ssl_alerts
rules:
- alert: SSLCertificateExpiring
expr: ssl_certificate_expiry_days < 30
for: 1h
labels:
severity: warning
annotations:
summary: "Certificado SSL expirando em {{ $value }} dias"
Integre alertas com Slack ou PagerDuty para notificações em tempo real.
6. Estratégias para Ambientes de Alta Disponibilidade
Em clusters com múltiplos servidores, sincronize certificados automaticamente.
Exemplo de sincronização via rsync:
#!/bin/bash
# /usr/local/bin/sync_certs.sh
SOURCE_SERVER="servidor-mestre"
CERT_DIR="/etc/ssl"
rsync -avz --delete \
root@$SOURCE_SERVER:$CERT_DIR/ \
$CERT_DIR/ \
--exclude='private/'
# Recarregar serviços após sincronização
systemctl reload nginx
systemctl reload haproxy
Para Kubernetes, utilize cert-manager para certificados efêmeros:
# Exemplo de Issuer no Kubernetes
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@exemplo.com
privateKeySecretRef:
name: letsencrypt-prod-key
solvers:
- http01:
ingress:
class: nginx
Balanceadores de carga como HAProxy ou Nginx Plus podem centralizar a terminação SSL, simplificando o gerenciamento.
7. Atualização de Protocolos e Cifras
Mantenha-se atualizado com as melhores práticas de segurança.
Configuração segura para Nginx:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
Teste de compatibilidade com clientes legados:
# Simular conexão de um cliente antigo
openssl s_client -connect exemplo.com:443 -tls1_1
# Se falhar, o TLS 1.1 está corretamente desativado
Priorize cifras com Perfect Forward Secrecy (PFS) e autenticação AEAD. Desative TLS 1.0 e 1.1 gradualmente, monitorando logs de erro para identificar clientes incompatíveis.
Gerenciar certificados SSL em produção exige disciplina, automação e monitoramento constante. As práticas descritas neste artigo formam uma base sólida para manter sua infraestrutura segura e confiável. Implemente cada uma delas progressivamente e adapte-as à realidade do seu ambiente.
Referências
- Let's Encrypt - Documentação Oficial do Certbot — Guia completo de instalação, renovação e hooks para automação de certificados SSL.
- SSL Labs - SSL Server Test — Ferramenta gratuita de análise profunda de configuração SSL/TLS de servidores públicos.
- OpenSSL - Documentação de s_client — Referência oficial para uso do comando s_client em testes de conexão SSL.
- Prometheus - Documentação de Alerting Rules — Guia para configuração de regras de alerta, incluindo métricas personalizadas de expiração.
- cert-manager - Documentação para Kubernetes — Tutorial completo para gerenciamento de certificados SSL em clusters Kubernetes com certificados efêmeros.
- HashiCorp Vault - Gerenciamento de Segredos — Documentação sobre uso do Vault para emissão e rotação segura de certificados SSL.
- Mozilla SSL Configuration Generator — Gerador de configurações seguras para Nginx, Apache, HAProxy e outros servidores web.