У меня есть веб-серверы, на которых работает несколько виртуальных хостов, и я хотел бы, чтобы перехватчики не сообщали, к какому виртуальному хосту обращается клиент. Для решения этой проблемы уже существует расширение TLS: зашифрованный SNI. Я вижу, что Cloudflare поддерживает его на своих серверах, и что в Firefox есть параметр, позволяющий включить его на клиенте. Однако я не могу найти никакой документации о том, как включить это на моих собственных серверах. Как мне это сделать? (Я не привязан к какому-либо конкретному стеку серверов и приму любую рабочую настройку / архитектуру, кроме «поставить ее за Cloudflare».)
Индикация зашифрованного имени сервера (ESNI) все еще является Интернет-проектом, вы не найдете его ни в одной крупной реализации сервера, поскольку он может быть изменен. Фактически, черновая версия, реализованная Firefox, поддерживает draft-ietf-tls-esni-01 что несовместимо с новее черновые версии.
Я опубликовал состояние экосистемы, наблюдаемое в апреле 2019 года. Вот:
- Последняя версия https://tools.ietf.org/html/draft-ietf-tls-esni-03
- OpenSSL ожидает завершения черновика. https://github.com/openssl/openssl/issues/7482
- Firefox + NSS поддерживает draft-01 https://bugzilla.mozilla.org/show_bug.cgi?id=1495120 https://github.com/nss-dev/nss/blob/8a8b92f05d2d/lib/ssl/tls13esni.c
- Cloudflare поддерживает draft-01
- Picotls поддерживает это https://github.com/h2o/picotls/pull/155
- Go crypto / tls не будет поддерживать его, пока ESNI не получит широкого распространения: https://github.com/golang/go/issues/9671#issuecomment-439561672
Как видите, OpenSSL, используемый Nginx и Apache, не поддерживает его. Вы могли бы попытаться построить Кэдди с исправленной библиотекой Go crypto / tls (с использованием это пиар от tls-tris), но со временем это может перестать работать.
Для экспериментирование или в образовательных целях, вы можете использовать esnitool и tris-localserver из tls-tris. Предполагая, что у вас установлен соответствующий набор инструментов Go в Linux или macOS, должно работать что-то вроде этого:
# 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
Это создаст два файла:
/wFsX6klACQA...AAAA=
который вам нужно настроить в DNS. Если вы хотите настроить ESNI для www.example.com
, создайте запись TXT для _esni.www.example.com
с этим /wFsX6klACQA<snip>AAAA=
стоимость. Этот формат соответствует спецификации draft-ietf-tls-esni-01, которая поддерживается Firefox и Cloudflare. Оно делает не используйте последний проект спецификации.Тестовый сервер можно запустить следующим образом:
_dev/tris-localserver/tris-localserver -esni-keys=esni.pub -esni-private=esni.priv
затем настроить Firefox для включения использования ESNI, открыто about:config
и установить network.security.esni.enabled
к истине. Вы также должны включить DNS-over-HTTPS, инструкции для Firefox можно найти на этой странице. Более подробную информацию о каждом предпочтении также можно найти здесь: https://bagder.github.io/TRRprefs/
Эти инструкции могут работать сейчас, но перестанут работать в будущем, поскольку Firefox, вероятно, будет обновлен для поддержки новых черновых версий. Приведенный выше esnitool также жестко кодирует разрешенный набор шифров (AES128-GCM) и алгоритм обмена ключами (X25519). Это отражает параметры, которые использует Cloudflare.
ESNI подразумевает TLS 1.3, поэтому сертификат и его встроенные имена хостов будут зашифрованы. При включенном ESNI и использовании безопасного транспорта DNS, такого как DNS-over-HTTPS (DoH) или DNS-over-TLS (DoT), имя сервера действительно не будет отображаться на проводе, это можно проверить в Wireshark с помощью фильтр, такой как frame contains "wireshark"
при посещении wireshark.org
.
Однако, если на одном IP-адресе размещается только несколько доменов, любой пассивный злоумышленник может догадаться, что вы посещаете один из этих доменов. У крупного оператора, такого как Cloudflare, гораздо больше доменов, где это не проблема.
Поскольку ESNI использует полустатические ключи, компрометация закрытого ключа означает, что любой перехватчик может расшифровать зашифрованное имя сервера. Вот почему ключи ESNI часто меняются, и требуется автоматизация. Cloudflare имеет эту хорошо интегрированную систему, ключи ESNI в DNS и сервисе HTTPS регулярно обновляются.
В заключение, ESNI является многообещающим, но требует поддержки со стороны клиентов (веб-браузеры), DNS-серверов через безопасный транспорт (DoH / DoT) и веб-серверов. Он все еще находится в разработке, и если вы внимательно не следите за его развитием, вам, вероятно, не стоит настраивать его для чего-то, кроме экспериментов.
Предыдущий очень подробный ответ вдохновил на повторное использование tls-tris для создания крошечного обратного прокси-сервера esni, который фактически может завершить TLS 1.3 с помощью ESNI и перенаправить простой трафик на выбранный вами бэкэнд. Это позволяет легко использовать ESNI без какой-либо модификации используемого вами веб-сервера. Исходный код и подробную инструкцию можно найти здесь: esni-rev-proxy