web-dev-qa-db-fra.com

Comment puis-je configurer SNI crypté sur mes propres serveurs?

J'ai des serveurs Web qui exécutent plusieurs hôtes virtuels et je voudrais empêcher les écoutes de dire à quel hôte virtuel un client accède. Il existe déjà une extension TLS pour résoudre ce problème: SNI chiffré. Je vois que Cloudflare le prend en charge sur ses serveurs, et que Firefox a un paramètre pour l'activer sur le client. Cependant, je ne trouve aucune documentation sur la façon d'activer cela sur mes propres serveurs. Comment puis-je faire cela? (Je ne suis pas lié à une pile de serveurs particulière et accepterai toute configuration/architecture de travail autre que "la mettre derrière Cloudflare".)

L'indication de nom de serveur crypté (ESNI) est toujours un brouillon Internet, vous ne le trouverez dans aucune implémentation de serveur majeur car il est susceptible de changer. En fait, la version provisoire implémentée par Firefox prend en charge draft-ietf-tls-esni-01 qui est incompatible avec plus récent versions préliminaires.

J'ai posté un état de l'écosystème comme observé en avril 2019 ici :

Comme vous pouvez le voir, OpenSSL, utilisé par Nginx et Apache, ne le prend pas en charge. Vous pouvez essayer de construire Caddy avec une bibliothèque Go crypto/tls patché (en utilisant ce PR de tls-tris ), mais cela pourrait ne pas fonctionner avec le temps.

Expérimentation

Pour l'expérimentation ou à des fins éducatives, vous pouvez utiliser esnitool et tris-localserver de tls-tris . En supposant que vous ayez une chaîne d'outils Go appropriée installée sur Linux ou macOS, quelque chose comme ça devrait fonctionner:

# 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

Il créera deux fichiers:

  • esni.pub - une valeur telle que/wFsX6klACQA...AAAA= que vous devez configurer dans DNS. Si vous souhaitez configurer ESNI pour www.example.com, créez un enregistrement TXT pour _esni.www.example.com avec ça /wFsX6klACQA<snip>AAAA= valeur. Ce format est conforme à la spécification draft-ietf-tls-esni-01 prise en charge par Firefox et Cloudflare. Il n'utilise pas le dernier projet de spécification.
  • esni.priv - un fichier de clé privée, spécifique à l'implémentation du test.

Le serveur de test peut être démarré comme suit:

_dev/tris-localserver/tris-localserver -esni-keys=esni.pub -esni-private=esni.priv

Puis configurez Firefox pour activer l'utilisation d'ESNI , ouvrez about:config Et mettre network.security.esni.enabled à vrai. Vous devez également activer DNS sur HTTPS également, les instructions de Firefox peuvent être trouvées sur cette page. Plus de détails sur chaque préférence peuvent également être trouvés ici: https://bagder.github.io/TRRprefs/

Ces instructions pourraient fonctionner maintenant, mais s'arrêteront à l'avenir car Firefox sera probablement mis à jour pour prendre en charge les versions les plus récentes. L'esnitool ci-dessus code également en dur la suite de chiffrement autorisée (AES128-GCM) et l'algorithme d'échange de clés (X25519). Cela reflète les paramètres utilisés par Cloudflare.

Remarque

ESNI implique TLS 1.3, donc le certificat et ses noms d'hôtes intégrés seront cryptés. Avec ESNI activé et en utilisant un transport DNS sécurisé tel que DNS sur HTTPS (DoH) ou DNS sur TLS (DoT), le nom du serveur ne sera en effet pas visible sur le câble, cela peut être vérifié dans Wireshark à l'aide d'un filtre tel que frame contains "wireshark" lors de la visite wireshark.org.

Cependant, si une seule adresse IP n'héberge que quelques domaines, tout adversaire passif peut deviner que vous visitez l'un de ces domaines. Un grand opérateur tel que Cloudflare a beaucoup plus de domaines où ce n'est pas vraiment un problème.

Étant donné qu'ESNI utilise des clés semi-statiques, la compromission de la clé privée signifie que tout espion peut décrypter le nom du serveur crypté. C'est pourquoi les clés ESNI sont fréquemment tournées et une automatisation est requise. Cloudflare a cette clé ESNI bien intégrée dans DNS et le service HTTPS est régulièrement mis à jour.

Pour conclure, ESNI est prometteur, mais nécessite le soutien des clients (navigateurs Web), des serveurs DNS sur un transport sécurisé (DoH/DoT) et des serveurs Web. Il est toujours en développement et à moins que vous ne suiviez de près son développement, ce n'est probablement pas une bonne idée de le configurer pour autre chose que l'expérimentation.

11
Lekensteyn

La réponse précédente très détaillée a inspiré la réutilisation tls-tris pour construire un minuscule proxy inverse esni, qui peut en fait terminer TLS 1.3 avec ESNI et transmettre du trafic simple au backend de votre choix. Cela permet d'utiliser facilement ESNI sans aucune modification du serveur Web que vous utilisez. Le code source et les instructions détaillées peuvent être trouvés ici: esni-rev-proxy

2
Ilya Prudnikov