Теперь официально: TLS 1.3 признан стандартом

    Ранее мы писали, что Инженерный совет Интернета (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

    ИТ-ГРАД

    214,00

    vmware iaas provider

    Поделиться публикацией
    Комментарии 33
      –1
      О, наконец. Добавить в конфиг nginx только осталось.
        0
        Хм. Нет поддержки 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
          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
            Хм. Логично. Хотя у меня nginx из их же репозитория. Сейчас посмотрю, может оно еще в mainline не упало.
            UPD. Не упало. Видимо пока руками собирать.
              0

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

                +5
                Ну это ж пакет надо собирать) А мне лень. Пока соберусь его сделать — уже выйдет готовый.
                  +1
                  Переходи на докер!
                  Или генту xD
              0
              Я пытался nginx с TLSv1.3 заставить работать, с OpenSSL 1.1.1 собирал, но у меня оно так и не завелось почему то.
              В браузерах, в частности в Firefox ,TLSv1.3 все еще по умолчанию выключен. А в Waterfox у меня его вообще включить не получилось, соответствующая настройка просто ни на что не влияет и соединение продолжает устанавливаться с TLSv1.2.
              Вобщем до массового распространения, похоже, еще далеко.
              +1

              У меня на 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
                Странно. Nginx-full имеет в базе собранный по-другому пакет?
                UPD. В этом репозитории нет пакета nginx-full. Только nginx. Покажи apt policy для nginx и nginx-full
                  –1
                  Странно. 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
                    Все интереснее) А можно еще попросить выхлоп nginx -V?
                      –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>
                        0
                        Подожди. Так у тебя старый openssl. Он не должен поддерживать TLSv1.3
                          0
                          Так. Судя по всему самый свежий релиз openssl — OpenSSL_1_1_1-pre8. То есть в продакшен он не вышел. Автоматом с ним пакеты еще никто не собирал из официальных репозиториев. В твоем варианте сразу две проблемы. Для TLS 1.3 нужен nginx >1.15 и openssl 1.1.1. А судя по выгрузке оба раза мимо. Ты уверен насчет поддержки?
                            0
                            Каюсь, был неправ. Действительно, nginx перестал ругаться на опцию «TLSv1.3» (он её понимает с 1.13 — линк), но фактичеки вебсервер так его и не использует. Печаль.
                    0
                    По идее более свежие версии — это mainline. Например эти:
                    ppa:nginx/development
                    Хотя у меня репы официальные стоят.
                  +8
                  Не хватает хотя бы краткого писание основных плюсов по сравнению с 1.2

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

                    Инфа 100%? Я видел, что не ввели это.
                      0
                      Перепроверил. Увы. Похоже реально в статусе драфта застряло. Тогда верим надеемся и ждем.
                      0
                      >Прощайте статусные строки «Устанавливается ssl соединение» висящие нереально долгое время.

                      А где вы такое наблюдали? Я вот никогда не видел…
                        +1
                        Попробуй зайти на сайт через 3G или ADSL и сам увидишь.
                        0

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


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

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

                          С 1.3 все еще хуже. Клиенты не поддерживающие его будут массово встречаться еще много-много лет еще. Ставить принудительно не ниже нельзя.
                          0
                          Шифрование ГОСТ смеется в сторонке, Привет Яровой и Роскомнадзору!

                          news.yandex.ru/yandsearch?lr=213&cl4url=ria56.ru%2Fposts%2Frossiyan-perevedut-na-odobrennye-fsb-sim-karty.htm&from=search

                          Закон уже есть, а под него можно хоть интернет в России выключить.
                          Так, что если в Кремле захотят никакой TLS 1.3 не спасет.
                          0
                          ряд его вариаций, которые будут выпускаться каждые шесть недель

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

                              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
                                0
                                rpm. Не для Debian-based. По трудоемкости что пересобирать, что пакет конвертировать. Но все равно спасибо.
                                0
                                Ожидается, что общая безопасность в сети после внедрения TLS 1.3 значительно вырастет. А поспособствовать массовому распространению должны будут библиотеки, упрощающие развертывание новой версии протокола.

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

                                  –1
                                  Вот насчет «либо есть, либо нет» я бы не согласился. Иначе бы не было отдельной дисциплины «информационная безопасность» и ряда специалистов по ней. Безопасность это скорее не дискретная величина с «есть» — «нет», а аналоговая, с поиском баланса между затратами на нее и потенциальными рисками.

                                  И да, как и с почти любым аналоговым параметром с нормальным распределением, здесь должен в том или ином варианте действовать закон Парето. )
                                    0
                                    Безопасность это скорее не дискретная величина с «есть» — «нет», а аналоговая, с поиском баланса между затратами на нее и потенциальными рисками.

                                    И где этот баланс? Затраты растут

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                Самое читаемое