
Tenho servidores Web que executam vários hosts virtuais e gostaria de evitar que bisbilhoteiros informassem qual host virtual um cliente está acessando. Já existe uma extensão TLS para resolver este problema: SNI criptografado. Vejo que o Cloudflare oferece suporte em seus servidores e que o Firefox tem uma configuração para habilitá-lo no cliente. No entanto, não consigo encontrar nenhuma documentação sobre como ativar isso em meus próprios servidores. Como eu faço isso? (Não estou vinculado a nenhuma pilha de servidores específica e aceitarei qualquer configuração/arquitetura funcional que não seja "colocar atrás do Cloudflare".)
Responder1
A indicação de nome de servidor criptografado (ESNI) ainda é um rascunho da Internet, você não o encontrará em nenhuma implementação importante de servidor, pois está sujeito a alterações. Na verdade, a versão preliminar implementada pelo Firefox suportarascunho-ietf-tls-esni-01que é incompatível commais recenteversões preliminares.
Publiquei um status do ecossistema observado em abril de 2019aqui:
- A versão mais recente éhttps://datatracker.ietf.org/doc/html/draft-ietf-tls-esni-03
- OpenSSL está aguardando a conclusão do rascunho.https://github.com/openssl/openssl/issues/7482
- Firefox+NSS suporta rascunho -01https://bugzilla.mozilla.org/show_bug.cgi?id=1495120 https://github.com/nss-dev/nss/blob/8a8b92f05d2d/lib/ssl/tls13esni.c
- Cloudflare suporta rascunho -01
- picotls suporta issohttps://github.com/h2o/picotls/pull/155
- Go crypto/tls não suportará isso até que o ESNI seja amplamente implantado:https://github.com/golang/go/issues/9671#issuecomment-439561672
Como você pode ver, OpenSSL, usado por Nginx e Apache, não oferece suporte. Você poderia tentar construirCaddiecom uma biblioteca Go crypto/tls corrigida (usandoeste PR de tls-tris), mas pode não funcionar com o tempo.
Experimentação
Paraexperimentaçãoou para fins educacionais, você pode usar esnitool e tris-localserver detls-tris. Supondo que você tenha um conjunto de ferramentas Go apropriado instalado no Linux ou macOS, algo assim deve funcionar:
# Get source code and build stuff
git clone https://github.com/cloudflare/tls-tris -b pwu/esni
cd tls-tris
make build-esnitool
(cd _dev/tris-localserver && ../go.sh build -v -i .)
# Generate ESNI key material, valid for 24 hours (one day)
_dev/esnitool/esnitool -validity=24h -esni-keys-file=esni.pub -esni-private-file=esni.key
Ele criará dois arquivos:
- esni.pub - um valor que
/wFsX6klACQA...AAAA=
você deve configurar no DNS. Se desejar configurar ESNI parawww.example.com
, crie um registro TXT_esni.www.example.com
com esse/wFsX6klACQA<snip>AAAA=
valor. Este formato está em conformidade com a especificação draft-ietf-tls-esni-01 compatível com Firefox e Cloudflare. Isso acontecenãouse o rascunho de especificação mais recente. - esni.priv – um arquivo de chave privada, específico para a implementação do teste.
O servidor de teste pode ser iniciado da seguinte forma:
_dev/tris-localserver/tris-localserver -esni-keys=esni.pub -esni-private=esni.priv
Entãoconfigure o Firefox para ativar o uso de ESNI, abra about:config
e defina network.security.esni.enabled
como verdadeiro. Você também deve ativar o DNS sobre HTTPS. As instruções do Firefox podem ser encontradas nessa página. Mais detalhes sobre cada preferência também podem ser encontrados aqui:https://bagder.github.io/TRRprefs/
Essas instruções podem funcionar agora, mas serão interrompidas no futuro, pois o Firefox provavelmente será atualizado para suportar versões de rascunho mais recentes. O esnitool acima também codifica o conjunto de cifras permitido (AES128-GCM) e o algoritmo de troca de chaves (X25519). Isso reflete os parâmetros usados pela Cloudflare.
Observação
ESNI implica TLS 1.3, portanto o certificado e seus nomes de host incorporados serão criptografados. Com ESNI habilitado e usando um transporte DNS seguro, como DNS-over-HTTPS (DoH) ou DNS-over-TLS (DoT), o nome do servidor realmente não será visível na conexão, isso pode ser verificado no Wireshark usando um filtro como frame contains "wireshark"
ao visitar wireshark.org
.
No entanto, se um único IP hospedar apenas alguns domínios, qualquer adversário passivo poderá adivinhar que você está visitando um desses domínios. Uma grande operadora como a Cloudflare tem muito mais domínios onde isso não é um grande problema.
Como a ESNI usa chaves semi-estáticas, o comprometimento da chave privada significa que qualquer bisbilhoteiro pode descriptografar o nome do servidor criptografado. É por isso que as chaves ESNI são frequentemente alternadas e a automação é necessária. Cloudflare tem essas chaves ESNI bem integradas no DNS e o serviço HTTPS é atualizado regularmente.
Para concluir, o ESNI é promissor, mas requer suporte de clientes (navegadores web), servidores DNS através de um transporte seguro (DoH/DoT) e servidores web. Ele ainda está em desenvolvimento e, a menos que você esteja acompanhando de perto seu desenvolvimento, provavelmente não é uma boa ideia configurá-lo para outras coisas além da experimentação.
Responder2
A resposta anterior muito detalhada inspirada na reutilizaçãotls-trispara construir um pequeno proxy reverso esni, que na verdade pode encerrar o TLS 1.3 com ESNI e encaminhar o tráfego simples para o back-end de sua escolha. Isso permite o uso fácil do ESNI sem qualquer modificação do servidor web que você está usando. O código-fonte e instruções detalhadas podem ser encontrados aqui:esni-rev-proxy