Pular para o conteúdo principal

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

TipoCustoValidaçãoDuraçãoRenovação
Let's EncryptGratuitoAutomática90 diasAutomática
Auto-assinadoGratuitoManualPersonalizadoManual
ComercialPagoManual1-2 anosManual

🆓 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

  1. Acesse: https://vpn.bitio.com.br
  2. Settings > SSL Certificate
  3. Upload Certificate: Fazer upload do certificado
  4. 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