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