Expect-CT: Segurança e Transparência para Certificados SSL
A segurança de sites é uma preocupação constante para qualquer desenvolvedor ou administrador de sistemas. Em tempos onde ataques online estão cada vez mais sofisticados, é importante garantir que os certificados SSL utilizados estejam devidamente protegidos e em conformidade com as melhores práticas de segurança. Um dos mecanismos que ajudam a manter essa conformidade é o cabeçalho HTTP Expect-CT.
Neste artigo, vamos entender o que é o Expect-CT, para que ele serve e como configurá-lo adequadamente no seu servidor para melhorar a segurança do seu site.
O Que é o Expect-CT?
O Expect-CT é um cabeçalho HTTP que instrui navegadores e clientes a verificarem se o certificado SSL/TLS do servidor está incluído em um registro público de transparência de certificados (CT, ou Certificate Transparency). Esse registro público é um mecanismo que permite monitorar os certificados, ajudando a evitar a emissão de certificados SSL fraudulentos e garantindo que eles sejam utilizados apenas com o conhecimento do proprietário do domínio.
A transparência de certificados é uma maneira de melhorar a segurança e a confiança dos navegadores em relação aos certificados emitidos pelas autoridades certificadoras (CAs). Se um navegador recebe um certificado que não está presente em um log público de transparência, ele pode alertar o usuário ou impedir a navegação no site.
Objetivos
O Expect-CT tem três principais objetivos:
- Proteção Contra Certificados Fraudulentos: Ao usar o Expect-CT, você garante que todos os certificados emitidos para o seu domínio sejam publicamente registrados. Isso dificulta a emissão de certificados falsos ou fraudulentos sem sua permissão.
- Aumentar a Confiança dos Navegadores: Navegadores modernos, como o Google Chrome, utilizam a transparência de certificados como um requisito de segurança. Isso ajuda a prevenir ataques man-in-the-middle (MITM), onde um certificado inválido pode ser utilizado para interceptar o tráfego.
- Mitigação de Ataques de Certificado: Isso garante que qualquer entidade que tentar obter um certificado para o seu domínio precisará torná-lo público. Caso contrário, navegadores que suportam CT rejeitarão o certificado.
Como Funciona o Expect-CT?
O Expect-CT instrui o navegador a realizar uma verificação nos registros de transparência de certificados. Se um certificado válido para o domínio não for encontrado em nenhum log público de CT, o navegador pode:
- Registrar um erro para o administrador do servidor, caso o modo de aplicação (enforcement) não esteja ativado.
- Bloquear a conexão se o modo de aplicação estiver ativado.
Sintaxe do Cabeçalho Expect-CT
O cabeçalho Expect-CT pode ter vários parâmetros. Vamos detalhar cada um deles:
- max-age: Define o tempo (em segundos) que o navegador deve lembrar do requisito Expect-CT. Um valor comum é 86400 segundos (1 dia).
- enforce (opcional): Quando incluído, o navegador será forçado a aplicar a política, bloqueando a conexão se o certificado não estiver em um log público.
- report-uri (opcional): Um URL para onde relatórios de falhas devem ser enviados, caso haja problemas na verificação de CT.
Exemplos de Configuração do Expect-CT
Configuração no Apache
Aqui está um exemplo de como configurar o Expect-CT no seu servidor Apache, atuando como proxy reverso:
1 2 3 4 |
<IfModule mod_headers.c> Header always set Expect-CT "max-age=86400, enforce, report-uri='https://example.com/report'" </IfModule> |
- max-age=86400: Define que o navegador deve lembrar dessa política por um dia (86400 segundos).
- enforce: Força o navegador a aplicar a política de verificação de CT, bloqueando a conexão se o certificado não estiver em um log público de transparência.
- report-uri=’https://example.com/report’: Opcionalmente, você pode especificar um URL para enviar relatórios de falhas de transparência. Esses relatórios ajudam a identificar problemas com a implementação de certificados.
Configuração no Nginx
Para configurar o Expect-CT no Nginx, adicione a seguinte linha ao seu arquivo de configuração:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/ssl/certs/example.crt; ssl_certificate_key /etc/ssl/private/example.key; # Cabeçalho Expect-CT add_header Expect-CT 'max-age=86400, enforce, report-uri="https://example.com/report"'; # Outras configurações de cabeçalho para segurança add_header X-Content-Type-Options "nosniff"; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; location / { proxy_pass http://backend_server; 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 $scheme; } } |
- max-age=86400: Define que o navegador deve lembrar dessa política por um dia (86400 segundos).
- enforce: Força o navegador a aplicar a política de verificação de CT, bloqueando a conexão se o certificado não estiver em um log público de transparência.
- report-uri=”https://example.com/report”: Relatórios de falhas serão enviados para o URL especificado.
- Outras Configurações de Cabeçalho: Foram incluídas outras configurações de cabeçalhos de segurança, como X-Content-Type-Options, X-Frame-Options, e Strict-Transport-Security para aumentar a segurança do site.
Boas Práticas
- Comece Sem enforce:
Primeiro, use o Expect-CT sem o parâmetro enforce para verificar se há problemas com os seus certificados sendo encontrados nos logs de CT. Dessa forma, você pode identificar e corrigir problemas sem risco de quebra do serviço.
- Use report-uri para Monitoramento:
Configurar um report-uri ajuda a ser informado quando algum problema de transparência de certificado ocorre. Assim, é possível corrigir o problema antes que os navegadores bloqueiem o acesso ao seu site.
- Certifique-se de que os Certificados Estão Registrados:
Certifique-se de que seus certificados estão sendo registrados por uma autoridade certificadora confiável que suporte CT.
Conclusão
O uso do cabeçalho Expect-CT é uma excelente maneira de aumentar a segurança do seu site e garantir que seus certificados SSL sejam conhecidos e validados publicamente. Isso não apenas evita ataques com certificados fraudulentos, mas também melhora a confiança dos usuários e dos navegadores no seu site.
Começar sem o modo enforce é uma boa estratégia para garantir que tudo esteja funcionando conforme o esperado. Com o tempo, você pode passar a utilizar o enforce e garantir uma aplicação mais rigorosa dessa política.
Ao garantir que todos os certificados são transparentes e registrados, você está protegendo o seu site e os seus usuários contra possíveis ataques de falsificação de certificados, tornando a experiência de navegação mais segura e confiável.
Se precisar de ajuda para implementar o Expect-CT ou qualquer outra prática de segurança, deixe um comentário abaixo! Estamos aqui para ajudar. 😊
Referências
MDN Web Docs – Expect-CT: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expect-CT
Certificate Transparency – Google: https://www.certificate-transparency.org/
Scott Helme – A New Security Header: Expect-CT: https://scotthelme.co.uk/a-new-security-header-expect-ct/