
У меня есть веб-серверы, на которых запущено несколько виртуальных хостов, и я хотел бы, чтобы перехватчики не могли узнать, к какому виртуальному хосту обращается клиент. Для решения этой проблемы уже есть расширение TLS: зашифрованный SNI. Я вижу, что Cloudflare поддерживает его на своих серверах, и что Firefox имеет настройку для включения его на клиенте. Однако я не могу найти никакой документации о том, как включить это на моих серверах. Как это сделать? (Я не привязан к какому-либо конкретному стеку серверов и приму любую рабочую настройку/архитектуру, кроме «поместить его за Cloudflare».)
решение1
Зашифрованное указание имени сервера (ESNI) все еще является проектом Интернета, вы не найдете его ни в одной крупной реализации сервера, поскольку он может быть изменен. Фактически, проектная версия, реализованная Firefox, поддерживаетчерновик-ietf-tls-esni-01что несовместимо сновеечерновые версии.
Я опубликовал состояние экосистемы, наблюдаемое в апреле 2019 года.здесь:
- Последняя версияhttps://datatracker.ietf.org/doc/html/draft-ietf-tls-esni-03
- OpenSSL ждет завершения черновика.https://github.com/openssl/openssl/issues/7482
- Firefox+NSS поддерживает проект -01https://bugzilla.mozilla.org/show_bug.cgi?id=1495120 https://github.com/nss-dev/nss/blob/8a8b92f05d2d/lib/ssl/tls13esni.c
- Cloudflare поддерживает проект -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 (используяэтот PR от tls-tris), но со временем это может не сработать.
Экспериментирование
Дляэкспериментированиеили в образовательных целях вы можете использовать esnitool и tris-localserver изtls-трис. Если у вас установлен соответствующий набор инструментов 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
Будет создано два файла:
- esni.pub — значение, например,
/wFsX6klACQA...AAAA=
которое вам нужно настроить в DNS. Если вы хотите настроить ESNI дляwww.example.com
, создайте запись TXT для_esni.www.example.com
с этим/wFsX6klACQA<snip>AAAA=
значением. Этот формат соответствует спецификации draft-ietf-tls-esni-01, поддерживаемой Firefox и Cloudflare. Оннетиспользуйте последнюю версию проекта спецификации. - esni.priv — файл закрытого ключа, специфичный для тестовой реализации.
Тестовый сервер можно запустить следующим образом:
_dev/tris-localserver/tris-localserver -esni-keys=esni.pub -esni-private=esni.priv
Затемнастроить Firefox для включения использования ESNI, откройте about:config
и установите network.security.esni.enabled
значение true. Вам также необходимо включить 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) и веб-серверов. Он все еще находится в разработке, и если вы не следите за его развитием, то, скорее всего, не стоит настраивать его для чего-то, кроме экспериментов.
решение2
Предыдущий очень подробный ответ вдохновил на повторное использованиеtls-трисдля создания крошечного обратного прокси-сервера esni, который на самом деле может завершать TLS 1.3 с ESNI и пересылать обычный трафик на бэкенд по вашему выбору. Это позволяет легко использовать ESNI без какой-либо модификации используемого вами веб-сервера. Исходный код и подробную инструкцию можно найти здесь:esni-rev-прокси