Pular para o conteúdo principal

Configuração HTTPS

Este guia explica como configurar HTTPS para proteger o PCH-SIG em produção.

Por que HTTPS?

  • Criptografia: Os dados são criptografados em trânsito
  • Autenticação: Verifica a identidade do servidor
  • Integridade: Protege contra modificações
  • Conformidade: Necessário para dados sensíveis

Arquitetura

Com reverse proxy

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│ Cliente │────▶│ Nginx HTTPS │────▶│ Aplicação │
│ (Browser) │ │ (Terminação) │ │ (HTTP local) │
│ │ │ :443 │ │ :3000, :8000 │
└─────────────────┘ └─────────────────┘ └─────────────────┘

O reverse proxy Nginx gerencia o HTTPS e encaminha as requisições em HTTP para os contêineres internos.


Obter um certificado

Certificado Let's Encrypt (recomendado)

# Instalar Certbot
apt-get install certbot

# Gerar o certificado
certbot certonly --standalone -d pch-sig.example.com

# Os certificados estão em:
# /etc/letsencrypt/live/pch-sig.example.com/fullchain.pem
# /etc/letsencrypt/live/pch-sig.example.com/privkey.pem

Certificado auto-assinado (desenvolvimento)

# Criar o diretório
mkdir -p deploy/certs

# Gerar o certificado
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout deploy/certs/server.key \
-out deploy/certs/server.crt \
-subj "/CN=localhost"

Certificado empresarial

Contate sua equipe de segurança para obter um certificado assinado por uma autoridade interna.


Configuração Nginx

Arquivo de configuração HTTPS

Arquivo: deploy/nginx-conf/https.conf

# Redirecionamento HTTP para HTTPS
server {
listen 80;
server_name pch-sig.example.com;
return 301 https://$server_name$request_uri;
}

# Configuração HTTPS
server {
listen 443 ssl http2;
server_name pch-sig.example.com;

# Certificados
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;

# Configuração SSL moderna
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 off;

# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;

# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;

# Sessão SSL
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

# Raiz do site
root /usr/share/nginx/html;
index index.html;

# Compressão
gzip on;
gzip_types text/plain text/css application/json application/javascript;

# Frontend SPA
location / {
try_files $uri $uri/ /index.html;
}

# Proxy API
location /api {
proxy_pass http://pch_nginx_backend:80;
proxy_set_header Host $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 https;
}

# Headers de segurança
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
}

Docker Compose

Configuração com HTTPS

# docker-compose.https.yml
version: '3.8'

services:
frontend:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./frontend/build:/usr/share/nginx/html:ro
- ./nginx-conf/https.conf:/etc/nginx/conf.d/default.conf:ro
- ./certs:/etc/nginx/certs:ro
depends_on:
- backend

Iniciar com HTTPS

docker compose -f docker-compose.yml -f docker-compose.https.yml up -d

Renovação automática

Script de renovação

#!/bin/bash
# renew-certs.sh

# Renovar
certbot renew --quiet

# Copiar os certificados
cp /etc/letsencrypt/live/pch-sig.example.com/fullchain.pem /path/to/deploy/certs/
cp /etc/letsencrypt/live/pch-sig.example.com/privkey.pem /path/to/deploy/certs/

# Recarregar Nginx
docker exec pch_frontend nginx -s reload

Cron job

# Adicionar ao crontab
0 0 1 * * /path/to/renew-certs.sh

Configuração backend

Trusted proxies

Arquivo: backend/config/packages/framework.yaml

framework:
trusted_proxies: '%env(TRUSTED_PROXIES)%'
trusted_headers: ['x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto']

Variável de ambiente

# .env
TRUSTED_PROXIES=127.0.0.1,REMOTE_ADDR,172.0.0.0/8

Teste da configuração

Verificar o certificado

# Com openssl
openssl s_client -connect pch-sig.example.com:443 -servername pch-sig.example.com

# Com curl
curl -v https://pch-sig.example.com/

Teste SSL Labs

Use o SSL Labs Server Test para verificar a configuração.

Verificações locais

# Verificar as portas
netstat -tlnp | grep -E "(80|443)"

# Testar o redirecionamento
curl -I http://pch-sig.example.com
# Deve retornar 301 para HTTPS

Content Security Policy

Configuração CSP

add_header Content-Security-Policy "
default-src 'self';
script-src 'self' 'unsafe-inline';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
font-src 'self';
connect-src 'self' https://api.example.com;
frame-ancestors 'none';
" always;

Solução de problemas

Erro de certificado

# Verificar o certificado
openssl x509 -in /path/to/cert.pem -text -noout

# Verificar a cadeia
openssl verify -CAfile /path/to/ca.pem /path/to/cert.pem

Mixed content

Certifique-se de que todos os recursos são carregados em HTTPS:

# Forçar HTTPS para todos os conteúdos
add_header Content-Security-Policy "upgrade-insecure-requests" always;

Erro de proxy

# Verificar os headers
curl -I https://pch-sig.example.com/api/health

# Os headers devem incluir:
# X-Forwarded-Proto: https

Ambiente Windows Server

Configuração PowerShell

# Importar um certificado PFX
$cert = Import-PfxCertificate -FilePath "C:\pch-sig\certs\server.pfx" `
-CertStoreLocation "Cert:\LocalMachine\My" `
-Password (ConvertTo-SecureString -String "password" -AsPlainText -Force)

# Vincular à porta 443
netsh http add sslcert ipport=0.0.0.0:443 certhash=$cert.Thumbprint appid='{00000000-0000-0000-0000-000000000000}'

Proxy HTTPS para Docker

# Redirecionamento HTTPS local para Docker
netsh interface portproxy add v4tov4 listenport=443 listenaddress=0.0.0.0 connectport=443 connectaddress=192.168.99.100

Checklist produção

  • Certificado válido e assinado por uma CA reconhecida
  • Renovação automática configurada
  • HSTS ativado
  • TLS 1.2+ apenas
  • Ciphers seguros
  • OCSP Stapling ativado
  • Headers de segurança configurados
  • Redirecionamento HTTP para HTTPS
  • Teste SSL Labs grau A ou A+

Próximos passos