Configuração SSL/TLS
Visão Geral
Este guia aborda a configuração de certificados SSL/TLS para o servidor de ferramentas BITIO, incluindo certificados Let's Encrypt gratuitos e configuração de HTTPS para Forgejo e Pritunl.
🔐 Opções de SSL
Certificados Disponíveis
| Tipo | Custo | Validação | Duração | Renovação |
|---|---|---|---|---|
| Let's Encrypt | Gratuito | Automática | 90 dias | Automática |
| Auto-assinado | Gratuito | Manual | Personalizado | Manual |
| Comercial | Pago | Manual | 1-2 anos | Manual |
🆓 Configuração Let's Encrypt (Recomendado)
Pré-requisitos
# Domínio apontando para o servidor
# Exemplo: tools.bitio.com.br -> 3.208.54.208
# Verificar DNS
nslookup tools.bitio.com.br
dig tools.bitio.com.br +short
1. Instalação do Certbot
# Atualizar sistema
sudo apt update
# Instalar Certbot e plugin Nginx
sudo apt install certbot python3-certbot-nginx
# Verificar instalação
certbot --version
2. Configuração de Domínio no Nginx
# Atualizar configuração Nginx para usar domínio
sudo tee /etc/nginx/sites-available/forgejo << 'EOF'
# Forgejo Git Server (HTTP -> HTTPS redirect)
server {
listen 80;
server_name tools.bitio.com.br;
# Redirect all HTTP to HTTPS
return 301 https://$server_name$request_uri;
}
# Forgejo Git Server (HTTPS)
server {
listen 443 ssl http2;
server_name tools.bitio.com.br;
# SSL certificates (will be configured by certbot)
# ssl_certificate /etc/letsencrypt/live/tools.bitio.com.br/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/tools.bitio.com.br/privkey.pem;
# SSL configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# HSTS (optional but recommended)
add_header Strict-Transport-Security "max-age=63072000" always;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Ssl on;
# WebSocket support (for real-time features)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# Pritunl VPN Admin (separate subdomain recommended)
server {
listen 443 ssl http2;
server_name vpn.bitio.com.br;
# SSL certificates (will be configured by certbot)
# ssl_certificate /etc/letsencrypt/live/vpn.bitio.com.br/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/vpn.bitio.com.br/privkey.pem;
# SSL configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
location / {
proxy_pass https://127.0.0.1:9443;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_ssl_verify off; # Pritunl uses self-signed internally
}
}
EOF
# Testar configuração
sudo nginx -t
# Recarregar Nginx
sudo systemctl reload nginx
3. Obter Certificados SSL
# Para Forgejo (tools.bitio.com.br)
sudo certbot --nginx -d tools.bitio.com.br
# Para Pritunl (vpn.bitio.com.br) - opcional, pode usar subdomínio
sudo certbot --nginx -d vpn.bitio.com.br
# Ou ambos de uma vez
sudo certbot --nginx -d tools.bitio.com.br -d vpn.bitio.com.br
4. Configuração Automática de Renovação
# Testar renovação
sudo certbot renew --dry-run
# Verificar timer do systemd (já configurado automaticamente)
sudo systemctl status certbot.timer
# Ou adicionar ao crontab manualmente (opcional)
sudo crontab -e
# Adicionar: 0 12 * * * /usr/bin/certbot renew --quiet
🔒 Configuração Manual com Certificados Auto-Assinados
1. Criar Certificado Auto-Assinado
# Criar diretório para certificados
sudo mkdir -p /etc/ssl/private/bitio
# Gerar chave privada
sudo openssl genrsa -out /etc/ssl/private/bitio/tools.key 2048
# Gerar certificado auto-assinado (válido por 365 dias)
sudo openssl req -new -x509 -key /etc/ssl/private/bitio/tools.key \
-out /etc/ssl/certs/bitio/tools.crt -days 365 -subj "
/C=BR
/ST=Minas Gerais
/L=Vicosa
/O=BITIO
/OU=Tools Server
/CN=tools.bitio.local
/emailAddress=admin@bitio.com.br"
# Definir permissões
sudo chmod 600 /etc/ssl/private/bitio/tools.key
sudo chmod 644 /etc/ssl/certs/bitio/tools.crt
2. Configurar Nginx com Certificado Auto-Assinado
sudo tee /etc/nginx/sites-available/forgejo << 'EOF'
server {
listen 80;
server_name 3.208.54.208 tools.bitio.local;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name 3.208.54.208 tools.bitio.local;
ssl_certificate /etc/ssl/certs/bitio/tools.crt;
ssl_certificate_key /etc/ssl/private/bitio/tools.key;
# SSL configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF
sudo nginx -t && sudo systemctl reload nginx
⚙️ Configuração SSL no Forgejo
1. Atualizar Configuração do Forgejo
# Conectar ao container Forgejo
docker exec -it forgejo bash
# Editar configuração (ou via web interface)
vi /data/gitea/conf/app.ini
# Adicionar/modificar seções:
[server]
PROTOCOL = https
DOMAIN = tools.bitio.com.br
ROOT_URL = https://tools.bitio.com.br/
CERT_FILE = /data/cert/cert.pem
KEY_FILE = /data/cert/key.pem
REDIRECT_OTHER_PORT = true
PORT_TO_REDIRECT = 80
[security]
INSTALL_LOCK = true
2. Montar Certificados no Container
# Atualizar docker-compose.yml do Forgejo
version: "3.8"
services:
forgejo:
image: codeberg.org/forgejo/forgejo:8
container_name: forgejo
environment:
- USER_UID=1000
- USER_GID=1000
- FORGEJO__server__DOMAIN=tools.bitio.com.br
- FORGEJO__server__ROOT_URL=https://tools.bitio.com.br/
- FORGEJO__server__PROTOCOL=https
volumes:
- /mnt/forgejo_data/forgejo/data:/data
- /etc/letsencrypt/live/tools.bitio.com.br:/data/cert:ro # SSL certs
# ... outros volumes
🔐 Configuração SSL no Pritunl
1. Upload de Certificado via Interface Web
- Acesse: https://vpn.bitio.com.br
- Settings > SSL Certificate
- Upload Certificate: Fazer upload do certificado
- Upload Private Key: Fazer upload da chave privada
2. Configuração via CLI
# Copiar certificados para o container
docker cp /etc/letsencrypt/live/vpn.bitio.com.br/fullchain.pem pritunl:/tmp/cert.pem
docker cp /etc/letsencrypt/live/vpn.bitio.com.br/privkey.pem pritunl:/tmp/key.pem
# Configurar via CLI
docker exec pritunl pritunl set app.server_cert /tmp/cert.pem
docker exec pritunl pritunl set app.server_key /tmp/key.pem
# Restart para aplicar
docker restart pritunl
🛡️ Configurações de Segurança Avançadas
1. Configuração SSL Nginx Otimizada
# /etc/nginx/conf.d/ssl-params.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Session Cache
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# Security Headers
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "strict-origin-when-cross-origin";
2. Teste de Configuração SSL
# Testar configuração SSL
sudo nginx -t
# Testar certificados
openssl x509 -in /etc/letsencrypt/live/tools.bitio.com.br/fullchain.pem -text -noout
# Testar SSL online (quando domínio estiver configurado)
# https://www.ssllabs.com/ssltest/
# Teste local
curl -I https://tools.bitio.com.br
curl -I https://vpn.bitio.com.br
🔄 Monitoramento e Manutenção SSL
1. Script de Monitoramento de Certificados
#!/bin/bash
# /home/ubuntu/scripts/ssl-monitor.sh
LOG_FILE="/var/log/ssl-monitor.log"
ALERT_DAYS=30
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# Verificar certificados Let's Encrypt
if [ -d "/etc/letsencrypt/live" ]; then
for domain_dir in /etc/letsencrypt/live/*/; do
domain=$(basename "$domain_dir")
cert_file="$domain_dir/fullchain.pem"
if [ -f "$cert_file" ]; then
expiry_date=$(openssl x509 -enddate -noout -in "$cert_file" | cut -d= -f2)
expiry_timestamp=$(date -d "$expiry_date" +%s)
current_timestamp=$(date +%s)
days_until_expiry=$(( (expiry_timestamp - current_timestamp) / 86400 ))
log "Certificado $domain expira em $days_until_expiry dias"
if [ $days_until_expiry -lt $ALERT_DAYS ]; then
log "ALERTA: Certificado $domain expira em menos de $ALERT_DAYS dias!"
# Enviar email de alerta
echo "Certificado SSL para $domain expira em $days_until_expiry dias" | \
mail -s "BITIO Tools - SSL Certificate Alert" admin@bitio.com.br 2>/dev/null || true
fi
fi
done
fi
2. Renovação Automática com Restart de Serviços
#!/bin/bash
# /home/ubuntu/scripts/ssl-renew.sh
LOG_FILE="/var/log/ssl-renew.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "Iniciando renovação SSL..."
# Renovar certificados
if certbot renew --quiet; then
log "Certificados renovados com sucesso"
# Recarregar Nginx
systemctl reload nginx
log "Nginx recarregado"
# Atualizar certificados no Pritunl se necessário
if [ -f "/etc/letsencrypt/live/vpn.bitio.com.br/fullchain.pem" ]; then
docker cp /etc/letsencrypt/live/vpn.bitio.com.br/fullchain.pem pritunl:/tmp/cert.pem
docker cp /etc/letsencrypt/live/vpn.bitio.com.br/privkey.pem pritunl:/tmp/key.pem
docker exec pritunl pritunl set app.server_cert /tmp/cert.pem
docker exec pritunl pritunl set app.server_key /tmp/key.pem
docker restart pritunl
log "Certificados do Pritunl atualizados"
fi
else
log "ERRO: Falha na renovação dos certificados"
fi
3. Configuração do Cron para SSL
# Adicionar ao crontab
crontab -e
# Verificação diária de certificados às 6:00 AM
0 6 * * * /home/ubuntu/scripts/ssl-monitor.sh
# Renovação semanal aos domingos às 5:00 AM
0 5 * * 0 /home/ubuntu/scripts/ssl-renew.sh
🔍 Troubleshooting SSL
Problemas Comuns
1. Certificado Not Trusted
# Verificar cadeia de certificados
openssl s509 -in /etc/letsencrypt/live/tools.bitio.com.br/fullchain.pem -text -noout
# Testar cadeia completa
curl -I https://tools.bitio.com.br
2. Mixed Content Warnings
# Verificar se todas as URLs internas usam HTTPS
# Atualizar configuração do Forgejo para HTTPS
docker exec forgejo sed -i 's|http://|https://|g' /data/gitea/conf/app.ini
3. Renovação Automática Falhou
# Verificar logs do certbot
sudo journalctl -u certbot.timer
sudo cat /var/log/letsencrypt/letsencrypt.log
# Testar renovação manual
sudo certbot renew --dry-run -v
📋 Checklist SSL
Configuração Inicial
- Domínio configurado apontando para o servidor
- Certbot instalado e configurado
- Certificados obtidos e funcionando
- Nginx configurado para HTTPS
- Redirects HTTP->HTTPS funcionando
- Forgejo configurado para HTTPS
- Pritunl com certificado SSL
Manutenção Regular
- Verificar data de expiração dos certificados
- Testar renovação automática
- Verificar logs de erro SSL
- Validar força da configuração SSL
- Monitorar alertas de certificado
Troubleshooting
- Testar acesso HTTPS em todos os serviços
- Verificar se não há mixed content
- Validar certificados com ferramentas online
- Confirmar que auto-renovação funciona
🔗 Links Úteis
- SSL Labs SSL Test
- Mozilla SSL Configuration Generator
- Let's Encrypt Documentation
- Certbot User Guide