Индикация имени сервера ( SNI ) — это расширение протокола компьютерной сети Transport Layer Security (TLS), с помощью которого клиент указывает , к какому имени хоста он пытается подключиться, в начале процесса установления связи. [1] Расширение позволяет серверу предоставлять один из нескольких возможных сертификатов на один и тот же IP-адрес и номер TCP-порта и, следовательно, позволяет обслуживать несколько защищенных ( HTTPS ) веб-сайтов (или любую другую службу через TLS) по одному и тому же IP-адресу без требование, чтобы все эти сайты использовали один и тот же сертификат. Это концептуальный эквивалент виртуального хостинга на основе имен HTTP/1.1 , но для HTTPS. Это также позволяет прокси-серверу перенаправлять клиентский трафик на нужный сервер во время установления связи TLS/SSL. Желаемое имя хоста не зашифровано в исходном расширении SNI, поэтому перехватчик может увидеть, какой сайт запрашивается. Расширение SNI было указано в 2003 году в RFC 3546.
До SNI при установлении соединения TLS у клиента не было возможности указать, к какому сайту он пытается подключиться. Следовательно, если на одном сервере размещено несколько сайтов на одном прослушивателе, сервер не сможет узнать, какой сертификат использовать в протоколе TLS. Более подробно, при установлении TLS-соединения клиент запрашивает у веб-сервера цифровой сертификат. Как только сервер отправляет сертификат, клиент проверяет его и сравнивает имя, к которому он пытался подключиться, с именами, включенными в сертификат. Если совпадение происходит, соединение происходит как обычно. Если совпадение не найдено, пользователь может быть предупрежден о несоответствии, и соединение может быть прервано, поскольку несоответствие может указывать на попытку атаки «человек посередине». Однако некоторые приложения позволяют пользователю обходить предупреждение и продолжить соединение, при этом пользователь берет на себя ответственность за доверие к сертификату и, как следствие, к соединению.
Однако может быть сложно – или даже невозможно из-за отсутствия предварительного полного списка всех имен – получить единый сертификат, охватывающий все имена, за которые будет отвечать сервер. Серверу, который отвечает за несколько имен хостов, скорее всего, потребуется предоставить отдельный сертификат для каждого имени (или небольшой группы имен). Можно использовать subjectAltName для включения в один сертификат нескольких доменов, контролируемых одним человеком [2] . Такие «сертификаты унифицированных коммуникаций» необходимо перевыпускать каждый раз при изменении списка доменов.
Виртуальный хостинг на основе имен позволяет размещать несколько имен хостов DNS на одном сервере (обычно веб-сервере) на одном IP-адресе. Для этого сервер использует имя хоста, представленное клиентом как часть протокола (для HTTP имя представлено в заголовке хоста). Однако при использовании HTTPS подтверждение TLS происходит до того, как сервер увидит какие-либо заголовки HTTP. Таким образом, сервер не мог использовать информацию в заголовке хоста HTTP, чтобы решить, какой сертификат предоставить, и поэтому с одного и того же IP-адреса могли обслуживаться только имена, охватываемые одним и тем же сертификатом.
На практике это означало, что HTTPS-сервер мог обслуживать только один домен (или небольшую группу доменов) на каждый IP-адрес для безопасного и эффективного просмотра. Присвоение каждому сайту отдельного IP-адреса увеличивает стоимость хостинга, поскольку запросы на IP-адреса должны быть обоснованы в региональном реестре Интернета, а IPv4-адреса сейчас исчерпаны. Для IPv6 это увеличивает административные издержки из-за наличия нескольких IP-адресов на одной машине, даже если адресное пространство не исчерпано. В результате многие веб-сайты были фактически лишены возможности использовать защищенную связь.
SNI решает эту проблему, заставляя клиента отправлять имя виртуального домена как часть сообщения ClientHello согласования TLS . [3] Это позволяет серверу заранее выбрать правильный виртуальный домен и предоставить браузеру сертификат, содержащий правильное имя. Таким образом, при использовании клиентов и серверов, реализующих SNI, сервер с одним IP-адресом может обслуживать группу доменных имен, для которых непрактично получить общий сертификат.
SNI был добавлен в Интернет -RFC IETF в июне 2003 года посредством RFC 3546, Расширения безопасности транспортного уровня (TLS) . Последней версией стандарта является RFC 6066.
Полезная нагрузка индикации имени сервера не шифруется, поэтому имя хоста сервера, к которому пытается подключиться клиент, видно пассивному перехватчику. Эта слабость протокола использовалась программным обеспечением безопасности для сетевой фильтрации и мониторинга [4] [5] [6] и правительствами для введения цензуры. [7] В настоящее время существует множество технологий, пытающихся скрыть указание имени сервера.
Фронтирование домена — это метод замены желаемого имени хоста в SNI на другое, размещенное на том же сервере или, что чаще, в сети серверов, известной как сеть доставки контента. Когда клиент использует фронтирование домена, он заменяет домен сервера в SNI (незашифрованном), но оставляет его в заголовке хоста HTTP (который зашифрован TLS), чтобы сервер мог обслуживать правильный контент. Фронтинг домена нарушает стандарт, определяющий сам SNI, поэтому его совместимость ограничена (многие службы проверяют, что хост SNI соответствует хосту заголовка HTTP, и отклоняют соединения с SNI, ориентированным на домен, как недействительные). Хотя в прошлом доменное фронтирование использовалось, чтобы избежать государственной цензуры, [8] его популярность снизилась, поскольку крупные поставщики облачных услуг (Google, Amazon AWS и CloudFront) явно запрещают его в своих TOS и имеют против него технические ограничения. [9]
Зашифрованное сообщение Client Hello ( ECH ) — это расширение протокола TLS 1.3 , которое позволяет шифровать все сообщение Client Hello, которое отправляется на ранней стадии согласования TLS 1.3. [10] ECH шифрует полезную нагрузку с помощью открытого ключа, который проверяющая сторона (веб-браузер) должна знать заранее. Это означает, что ECH наиболее эффективен при использовании больших CDN , заранее известных поставщикам браузеров.
Первоначальная версия этого расширения 2018 года называлась Encrypted SNI ( ESNI ) [11] , и ее реализации были развернуты «экспериментальным» способом для устранения риска перехвата домена. [12] [13] [14] В Firefox 85 удалена поддержка ESNI. [15] В отличие от ECH, Encrypted SNI шифрует только SNI, а не весь клиентский Hello. [16] Поддержка этой версии по согласию была включена в Firefox в октябре 2018 года [17] и требовала включения DNS через HTTPS (DoH). [18]
В марте 2020 года ESNI был переработан в расширение ECH после того, как анализ показал, что шифрования только SNI недостаточно. Например, спецификации позволяют расширению Pre-Shared Key содержать любые данные для облегчения возобновления сеанса, даже передачу открытой текстовой копии точно такого же имени сервера, зашифрованной ESNI. Кроме того, для шифрования расширений по одному потребуется зашифрованный вариант каждого расширения, каждое из которых может иметь потенциальные последствия для конфиденциальности, и даже это раскрывает набор рекламируемых расширений. Наконец, реальное развертывание ESNI выявило ограничения совместимости. [19] В марте 2020 года краткое название было ECHO [16] , а в мае 2020 года оно было изменено на ECH. [20]
И ESNI, и ECH совместимы только с TLS 1.3, поскольку они полагаются на KeyShareEntry, который был впервые определен в TLS 1.3. [21] [22] Кроме того, для использования ECH клиент не должен предлагать версии TLS ниже 1.3. [23]
Другой интернет-проект включает параметр для передачи открытых ключей ECH через типы DNS-записей HTTPS и SVCB , что сокращает процесс установления связи. [24] [25]
В августе 2020 года Великий китайский файрвол начал блокировать трафик ESNI, но при этом разрешал трафик ECH. [26]
В октябре 2020 года российский интернет-провайдер «Ростелеком» и его оператор мобильной связи Tele2 начали блокировать ESNI-трафик. [27] В сентябре того же года российское министерство цензуры Роскомнадзор планировало запретить ряд протоколов шифрования, среди которых были TLS 1.3 и ESNI, которые препятствовали цензуре доступа к веб-сайтам. [28] [29] [30]
В июле 2023 года на собрании IETF117 участники, работающие над ECH, сообщили, что Chrome и Firefox проводят выборочное испытание на 1%, и команда ожидает, что окончательный проект будет представлен на оценку IESG к январю 2024 года .
В сентябре 2023 года Cloudflare начала поддерживать ECH для размещенных доменов. [33]
В октябре 2023 года Mozilla по умолчанию включила ECH в Firefox v118 при условии, что DNS over HTTPS (DoH) также включен [34] [35] для защиты DNS- запросов к записи ресурсов HTTPS от подслушивания в компьютерной сети. [36] В сентябре 2023 года Chromium версии 117 (используемый в Google Chrome , Microsoft Edge , Samsung Internet и Opera ) включил его по умолчанию, а также потребовало развертывания ключей в DNS-записях HTTPS. [37] [38]
В 2004 году проект EdelKey создал патч для добавления TLS/SNI в OpenSSL . [39] В 2006 году этот патч был перенесен в ветку разработки OpenSSL, а в 2007 году он был перенесен обратно в OpenSSL 0.9.8 (впервые выпущен в версии 0.9.8f [40] ). Первые веб-браузеры с поддержкой SNI появились в 2006 году (Mozilla Firefox 2.0, Internet Explorer 7), позже — веб-серверы (Apache HTTP Server в 2009 году, Microsoft IIS в 2012 году).
Чтобы прикладная программа реализовала SNI, используемая ею библиотека TLS должна реализовать его, а приложение должно передать имя хоста в библиотеку TLS. Ситуация еще больше усложняется тем, что библиотека TLS может быть либо включена в прикладную программу, либо быть компонентом базовой операционной системы. По этой причине некоторые браузеры реализуют SNI при работе в любой операционной системе, а другие реализуют его только при работе в определенных операционных системах. [ нужна цитата ]
это расширение TLS версии 1.3 и выше, оно не работает с предыдущими версиями протокола.
Клиент... ДОЛЖЕН предложить согласовать TLS 1.3 или выше.
Сафари: Нет сигнала