Индикация имени сервера (SNI ) - это расширение компьютера Transport Layer Security (TLS) сетевого протокола, с помощью которого клиент указывает, какое имя хоста он пытается подключиться в начале процесса установления связи. Это позволяет серверу предоставлять несколько сертификатов на одном и том же IP-адресе и номере порта TCP и, следовательно, позволяет использовать несколько безопасных (HTTPS ) веб-сайтов. (или любой другой сервис через TLS), который должен обслуживаться одним и тем же IP-адресом, не требуя, чтобы все эти сайты использовали один и тот же сертификат. Это концептуальный эквивалент HTTP / 1.1 на основе имен виртуальный хостинг, но для HTTPS. Это также позволяет прокси-серверу перенаправлять клиентский трафик на нужный сервер во время установления связи TLS / SSL. Желаемое имя хоста не зашифровано в исходном расширении SNI, поэтому перехватчик может видеть, какой сайт запрашивается.
При установке TLS-соединения клиент запрашивает цифровой сертификат с веб-сервера. Как только сервер отправляет сертификат, клиент изучает его и сравнивает имя, к которому он пытался подключиться, с именами, включенными в сертификат. В случае совпадения соединение продолжается в обычном режиме. Если совпадение не найдено, пользователь может быть предупрежден о несоответствии, и соединение может быть прервано, поскольку несоответствие может указывать на попытку атаки типа «человек посередине». Однако некоторые приложения позволяют пользователю обойти предупреждение, чтобы продолжить соединение, при этом пользователь берет на себя ответственность за доверие к сертификату и, соответственно, к соединению.
Однако может быть сложно - или даже невозможно из-за отсутствия заранее полного списка всех имен - получить единый сертификат, охватывающий все имена, за которые будет отвечать сервер. Серверу, который отвечает за несколько имен хостов, вероятно, потребуется предоставить разные сертификаты для каждого имени (или небольшой группы имен). С 2005 года CAcert проводит эксперименты по различным методам использования TLS на виртуальных серверах. Большинство экспериментов неудовлетворительны и непрактичны. Например, можно использовать subjectAltName для включения нескольких доменов, контролируемых одним человеком, в одном сертификате. Такие «сертификаты унифицированных коммуникаций» необходимо перевыпускать каждый раз при изменении списка доменов.
Виртуальный хостинг на основе имен позволяет размещать несколько имен хостов DNS на одном сервере (обычно веб-сервере) на одном IP-адресе. Для этого сервер использует имя хоста, представленное клиентом как часть протокола (для HTTP имя представлено в заголовке хоста ). Однако при использовании HTTPS квитирование TLS происходит до того, как сервер увидит какие-либо заголовки HTTP. Следовательно, сервер не мог использовать информацию в заголовке узла HTTP, чтобы решить, какой сертификат представить, и поэтому только имена, охватываемые одним и тем же сертификатом, могли обслуживаться с одного и того же IP-адреса.
На практике это означало, что сервер HTTPS мог обслуживать только один домен (или небольшую группу доменов) на каждый IP-адрес для безопасного и эффективного просмотра. Назначение отдельного IP-адреса для каждого сайта увеличивает стоимость хостинга, так как запросы на IP-адреса должны быть обоснованы в региональном интернет-реестре, а IPv4-адреса теперь исчерпаны. Для IPv6 это увеличивает административные издержки за счет наличия нескольких IP-адресов на одной машине, даже если адресное пространство не исчерпано. В результате многие веб-сайты были фактически лишены возможности использовать безопасную связь.
SNI решает эту проблему, заставляя клиента отправлять имя виртуального домена как часть сообщения ClientHello согласования TLS. Это позволяет серверу заранее выбрать правильный виртуальный домен и предоставить браузеру сертификат, содержащий правильное имя. Следовательно, с клиентами и серверами, реализующими SNI, сервер с одним IP-адресом может обслуживать группу доменных имен, для которых нецелесообразно получить общий сертификат.
SNI был добавлен в IETF в Internet RFC в июне 2003 г. через RFC 3546 Расширения безопасности транспортного уровня (TLS). Последняя версия стандарта - RFC 6066.
Полезная нагрузка указания имени сервера не зашифрована, поэтому имя хоста сервера, к которому пытается подключиться клиент, видно пассивному перехватчику. Эта слабость протокола использовалась программным обеспечением безопасности для фильтрации и мониторинга сети, а также правительствами для введения цензуры. В настоящее время существует несколько технологий, пытающихся зашифровать указание имени сервера.
Фронтирование домена - это метод замены желаемого имени хоста в SNI на другое, размещенное на том же сервере или, что чаще, в сети серверов, известной как сеть доставки контента. Когда клиент использует выход на домен, он заменяет домен сервера в SNI (незашифрованный), но оставляет его в заголовке хоста HTTP (который зашифрован TLS), чтобы сервер мог обслуживать правильный контент. Фронтинг домена нарушает стандарт, определяющий сам SNI, поэтому его совместимость ограничена (многие службы проверяют соответствие хоста SNI хосту заголовка HTTP и отклоняют соединения с SNI с выходом в домен как недействительные). Хотя в прошлом использование внешнего интерфейса домена использовалось во избежание правительственной цензуры, его популярность снизилась, поскольку основные облачные провайдеры (Google, Amazon AWS и CloudFront) явно запрещают его в своих УО и имеют технические ограничения.
Зашифрованное приветствие клиента (ECH ) - это расширение протокола TLS, которое обеспечивает шифрование всего сообщения приветствия клиента, которое отправляется на ранней стадии согласования TLS. ECH шифрует полезные данные с помощью открытого ключа, который проверяющей стороне (веб-браузеру) необходимо знать заранее, что означает, что ECH наиболее эффективен с большими CDN, известными поставщикам браузеров заранее.
Первоначальная версия этого расширения 2018 года называлась Encrypted SNI (ESNI ), и ее реализации были развернуты в «экспериментальном» режиме для устранения этого риска перехвата доменов.. В отличие от ECH, зашифрованный SNI зашифровал только SNI, а не все приветствие клиента. Поддержка этой версии была включена в Firefox в октябре 2018 года и требовала включения DNS-over-HTTPS. Он был переработан в текущее расширение в марте 2020 года.
Краткое название было ECHO в марте 2020 года и изменено на ECH в мае 2020 года.
И ESNI, и ECH совместимы только с TLS 1.3, потому что они полагаются на KeyShareEntry, который был впервые определен в TLS 1.3.
В августе 2020 года китайский межсетевой экран начал блокировать трафик ESNI, но при этом все еще разрешал трафик ECH.
В 2004 году проект EdelKey создал патч для добавления TLS / SNI в OpenSSL. В 2006 году этот патч был затем перенесен в ветвь разработки OpenSSL, а в 2007 году он был перенесен на OpenSSL 0.9.8 (впервые выпущен в 0.9.8f).
Чтобы прикладная программа реализовывала SNI, используемая ею библиотека TLS должна реализовывать его, а приложение должно передавать имя хоста в библиотеку TLS. Еще больше усложняет ситуацию то, что библиотека TLS может быть либо включена в прикладную программу, либо быть компонентом базовой операционной системы. Из-за этого некоторые браузеры реализуют SNI при работе в любой операционной системе, а другие реализуют его только при работе в определенных операционных системах.
Программное обеспечение | Тип | Поддерживается | Примечания | Поддерживается с |
---|---|---|---|---|
Alpine (почтовый клиент) | IMAP почтовый клиент | Да | Начиная с версии 2.22 | 2019-02-18 |
Internet Explorer | Веб-браузер | Да | Начиная с версии 7 в Vista (не поддерживается в XP) | 2006 |
Edge | Веб-браузер | Да | Все версии | |
Mozilla Firefox | Веб-браузер | Да | Начиная с версии 2.0 | 2006 |
cURL | Инструмент командной строки и библиотека | Да | Начиная с версии 7.18.1 | 2008 |
Safari | Веб-браузер | Да | Не поддерживается в Windows XP | |
Google Chrome | Веб-браузер | Да | 2010 | |
BlackBerry 10 | Веб-браузер | Да | Поддерживается во всех выпусках BB10 | 2013 |
BlackBerry OS | Веб-браузер | Не поддерживается в 7.1 или более ранних версиях | ||
Windows Mobile | Веб-браузер | Через некоторое время после 6.5 | ||
Android браузер по умолчанию | просмотр веб-страниц r | Да | Honeycomb (3.x) для планшетов и Ice Cream Sandwich (4.x) для телефонов | 2011 |
Firefox для Android | Интернет браузер | Частично | Поддерживается для просмотра. Синхронизация и другие службы не поддерживают SNI | |
wget | Инструмент командной строки | Да | Начиная с версии 1.14 | 2012 |
Nokia Browser для Symbian | Веб-браузер | No | ||
Opera Mobile для Symbian | Веб-браузер | No | Не поддерживается в Series60 | |
Dillo | Веб-браузер | Да | Начиная с версии 3.1 | 2016 |
IBM HTTP Server | Веб-сервер | Да | Начиная с версии 9.0.0 | |
Apache Tomcat | Веб-сервер | Да | Не поддерживается до 8.5 (обратный порт с 9) | |
HTTP-сервер Apache | Веб-сервер | Да | Начиная с версии 2.2.12 | 2009 |
Microsoft IIS | Веб-сервер | Да | Начиная с версии 8 | 2012 |
nginx | Веб-сервер | Да | Начиная с версии 0.5.23 | 2007 |
Jetty | Веб-сервер | Да | Начиная с версии 9.3.0 | 2015 |
HCL Domino | Веб-сервер | Да | Начиная с версии 11.0.1 | 2020 |
Qt | Библиотека | Да | Начиная с версии 4.8 | 2011 |
Сервер Mozilla NSS сторона | Библиотека | No | ||
4-е измерение | Библиотека | No | Не поддерживается в 15.2 или более ранних версиях | |
Java | Библиотека | Да | Начиная с версии 1.7 | 2011 |
ColdFusion / Lucee | Библиотека | Да | ColdFusion с версии 10 с обновлением 18, 11 с обновлением 7, Lucee с версии 4.5.1.019, версия 5.0.0.50 | 2015 |
Erlang | Библиотека | Да | Начиная с версии r17 | 2013 |
Go | Библиотека | Да | Начиная с версии 1.4 | 2011 |
Perl | Библиотека | Да | Начиная с Net: : SSLeay версия 1.50 и IO :: Socket :: SSL версия 1.56 | 2012 |
PHP | Библиотека | Да | Начиная с версии 5.3 | 2014 |
Python | Библиотека | Да | Поддерживается в 2.x с 2.7.9 и 3.x с 3.2 (в ssl , urllib [2] и httplib modules) | 2011 для Python 3.x и 2014 для Python 2.x |
Ruby | Библиотека | Да | Начиная с версии 2.0 (в net / http ) | 2011 |
Hiawatha | Веб-сервер | Да s | Начиная с версии 8.6 | 2012 |
lighttpd | Веб-сервер | Да | Начиная с версии 1.4.24 | 2009 |