Ранее мы писали, что Инженерный совет Интернета (IETF) одобрил новую версию TLS — 1.3. На прошлой неделе протокол был признан стандартом. Сегодня — поговорим о его возможностях.


/ фото 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:




Чем мы занимаемся в ИТ-ГРАД — основные направления:

Виртуальная инфраструктура (IaaS) | PCI DSS хостинг | Облако ФЗ-152

Комментарии (29)


  1. Meklon
    18.08.2018 19:35
    -1

    О, наконец. Добавить в конфиг nginx только осталось.


  1. 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'


    1. nikitasius
      18.08.2018 20:29

      built 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: отщепятки


      1. Meklon
        18.08.2018 20:30

        Хм. Логично. Хотя у меня nginx из их же репозитория. Сейчас посмотрю, может оно еще в mainline не упало.
        UPD. Не упало. Видимо пока руками собирать.


        1. nikitasius
          18.08.2018 20:31

          Я его (nginx) всегда сам собираю + ставлю нужную openssl если необходимо (и не ломает софт, это камень в сторону mailerq).


          1. Meklon
            18.08.2018 20:38
            +2

            Ну это ж пакет надо собирать) А мне лень. Пока соберусь его сделать — уже выйдет готовый.


      1. Bonio
        20.08.2018 14:39

        Я пытался nginx с TLSv1.3 заставить работать, с OpenSSL 1.1.1 собирал, но у меня оно так и не завелось почему то.
        В браузерах, в частности в Firefox ,TLSv1.3 все еще по умолчанию выключен. А в Waterfox у меня его вообще включить не получилось, соответствующая настройка просто ни на что не влияет и соединение продолжает устанавливаться с TLSv1.2.
        Вобщем до массового распространения, похоже, еще далеко.


    1. 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 и пр.


      1. Meklon
        18.08.2018 21:27
        +1

        Странно. Nginx-full имеет в базе собранный по-другому пакет?
        UPD. В этом репозитории нет пакета nginx-full. Только nginx. Покажи apt policy для nginx и nginx-full


        1. mwambanatanga
          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
          


          1. Meklon
            19.08.2018 12:18
            -1

            Все интереснее) А можно еще попросить выхлоп nginx -V?


            1. mwambanatanga
              19.08.2018 14:12
              -1

              nginx 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>


              1. Meklon
                19.08.2018 19:34

                Подожди. Так у тебя старый openssl. Он не должен поддерживать TLSv1.3


              1. Meklon
                19.08.2018 21:22

                Так. Судя по всему самый свежий релиз openssl — OpenSSL_1_1_1-pre8. То есть в продакшен он не вышел. Автоматом с ним пакеты еще никто не собирал из официальных репозиториев. В твоем варианте сразу две проблемы. Для TLS 1.3 нужен nginx >1.15 и openssl 1.1.1. А судя по выгрузке оба раза мимо. Ты уверен насчет поддержки?


                1. mwambanatanga
                  20.08.2018 06:32

                  Каюсь, был неправ. Действительно, nginx перестал ругаться на опцию «TLSv1.3» (он её понимает с 1.13 — линк), но фактичеки вебсервер так его и не использует. Печаль.


      1. Meklon
        18.08.2018 21:33

        По идее более свежие версии — это mainline. Например эти:
        ppa:nginx/development
        Хотя у меня репы официальные стоят.


  1. BugM
    19.08.2018 01:38
    +3

    Не хватает хотя бы краткого писание основных плюсов по сравнению с 1.2

    1. Шифрование SNI. Теперь никто своими грязными ручками не сможет залезть и посмотреть на какой именно домен вы обращаетесь. Привет Яровой и Роскомнадзору!
    2. Хендшейк стал требовать в 1.5 раза меньше запросов между клиентом с сервером. Прощайте статусные строки «Устанавливается ssl соединение» висящие нереально долгое время.
    3. Удалены все древние и ныне небезопасные алгоритмы. Опять привет Яровой и Роскомнадзору!
    4. Добавлена защита от Mitm атаки на даунгрейд версии протокола. Привет сами знаете кому.


    1. rogoz
      19.08.2018 02:31

      1. Шифрование SNI. Теперь никто своими грязными ручками не сможет залезть и посмотреть на какой именно домен вы обращаетесь. Привет Яровой и Роскомнадзору!

      Инфа 100%? Я видел, что не ввели это.


      1. BugM
        19.08.2018 02:39

        Перепроверил. Увы. Похоже реально в статусе драфта застряло. Тогда верим надеемся и ждем.


    1. TheGodfather
      19.08.2018 03:35

      >Прощайте статусные строки «Устанавливается ssl соединение» висящие нереально долгое время.

      А где вы такое наблюдали? Я вот никогда не видел…


      1. 45Green
        19.08.2018 12:19
        +1

        Попробуй зайти на сайт через 3G или ADSL и сам увидишь.


    1. ReklatsMasters
      19.08.2018 08:36

      По идее защиту на даунгрейд можно и 1.2 поставить. Просто настроить сервер на минимальную версию протокола 1.2.


      Современные шифры можно также настроить на 1.2: это AEAD (который aes gcm) и ecdhe. И сертификат, желательно, выпустить с использованием ecdsa ключа, а rsa отправить на помойку истории.


      1. BugM
        19.08.2018 13:05

        Те 1.5 клиента на Windows 95 будут очень недовольны.
        Для крупных систем это критично.

        С 1.3 все еще хуже. Клиенты не поддерживающие его будут массово встречаться еще много-много лет еще. Ставить принудительно не ниже нельзя.


    1. 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 не спасет.


  1. DenMMM
    19.08.2018 10:28

    ряд его вариаций, которые будут выпускаться каждые шесть недель

    Это значит, что корпоративные серверы с вэб-мордой так часто придется обновлять?..


  1. vsb
    19.08.2018 15:41
    +1

    Не понравился этот выкрутас с маскировкой 1.3 под 1.2. Почему все должны подстраиваться под 3% кривых серверов? Если у сервера исчезнет большинство клиентов, он быстро обновится. Надеюсь, в будущих версиях они откажутся от этого хака.


  1. BOPOHA
    20.08.2018 10:26

    FYI: пакеты по теме для 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


    1. Meklon
      20.08.2018 14:49

      rpm. Не для Debian-based. По трудоемкости что пересобирать, что пакет конвертировать. Но все равно спасибо.


  1. saipr
    20.08.2018 23:04

    Ожидается, что общая безопасность в сети после внедрения TLS 1.3 значительно вырастет. А поспособствовать массовому распространению должны будут библиотеки, упрощающие развертывание новой версии протокола.

    Мне кажется это гипотетическая безопасность. С точки зрения науки да, разработали новый протокол сосвоими плюсами. И, конечно, его надо использовать. А вопро-то в том, что-такое "значительно вырастет" безопасность. Она либо есть, либо ее нету. И сколько и кому было нанесено ущерба при использовании TLS-1.2? В ответ тишина...