/ фото Charles Dyer CC
Особенности TLS 1.3
Над обновлением протокола начали работать еще в 2014 году. Неофициально работа над TLS 1.3 закончилась в марте этого года, однако инженерам понадобилось еще несколько месяцев на проведение дополнительных проверок.
Создатели утверждают, что итоговый вариант TLS 1.3 — более безопасный и производительный: в его алгоритмах шифрования закрыты все известные (на сегодняшний день) уязвимости TLS 1.2, а процесс «рукопожатия» проходит в два раза быстрее, чем у предшественника. Разработчики также добавили forward secrecy и новые фичи вроде 0-RTT.
В TLS 1.3 внесли самое большое количество значимых изменений за всю историю протокола. По этой причине некоторые даже предлагали назвать его TLS 2.0.
Теперь, когда новая версия протокола TLS 1.3 (RFC 8446) официально одобрена, осталось реализовать его для всех подключений по сети.
Сложности с реализацией
TLS обладает своеобразной обратной совместимостью. При установлении соединения между клиентом и сервером происходит обмен поддерживаемыми версиями протокола и выбирается та, с которой могут работать обе стороны. Однако эта возможность используется не везде. С появлением TLS 1.3 более 3% серверов с поддержкой TLS 1.2 просто разрывали соединение вместо того, чтобы отправлять клиенту номер поддерживаемой версии.
Похожая проблема возникла с промежуточными узлами (middlebox). Из-за того, что TLS особо не менялся, штуки вроде файрволов, NAT и балансировщиков нагрузки отказались работать с новой версией протокола.
Этот феномен инженеры окрестили оссификацией (окостенение). Тот факт, что некоторые разработчики не используют гибкие возможности протокола, внедрение новых его реализаций затрудняется. В качестве аналогии участники индустрии приводят пример со старой дверью. Если ее долго не трогать, петли ржавеют, и та открывается со скрипом.
/ фото Christopher Sessums CC
Получается, что предыдущий протокол устарел, но внедрить новый по умолчанию не получится. Больше по теме можно почитать, например, в прошлогоднем исследовании от IEEE (PDF).
Решение проблемы нашел Дэвид Бенджамин (David Benjamin), работающий над Chromium. Он предложил замаскировать первое сообщение от клиента, поддерживающего TLS 1.3, под сообщение TLS 1.2. И это сработало: упомянутые 3% серверов перестали разрывать соединение. Для узлов-посредников Кайл Некритц (Kyle Nekritz) из Facebook предложил использовать тот же подход. Это позволило сократить число сбоев на 6,5% в Chrome и на 2% в Firefox.
Чтобы проверить, совместимы ли middlebox’ы с новой версией протокола, можно воспользоваться тестом, разработанным в Cloudflare.
Как упростить внедрение
Как утверждает Эрик Рескорла (Eric Rescorla), один из разработчиков спецификаций для TLS и HTTPS, в целом внедрить TLS 1.3 не так уже и сложно. Инженерный совет старался сделать этот процесс максимально простым. TLS 1.3 использует те же ключи и сертификаты, что и TLS 1.2. Это позволяет клиенту и серверу автоматически устанавливать соединение по TLS 1.3, если они оба поддерживают новую версию протокола.
Кроме того, есть ряд библиотек, которые помогут развернуть протокол быстрее. К примеру, в начале прошлой недели Facebook передали свою библиотеку TLS 1.3 Fizz в open source. Fizz уменьшает латентность при трансляции данных, а также нагрузку на CPU.
Разработчики подготовили руководство, как начать пользоваться Fizz на Ubuntu 16.04 LTS. Оно находится в официальном репозитории на GitHub (там также есть руководство для MacOS).
Сперва нужно установить необходимые зависимости folly и libsodium:
sudo apt-get install g++ cmake libboost-all-dev libevent-dev libdouble-conversion-dev libgoogle-glog-dev libgflags-dev libiberty-dev liblz4-dev liblzma-dev libsnappy-dev make zlib1g-dev binutils-dev libjemalloc-dev libssl-dev pkg-config libsodium-dev
Далее нужно собрать и установить folly:
git clone https://github.com/facebook/folly
mkdir folly/build_ && cd folly/build_
cmake configure ..
make -j $(nproc)
sudo make install
Затем можно переходить к установке Fizz:
cd ../..
git clone https://github.com/facebookincubator/fizz
mkdir fizz/build_ && cd fizz/build_
cmake configure ../fizz
make -j $(nproc)
sudo make install
Помимо Fizz в сети есть и другие библиотеки, например, wolfSSL, GnuTLS или rustls.
Будущее протокола
Чтобы окончательно разрешить проблему с «окостенением» протокола, Дэвид Бенджамин предложил помимо официальной версии стандарта использовать ряд его вариаций, которые будут выпускаться каждые шесть недель (вместе с релизами новых версий Chrome). Таким образом, серверы и промежуточные узлы будут обязаны соблюдать все правила установления соединения, иначе большая часть клиентов не сможет подключаться к сервисам.
За счет этого разработчики надеются избежать возможных сбоев загрузки веб-страниц, а также аналогичных проблем с будущими версиями TLS.
Ожидается, что общая безопасность в сети после внедрения TLS 1.3 значительно вырастет. А поспособствовать массовому распространению должны будут библиотеки, упрощающие развертывание новой версии протокола.
P.S. Другие материалы из нашего блога о корпоративном IaaS:
- Облачные технологии в финансовой сфере: опыт российских компаний
- Что скрывается за термином vCloud Director – взгляд изнутри
- Как разместить 100% инфраструктуры в облаке IaaS-провайдера и не пожалеть об этом
Чем мы занимаемся в ИТ-ГРАД — основные направления:
Виртуальная инфраструктура (IaaS) | PCI DSS хостинг | Облако ФЗ-152
Комментарии (29)
Meklon
18.08.2018 19:48-1Хм. Нет поддержки TLS 1.3
meklon@nexcloud-new:~$ apt policy nginx nginx: Установлен: 1.15.2-1~xenial Кандидат: 1.15.2-1~xenial Таблица версий: *** 1.15.2-1~xenial 500 500 http://nginx.org/packages/mainline/ubuntu xenial/nginx amd64 Packages 100 /var/lib/dpkg/status meklon@nexcloud-new:~$ nginx -V nginx version: nginx/1.15.2 built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9) built with OpenSSL 1.0.2g 1 Mar 2016 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'
nikitasius
18.08.2018 20:29built with OpenSSL 1.0.2g 1 Mar 2016
https://wiki.openssl.org/index.php/TLS1.3
The OpenSSL 1.1.1 release includes support for TLSv1.3
Ничего не мешает собрать с нужной openssl самому.
upd: отщепятки
Meklon
18.08.2018 20:30Хм. Логично. Хотя у меня nginx из их же репозитория. Сейчас посмотрю, может оно еще в mainline не упало.
UPD. Не упало. Видимо пока руками собирать.nikitasius
18.08.2018 20:31Я его (nginx) всегда сам собираю + ставлю нужную openssl если необходимо (и не ломает софт, это камень в сторону mailerq).
Meklon
18.08.2018 20:38+2Ну это ж пакет надо собирать) А мне лень. Пока соберусь его сделать — уже выйдет готовый.
Bonio
20.08.2018 14:39Я пытался nginx с TLSv1.3 заставить работать, с OpenSSL 1.1.1 собирал, но у меня оно так и не завелось почему то.
В браузерах, в частности в Firefox ,TLSv1.3 все еще по умолчанию выключен. А в Waterfox у меня его вообще включить не получилось, соответствующая настройка просто ни на что не влияет и соединение продолжает устанавливаться с TLSv1.2.
Вобщем до массового распространения, похоже, еще далеко.
mwambanatanga
18.08.2018 20:55У меня на 16.04 всё "завелось" после добавления PPA:
sudo apt-add-repository ppa:nginx/stable
с заменой пакета nginx на nginx-full. Правда, в nginx.conf пришлось добавить
include /etc/nginx/modules-enabled/*;
ибо перестали распознаваться geoip, more_headers, dav и пр.
Meklon
18.08.2018 21:27+1Странно. Nginx-full имеет в базе собранный по-другому пакет?
UPD. В этом репозитории нет пакета nginx-full. Только nginx. Покажи apt policy для nginx и nginx-fullmwambanatanga
19.08.2018 06:29Странно. Nginx-full имеет в базе собранный по-другому пакет?
После добавления репы, при apt upgrade у меня высветилось, что устанавливаемая версия nginx тянет за собой десяток мелких зависимостей (вероятно, модулей nginx, вынесенных в отдельные deb-пакеты). Поэтому я заменил его на nginx-full. Вполне может оказаться, что это было лишнее движение и в результате я получил то же самое.
Покажи apt policy для nginx и nginx-full
$ apt policy nginx nginx: Installed: 1.14.0-0+xenial1 Candidate: 1.14.0-0+xenial1 Version table: *** 1.14.0-0+xenial1 500 500 http://ppa.launchpad.net/nginx/stable/ubuntu xenial/main amd64 Packages 500 http://ppa.launchpad.net/nginx/stable/ubuntu xenial/main i386 Packages 100 /var/lib/dpkg/status 1.10.3-0ubuntu0.16.04.2 500 500 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages 500 http://us.archive.ubuntu.com/ubuntu xenial-updates/main i386 Packages 500 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages 500 http://security.ubuntu.com/ubuntu xenial-security/main i386 Packages 1.9.15-0ubuntu1 500 500 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 Packages 500 http://us.archive.ubuntu.com/ubuntu xenial/main i386 Packages
и
$ apt policy nginx-full nginx-full: Installed: 1.14.0-0+xenial1 Candidate: 1.14.0-0+xenial1 Version table: *** 1.14.0-0+xenial1 500 500 http://ppa.launchpad.net/nginx/stable/ubuntu xenial/main amd64 Packages 100 /var/lib/dpkg/status 1.10.3-0ubuntu0.16.04.2 500 500 http://us.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages 500 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 Packages 1.9.15-0ubuntu1 500 500 http://us.archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
Meklon
19.08.2018 12:18-1Все интереснее) А можно еще попросить выхлоп nginx -V?
mwambanatanga
19.08.2018 14:12-1nginx version: nginx/1.14.0 built with OpenSSL 1.0.2g 1 Mar 2016 TLS SNI support enabled configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-ph1UVS/nginx-1.14.0/debian/modules/http-auth-pam --add-dynamic-module=/build/nginx-ph1UVS/nginx-1.14.0/debian/modules/http-dav-ext --add-dynamic-module=/build/nginx-ph1UVS/nginx-1.14.0/debian/modules/http-echo --add-dynamic-module=/build/nginx-ph1UVS/nginx-1.14.0/debian/modules/http-upstream-fair --add-dynamic-module=/build/nginx-ph1UVS/nginx-1.14.0/debian/modules/http-subs-filter</source>
Meklon
19.08.2018 21:22Так. Судя по всему самый свежий релиз openssl — OpenSSL_1_1_1-pre8. То есть в продакшен он не вышел. Автоматом с ним пакеты еще никто не собирал из официальных репозиториев. В твоем варианте сразу две проблемы. Для TLS 1.3 нужен nginx >1.15 и openssl 1.1.1. А судя по выгрузке оба раза мимо. Ты уверен насчет поддержки?
mwambanatanga
20.08.2018 06:32Каюсь, был неправ. Действительно, nginx перестал ругаться на опцию «TLSv1.3» (он её понимает с 1.13 — линк), но фактичеки вебсервер так его и не использует. Печаль.
Meklon
18.08.2018 21:33По идее более свежие версии — это mainline. Например эти:
ppa:nginx/development
Хотя у меня репы официальные стоят.
BugM
19.08.2018 01:38+3Не хватает хотя бы краткого писание основных плюсов по сравнению с 1.2
1. Шифрование SNI. Теперь никто своими грязными ручками не сможет залезть и посмотреть на какой именно домен вы обращаетесь. Привет Яровой и Роскомнадзору!
2. Хендшейк стал требовать в 1.5 раза меньше запросов между клиентом с сервером. Прощайте статусные строки «Устанавливается ssl соединение» висящие нереально долгое время.
3. Удалены все древние и ныне небезопасные алгоритмы. Опять привет Яровой и Роскомнадзору!
4. Добавлена защита от Mitm атаки на даунгрейд версии протокола. Привет сами знаете кому.rogoz
19.08.2018 02:311. Шифрование SNI. Теперь никто своими грязными ручками не сможет залезть и посмотреть на какой именно домен вы обращаетесь. Привет Яровой и Роскомнадзору!
Инфа 100%? Я видел, что не ввели это.BugM
19.08.2018 02:39Перепроверил. Увы. Похоже реально в статусе драфта застряло. Тогда верим надеемся и ждем.
TheGodfather
19.08.2018 03:35>Прощайте статусные строки «Устанавливается ssl соединение» висящие нереально долгое время.
А где вы такое наблюдали? Я вот никогда не видел…
ReklatsMasters
19.08.2018 08:36По идее защиту на даунгрейд можно и 1.2 поставить. Просто настроить сервер на минимальную версию протокола 1.2.
Современные шифры можно также настроить на 1.2: это AEAD (который aes gcm) и ecdhe. И сертификат, желательно, выпустить с использованием ecdsa ключа, а rsa отправить на помойку истории.
BugM
19.08.2018 13:05Те 1.5 клиента на Windows 95 будут очень недовольны.
Для крупных систем это критично.
С 1.3 все еще хуже. Клиенты не поддерживающие его будут массово встречаться еще много-много лет еще. Ставить принудительно не ниже нельзя.
rub_ak
19.08.2018 09:31Шифрование ГОСТ смеется в сторонке, Привет Яровой и Роскомнадзору!
news.yandex.ru/yandsearch?lr=213&cl4url=ria56.ru%2Fposts%2Frossiyan-perevedut-na-odobrennye-fsb-sim-karty.htm&from=search
Закон уже есть, а под него можно хоть интернет в России выключить.
Так, что если в Кремле захотят никакой TLS 1.3 не спасет.
DenMMM
19.08.2018 10:28ряд его вариаций, которые будут выпускаться каждые шесть недель
Это значит, что корпоративные серверы с вэб-мордой так часто придется обновлять?..
vsb
19.08.2018 15:41+1Не понравился этот выкрутас с маскировкой 1.3 под 1.2. Почему все должны подстраиваться под 3% кривых серверов? Если у сервера исчезнет большинство клиентов, он быстро обновится. Надеюсь, в будущих версиях они откажутся от этого хака.
BOPOHA
20.08.2018 10:26FYI: пакеты по теме для C6,7 вот уже полтора года собираются тут
https://copr.fedorainfracloud.org/coprs/vorona/nginx-alpn/
# rpm -q openssl openssl-1.0.2k-12.el7.x86_64 # nginx -V nginx version: nginx/1.15.2 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) built with OpenSSL 1.1.1-pre8 (beta) 20 Jun 2018
Meklon
20.08.2018 14:49rpm. Не для Debian-based. По трудоемкости что пересобирать, что пакет конвертировать. Но все равно спасибо.
saipr
20.08.2018 23:04Ожидается, что общая безопасность в сети после внедрения TLS 1.3 значительно вырастет. А поспособствовать массовому распространению должны будут библиотеки, упрощающие развертывание новой версии протокола.
Мне кажется это гипотетическая безопасность. С точки зрения науки да, разработали новый протокол сосвоими плюсами. И, конечно, его надо использовать. А вопро-то в том, что-такое "значительно вырастет" безопасность. Она либо есть, либо ее нету. И сколько и кому было нанесено ущерба при использовании TLS-1.2? В ответ тишина...
Meklon
О, наконец. Добавить в конфиг nginx только осталось.